From 9da78d7dc1e01668202a6ff1648671c23a471fb9 Mon Sep 17 00:00:00 2001 From: egli Date: Mon, 11 Jun 2018 15:41:06 +0200 Subject: [PATCH 001/147] Update version in develop branch --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cbb84e0f..b5adf880 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dacat-api", - "version": "2.7.0", + "version": "2.8.0", "main": "server/server.js", "scripts": { "lint": "eslint common/models", From f620baa601ba253a8cc5e52308fe71847b47ccf5 Mon Sep 17 00:00:00 2001 From: egli Date: Wed, 13 Jun 2018 13:54:15 +0200 Subject: [PATCH 002/147] Upgraded to latest loopback package version and linked packages --- common/models/dataset.js | 60 +- package-lock.json | 10811 ++++++++++++++++++------------------- package.json | 101 +- test/Dataset.js | 4 +- 4 files changed, 5402 insertions(+), 5574 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 49b866dc..fad151ae 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -160,7 +160,14 @@ module.exports = function(Dataset) { Object.keys(fields).map(function(key) { if (facets.indexOf(key) < 0) { if (key === "text") { - match["$or"] = [{$text: searchExpression(key, fields[key])},{sourceFolder: {$regex: fields[key], $options:'i'}}] + match["$or"] = [{ + $text: searchExpression(key, fields[key]) + }, { + sourceFolder: { + $regex: fields[key], + $options: 'i' + } + }] } else if (key === "userGroups") { if (fields[key].length > 0) match["ownerGroup"] = searchExpression(key, fields[key]) @@ -208,11 +215,13 @@ module.exports = function(Dataset) { Dataset.getDataSource().connector.connect(function(err, db) { var collection = db.collection('Dataset'); var res = collection.aggregate(pipeline, - function(err, res) { - if (err) { - console.log("Facet err handling:", err); - } - cb(err, res); + function(err, cursor) { + cursor.toArray(function(err, res) { + if (err) { + console.log("Facet err handling:", err); + } + cb(err, res); + }); }); }); }; @@ -234,7 +243,14 @@ module.exports = function(Dataset) { Object.keys(fields).map(function(key) { if (fields[key] && fields[key] !== 'null') { if (key === "text") { - match["$or"] = [{$text: searchExpression(key, fields[key])},{sourceFolder: {$regex: fields[key], $options:'i'}}] + match["$or"] = [{ + $text: searchExpression(key, fields[key]) + }, { + sourceFolder: { + $regex: fields[key], + $options: 'i' + } + }] } else if (key === "ownerGroup") { // ownerGroup is handled in userGroups parts } else if (key === "userGroups") { @@ -285,7 +301,10 @@ module.exports = function(Dataset) { } }) pipeline.push({ - $unwind: {path: "$datasetlifecycle", preserveNullAndEmptyArrays: true} + $unwind: { + path: "$datasetlifecycle", + preserveNullAndEmptyArrays: true + } }) if (Object.keys(matchJoin).length > 0) { @@ -326,18 +345,21 @@ module.exports = function(Dataset) { Dataset.getDataSource().connector.connect(function(err, db) { var collection = db.collection('Dataset'); var res = collection.aggregate(pipeline, - function(err, res) { - if (err) { - console.log("Facet err handling:", err); - } - // console.log("Query result:", res) - // rename _id to pid - res.map(ds => { - Object.defineProperty(ds, 'pid', Object.getOwnPropertyDescriptor(ds, '_id')); - delete ds['_id'] - }) - cb(err, res); + function(err, cursor) { + cursor.toArray(function(err, res) { + if (err) { + console.log("Facet err handling:", err); + } + // console.log("Query result:", res) + // rename _id to pid + res.map(ds => { + Object.defineProperty(ds, 'pid', Object.getOwnPropertyDescriptor(ds, '_id')); + delete ds['_id'] + }) + cb(err, res); + }); }); + }); }; diff --git a/package-lock.json b/package-lock.json index fbe877fa..e635fba0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5650 +1,5453 @@ { - "name": "dacat-api", - "version": "2.6.3", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@mean-expert/loopback-sdk-builder": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@mean-expert/loopback-sdk-builder/-/loopback-sdk-builder-2.1.0.tgz", - "integrity": "sha512-GCnXhJYAOljY/i8VhGHDggz6LUU7HjzXq18EUR4mJ6+92fxmGJuW9EWvQ40oGq8k2SbxUe49z/OJkNulP0DsnA==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "ejs": "1.0.0", - "extfs": "0.0.7", - "mkdirp": "0.5.1", - "optimist": "0.6.1", - "rimraf": "2.6.2", - "semver": "5.4.1", - "underscore": "1.8.3", - "underscore.inflections": "0.2.1" - }, - "dependencies": { - "ejs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-1.0.0.tgz", - "integrity": "sha1-ycYKSKRu5FL7MqccMXuV5aofyz0=", - "dev": true + "name": "dacat-api", + "version": "2.8.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@kyleshockey/object-assign-deep": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@kyleshockey/object-assign-deep/-/object-assign-deep-0.4.2.tgz", + "integrity": "sha1-hJAPDu/DcnmPR1G1JigwuCCJIuw=" + }, + "@mean-expert/loopback-sdk-builder": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@mean-expert/loopback-sdk-builder/-/loopback-sdk-builder-2.3.1.tgz", + "integrity": "sha512-BXiHakkGNCu5NXm+ZLmfqfa/rmYaAHqBItA5nyL7XxRiBdiL6m106eU7QOMts4Hg/A3qU1wy9jy/R+BCqJUjlQ==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "ejs": "1.0.0", + "extfs": "0.0.7", + "mkdirp": "0.5.1", + "optimist": "0.6.1", + "rimraf": "2.6.2", + "rxjs": "5.5.11", + "semver": "5.5.0", + "underscore": "1.9.1", + "underscore.inflections": "0.2.1" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "ejs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-1.0.0.tgz", + "integrity": "sha1-ycYKSKRu5FL7MqccMXuV5aofyz0=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "dev": true + } + } }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - } - } - }, - "@types/body-parser": { - "version": "1.16.8", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz", - "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==", - "requires": { - "@types/express": "4.11.0", - "@types/node": "7.0.52" - } - }, - "@types/express": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.0.tgz", - "integrity": "sha512-N1Wdp3v4KmdO3W/CM7KXrDwM4xcVZjlHF2dAOs7sNrTUX8PY3G4n9NkaHlfjGFEfgFeHmRRjywoBd4VkujDs9w==", - "requires": { - "@types/body-parser": "1.16.8", - "@types/express-serve-static-core": "4.11.0", - "@types/serve-static": "1.13.1" - } - }, - "@types/express-serve-static-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.0.tgz", - "integrity": "sha512-hOi1QNb+4G+UjDt6CEJ6MjXHy+XceY7AxIa28U9HgJ80C+3gIbj7h5dJNxOI7PU3DO1LIhGP5Bs47Dbf5l8+MA==", - "requires": { - "@types/node": "7.0.52" - } - }, - "@types/ldapjs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.2.tgz", - "integrity": "sha512-FQuKc2oBPbooONOLoNAmHSgX68RB7USl1WrDCNuHfJ92+8JzHUEdQll2BC5AXf1eXliBzs8y4kpqXZV3fu/hPw==", - "requires": { - "@types/node": "7.0.52" - } - }, - "@types/mime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" - }, - "@types/node": { - "version": "7.0.52", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.52.tgz", - "integrity": "sha512-jjpyQsKGsOF/wUElNjfPULk+d8PKvJOIXk3IUeBYYmNCy5dMWfrI+JiixYNw8ppKOlcRwWTXFl0B+i5oGrf95Q==" - }, - "@types/passport": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-0.3.5.tgz", - "integrity": "sha512-J7mdY1nnhjdbkXT84S3WsyrTtDf2KqUJ9JW3Y9vxA5GuXlejIuvwHw9A2TdNklAqPG2Q0TWqlsA2a2GIeV1jYA==", - "requires": { - "@types/express": "4.11.0" - } - }, - "@types/serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==", - "requires": { - "@types/express-serve-static-core": "4.11.0", - "@types/mime": "2.0.0" - } - }, - "JSONStream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.0.3.tgz", - "integrity": "sha1-coVEGJQ4t7ndIYQ5JYGGHrq9liE=", - "requires": { - "jsonparse": "1.0.0", - "through": "2.3.8" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - }, - "dependencies": { - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + "@types/body-parser": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", + "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", + "requires": { + "@types/connect": "3.4.32", + "@types/node": "7.0.65" + } }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - } - } - }, - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - } - } - }, - "addressparser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=" - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "amqp-stats": { - "version": "https://github.com/fullcube/node-amqp-stats/tarball/fe86722fd278067969f03addde57ed53f0910cd8", - "integrity": "sha512-Pejhw8qdugieqO9XPBLshn6yQP9Y+CehOX1ZmBBvGywfZb7LeV8cRMWBud0CVd1likYqd72tgTy8Ky/S7k6jZA==", - "requires": { - "qs": "6.4.0", - "request": "2.81.0" - } - }, - "amqplib": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", - "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", - "requires": { - "bitsyntax": "0.0.4", - "bluebird": "3.5.0", - "buffer-more-ints": "0.0.2", - "readable-stream": "1.1.14", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "@types/connect": { + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", + "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "requires": { + "@types/node": "7.0.65" + } }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } + "@types/events": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" + }, + "@types/express": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz", + "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==", + "requires": { + "@types/body-parser": "1.17.0", + "@types/express-serve-static-core": "4.16.0", + "@types/serve-static": "1.13.2" + } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" - }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "are-we-there-yet": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", - "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-index": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", - "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", - "requires": { - "debug": "2.2.0", - "es6-symbol": "3.1.1" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "requires": { - "lodash": "4.17.4" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2.3" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.2.tgz", - "integrity": "sha1-R0IRyV5s8qVH20YeT2d4tR0I+mU=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "requires": { - "buffers": "0.1.1", - "chainsaw": "0.1.0" - } - }, - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" - }, - "bitsyntax": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", - "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", - "requires": { - "buffer-more-ints": "0.0.2" - } - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "2.3.3" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "2.0.3" - } - }, - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" - }, - "bluebird-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bluebird-defer/-/bluebird-defer-1.0.0.tgz", - "integrity": "sha1-PqDhnzJoXs+4JCE1Q9qtA4wsovU=" - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } + "@types/express-serve-static-core": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", + "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", + "requires": { + "@types/events": "1.2.0", + "@types/node": "7.0.65", + "@types/range-parser": "1.2.2" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "@types/ldapjs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.3.tgz", + "integrity": "sha512-FSj24s1WsFEfOy8taIKp2DokSZfFkjWYZb88AS5eDj3WTocZ+4DnHjhzrXEs048WQ5mfOLJXMOAnc0kSnHh5Lw==", + "requires": { + "@types/events": "1.2.0", + "@types/node": "7.0.65" + } }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - } - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "bops": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bops/-/bops-1.0.0.tgz", - "integrity": "sha1-YxqJKPEXhBfrb3Bs9prNteWk6q0=", - "requires": { - "base64-js": "1.0.2", - "to-utf8": "0.0.1" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "bson": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", - "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" - }, - "btoa": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.1.2.tgz", - "integrity": "sha1-PkC4FmP4HS3WWWpMtxSo3BbPq+A=" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-more-ints": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", - "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=" - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" - }, - "buffermaker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffermaker/-/buffermaker-1.2.0.tgz", - "integrity": "sha1-u3MlLsCIK3Y56bVWuCnav8LK4bo=", - "requires": { - "long": "1.1.2" - } - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - }, - "buildmail": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", - "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", - "requires": { - "addressparser": "1.0.1", - "libbase64": "0.1.0", - "libmime": "3.0.0", - "libqp": "1.1.0", - "nodemailer-fetch": "1.6.0", - "nodemailer-shared": "1.1.0", - "punycode": "1.4.1" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "bunyan": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", - "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", - "requires": { - "dtrace-provider": "0.8.5", - "moment": "2.20.1", - "mv": "2.1.1", - "safe-json-stringify": "1.0.4" - }, - "dependencies": { - "dtrace-provider": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.5.tgz", - "integrity": "sha1-mOu6Ihr6xG4cOf02hY2Pk2dSS5I=", - "optional": true, - "requires": { - "nan": "2.8.0" - } + "@types/mime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", + "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" + }, + "@types/node": { + "version": "7.0.65", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.65.tgz", + "integrity": "sha512-iUdyWWikcQnGvIZnYh5ZxnxeREykndA9+iGdo068NGNutibWknDjmmNMq/8cnS1eaTCcgqJsPsFppw3XJWNlUg==" + }, + "@types/passport": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-0.3.5.tgz", + "integrity": "sha512-J7mdY1nnhjdbkXT84S3WsyrTtDf2KqUJ9JW3Y9vxA5GuXlejIuvwHw9A2TdNklAqPG2Q0TWqlsA2a2GIeV1jYA==", + "requires": { + "@types/express": "4.16.0" + } }, - "moment": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", - "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==", - "optional": true - } - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" - }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" - }, - "canonical-json": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/canonical-json/-/canonical-json-0.0.4.tgz", - "integrity": "sha1-ZXnAcsPbXEd+xB3JePvyuPQQdKM=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "1.0.2", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.5" - } - }, - "chai-http": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz", - "integrity": "sha1-VGDYA24fGhKwtbXL1Snm3B0x60s=", - "dev": true, - "requires": { - "cookiejar": "2.0.6", - "is-ip": "1.0.0", - "methods": "1.1.2", - "qs": "6.4.0", - "superagent": "2.3.0" - }, - "dependencies": { - "cookiejar": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", - "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", - "dev": true - } - } - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "requires": { - "traverse": "0.3.9" - }, - "dependencies": { - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - } - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "circular-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", - "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-1.3.2.tgz", - "integrity": "sha1-io8w7GcKb91kr1LxkUuQfXnq1bU=", - "requires": { - "keypress": "0.1.0" - } - }, - "commondir": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", - "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "compressible": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", - "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", - "requires": { - "mime-db": "1.32.0" - }, - "dependencies": { - "mime-db": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.32.0.tgz", - "integrity": "sha512-+ZWo/xZN40Tt6S+HyakUxnSOgff+JEdaneLWIm0Z6LmpCn5DMcZntLyUY5c/rTDog28LhXLKOUZKoTxTCAdBVw==" - } - } - }, - "compression": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", - "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", - "requires": { - "accepts": "1.3.4", - "bytes": "3.0.0", - "compressible": "2.0.12", - "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } + "@types/range-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.2.tgz", + "integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==" + }, + "@types/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", + "requires": { + "@types/express-serve-static-core": "4.16.0", + "@types/mime": "2.0.0" + } + }, + "JSONStream": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", + "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==", + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accept-language": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/accept-language/-/accept-language-3.0.18.tgz", + "integrity": "sha1-9QJfF79lpGaoRYOMz5jNuHfYM4Q=", + "requires": { + "bcp47": "1.1.2", + "stable": "0.1.8" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", + "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==" + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + } + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-security-policy-builder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-1.1.0.tgz", - "integrity": "sha1-2R8bB2I2wRmFDH3umSS/VeBXcrM=", - "requires": { - "dashify": "0.2.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", - "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", - "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" - } - }, - "cross-fetch": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-0.0.8.tgz", - "integrity": "sha1-Ae2U3EB98sAPGAf95wCnz6SKIFw=", - "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.41" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "dasherize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", - "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" - }, - "dashify": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dashify/-/dashify-0.2.2.tgz", - "integrity": "sha1-agdBWgHJH69KMuONnfunH2HLIP4=" - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "4.0.5" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "dns-prefetch-control": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", - "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" - } - } - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" - }, - "domhandler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", - "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } - }, - "dont-sniff-mimetype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", - "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" - }, - "dtrace-provider": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.7.1.tgz", - "integrity": "sha1-wGswjy8Q1dWDiuycVx5dWI3HHQQ=", - "optional": true, - "requires": { - "nan": "2.8.0" - } - }, - "duplex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/duplex/-/duplex-1.0.0.tgz", - "integrity": "sha1-arxcFuwX5MV4V4cnEmcAWQ06Ldo=" - }, - "duplexer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.0.4.tgz", - "integrity": "sha1-r8t/H4uNdPggcmFx1dZKyeSo/yA=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" - }, - "encode-3986": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/encode-3986/-/encode-3986-1.0.0.tgz", - "integrity": "sha1-lA1RSY+HQa3hhLda0UObMXwMemA=" - }, - "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.19" - } - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" - }, - "es5-ext": { - "version": "0.10.41", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.41.tgz", - "integrity": "sha512-MYK02wXfwTMie5TEJWPolgOsXEmz7wKCQaGzgmRjZOoV6VLG8I5dSv2bn6AOClXhK64gnSQTQ9W9MKvx87J4gw==", - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.41", - "es6-symbol": "3.1.1" - } - }, - "es6-promise": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.41" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", - "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", - "dev": true, - "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.22.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.1", - "espree": "3.5.2", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" - }, - "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + }, + "amqp-stats": { + "version": "https://github.com/fullcube/node-amqp-stats/tarball/fe86722fd278067969f03addde57ed53f0910cd8", + "integrity": "sha512-Pejhw8qdugieqO9XPBLshn6yQP9Y+CehOX1ZmBBvGywfZb7LeV8cRMWBud0CVd1likYqd72tgTy8Ky/S7k6jZA==", + "requires": { + "qs": "6.5.2", + "request": "2.87.0" + } + }, + "amqplib": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", + "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", + "requires": { + "bitsyntax": "0.0.4", + "bluebird": "3.5.1", + "buffer-more-ints": "0.0.2", + "readable-stream": "1.1.14", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "are-we-there-yet": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", + "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "1.0.3" + } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-index": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", + "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", + "requires": { + "debug": "2.6.9", + "es6-symbol": "3.1.1" + } }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "2.0.2" - } + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "1.0.3" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "eslint-config-loopback": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-loopback/-/eslint-config-loopback-8.0.0.tgz", - "integrity": "sha1-8UK8pHEimUoahfGcwhY1EWFrQVI=" - }, - "eslint-import-resolver-node": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", - "requires": { - "debug": "2.2.0", - "object-assign": "4.1.1", - "resolve": "1.3.3" - } - }, - "eslint-module-utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", - "requires": { - "debug": "2.6.8", - "pkg-dir": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-plugin-import": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.2.0", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.2.3", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "pkg-up": "1.0.0" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" - }, - "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", - "dev": true, - "requires": { - "acorn": "5.3.0", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-2.2.2.tgz", - "integrity": "sha1-QH6nHCAgzVdTggOrfnpr3Pt2ktU=" - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "expect-ct": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.0.tgz", - "integrity": "sha1-UnNWeN4YUwiQ2Ne5XwrGNkCVgJQ=" - }, - "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "requires": { + "lodash": "4.17.10" + } }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" - } - }, - "extfs": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/extfs/-/extfs-0.0.7.tgz", - "integrity": "sha1-owgQ5HRZCg280NL0V63IkAnFwKs=", - "dev": true, - "requires": { - "underscore": "1.7.0" - } - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, - "fast-json-patch": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-1.1.8.tgz", - "integrity": "sha1-jbWMnRLD/5wjRW7oEswp+scit3I=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "requires": { - "flat-cache": "1.2.2", - "object-assign": "4.1.1" - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" + } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", - "requires": { - "circular-json": "0.3.1", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "1.0.0-rc4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", - "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", - "requires": { - "async": "1.5.2", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - } - } - }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", - "dev": true - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "frameguard": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", - "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "g11n-pipeline": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/g11n-pipeline/-/g11n-pipeline-2.0.4.tgz", - "integrity": "sha512-qzrK8ZzMgfFDVacgaovTMoj7IjQrFGmPS7xQ6Z/vJ97NXYIh77r2992sKk2xPRy/BJsGCeXbQa/306auz4ayew==", - "requires": { - "swagger-client": "3.4.4" - } - }, - "gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", - "requires": { - "ansi": "0.3.1", - "has-unicode": "2.0.1", - "lodash.pad": "4.5.1", - "lodash.padend": "4.6.1", - "lodash.padstart": "4.6.1" - } - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "requires": { - "function-bind": "1.1.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "helmet": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.9.0.tgz", - "integrity": "sha512-czCyS77TyanWlfVSoGlb9GBJV2Q2zJayKxU5uBw0N1TzDTs/qVNh1SL8Q688KU0i0Sb7lQ/oLtnaEqXzl2yWvA==", - "requires": { - "dns-prefetch-control": "0.1.0", - "dont-sniff-mimetype": "1.0.0", - "expect-ct": "0.1.0", - "frameguard": "3.0.0", - "helmet-csp": "2.6.0", - "hide-powered-by": "1.0.0", - "hpkp": "2.0.0", - "hsts": "2.1.0", - "ienoopen": "1.0.0", - "nocache": "2.0.0", - "referrer-policy": "1.1.0", - "x-xss-protection": "1.0.0" - } - }, - "helmet-csp": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.6.0.tgz", - "integrity": "sha512-n/oW9l6RtO4f9YvphsNzdvk1zITrSN7iRT8ojgrJu/N3mVdHl9zE4OjbiHWcR64JK32kbqx90/yshWGXcjUEhw==", - "requires": { - "camelize": "1.0.0", - "content-security-policy-builder": "1.1.0", - "dasherize": "2.0.0", - "lodash.reduce": "4.6.0", - "platform": "1.3.4" - } - }, - "hide-powered-by": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz", - "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=" - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "hpkp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", - "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" - }, - "hsts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz", - "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==" - }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.1", - "domutils": "1.6.2", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" - } - }, - "http-status": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.0.1.tgz", - "integrity": "sha1-3EMAGov8UKyH1IWokvdXiWS8lKI=" - }, - "httpntlm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", - "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", - "requires": { - "httpreq": "0.4.24", - "underscore": "1.7.0" - } - }, - "httpreq": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", - "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=" - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "ienoopen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz", - "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" - }, - "ignore": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.1.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "requires": { + "precond": "0.2.3" + } }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "bcp47": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bcp47/-/bcp47-1.1.2.tgz", + "integrity": "sha1-NUvjMH/9CEM6ePXh4glYRfifx/4=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "requires": { + "buffers": "0.1.1", + "chainsaw": "0.1.0" + } + }, + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" + }, + "bitsyntax": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", + "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", + "requires": { + "buffer-more-ints": "0.0.2" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "2.3.6", + "safe-buffer": "5.1.1" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.3" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bluebird-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bluebird-defer/-/bluebird-defer-1.0.0.tgz", + "integrity": "sha1-PqDhnzJoXs+4JCE1Q9qtA4wsovU=" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "1.6.16" + } + }, + "bops": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bops/-/bops-1.0.0.tgz", + "integrity": "sha1-YxqJKPEXhBfrb3Bs9prNteWk6q0=", + "requires": { + "base64-js": "1.0.2", + "to-utf8": "0.0.1" + }, + "dependencies": { + "base64-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.2.tgz", + "integrity": "sha1-R0IRyV5s8qVH20YeT2d4tR0I+mU=" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bson": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", + "integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg==" + }, + "btoa": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.1.2.tgz", + "integrity": "sha1-PkC4FmP4HS3WWWpMtxSo3BbPq+A=" + }, + "buffer": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", + "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.12" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + }, + "buffer-more-ints": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", + "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=" + }, + "buffermaker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffermaker/-/buffermaker-1.2.0.tgz", + "integrity": "sha1-u3MlLsCIK3Y56bVWuCnav8LK4bo=", + "requires": { + "long": "1.1.2" + } + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "bunyan": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", + "requires": { + "dtrace-provider": "0.8.7", + "moment": "2.22.2", + "mv": "2.1.1", + "safe-json-stringify": "1.2.0" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "canonical-json": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/canonical-json/-/canonical-json-0.0.4.tgz", + "integrity": "sha1-ZXnAcsPbXEd+xB3JePvyuPQQdKM=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + } + }, + "chai-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz", + "integrity": "sha1-VGDYA24fGhKwtbXL1Snm3B0x60s=", + "dev": true, + "requires": { + "cookiejar": "2.0.6", + "is-ip": "1.0.0", + "methods": "1.1.2", + "qs": "6.5.2", + "superagent": "2.3.0" + } + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "requires": { + "traverse": "0.3.9" + }, + "dependencies": { + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + } + } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.2" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "3.0.0" + } + } + } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-ip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz", - "integrity": "sha1-K7aVn3l8zW+f3IEnWLy8h8TFkHQ=", - "dev": true, - "requires": { - "ip-regex": "1.0.3" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "requires": { - "is-path-inside": "1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "requires": { - "tryit": "1.0.3" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isemail": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-2.2.1.tgz", - "integrity": "sha1-A1PT2aYpUQgMJiwqoKQrjqjp4qY=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isomorphic-form-data": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-0.0.1.tgz", - "integrity": "sha1-Am9ifgMrDNhBPsyHVZKLlKRosGI=", - "requires": { - "form-data": "1.0.0-rc4" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jayson": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-1.2.2.tgz", - "integrity": "sha1-0oxgLsuJIsKp+zwWEfeftYTxk+w=", - "requires": { - "JSONStream": "1.0.3", - "commander": "1.3.2", - "eyes": "0.1.8", - "lodash": "3.6.0" - }, - "dependencies": { - "lodash": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.6.0.tgz", - "integrity": "sha1-Umao9J3Zib5Pn2gbbyoMVShdDZo=" - } - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - } - }, - "js2xmlparser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-1.0.0.tgz", - "integrity": "sha1-WhcPLo1kds5FQF4EgjJCUTeC/jA=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "json-buffer": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-2.0.11.tgz", - "integrity": "sha1-PkQf2jCYvo0eMXGtWRvGKjPi1V8=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonparse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.0.0.tgz", - "integrity": "sha1-JiL05mwI4arH7b63YFPJt+EhH3Y=" - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "kafka-node": { - "version": "0.2.30", - "resolved": "https://registry.npmjs.org/kafka-node/-/kafka-node-0.2.30.tgz", - "integrity": "sha1-rDJRny9in/7GLuZoY5U8sZ9WyPo=", - "requires": { - "async": "1.5.2", - "binary": "0.3.0", - "buffer-crc32": "0.2.13", - "buffermaker": "1.2.0", - "debug": "2.2.0", - "lodash": "3.10.1", - "node-uuid": "1.4.8", - "node-zookeeper-client": "0.2.2", - "retry": "0.6.1", - "snappy": "4.1.2" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } - }, - "keypress": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", - "integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } - }, - "ldap-filter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", - "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", - "requires": { - "assert-plus": "0.1.5" - }, - "dependencies": { - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" - } - } - }, - "ldapauth-fork": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.0.2.tgz", - "integrity": "sha512-YoPHsyfV6L/4SO5EMi/Jk1xUMaY+ANlR4Yp+WIsqGkWOLPKkuzRYB4s/IsdKBeb3sdwVCw+q/YN9eoa1dXmQdA==", - "requires": { - "@types/ldapjs": "1.0.2", - "@types/node": "7.0.52", - "bcryptjs": "2.4.3", - "ldapjs": "1.0.1", - "lru-cache": "4.1.1" - } - }, - "ldapjs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.1.tgz", - "integrity": "sha1-NSuBKudLCo6WVJpLiWBg7uG5pUY=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "backoff": "2.5.0", - "bunyan": "1.8.12", - "dashdash": "1.14.1", - "dtrace-provider": "0.7.1", - "ldap-filter": "0.2.2", - "once": "1.4.0", - "vasync": "1.6.4", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" }, - "extsprintf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", - "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=" + "cldrjs": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.4.8.tgz", + "integrity": "sha1-O5lMRk0qMrWsp8XeF6YKh+RdxPk=" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.4.0" - } - } - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "libbase64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", - "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=" - }, - "libmime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", - "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", - "requires": { - "iconv-lite": "0.4.15", - "libbase64": "0.1.0", - "libqp": "1.1.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" - } - } - }, - "libqp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", - "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" - }, - "lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" - }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" - }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "long": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/long/-/long-1.1.2.tgz", - "integrity": "sha1-6u9ZUcp1UdlpJrgtokLbnWso+1M=" - }, - "loopback": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/loopback/-/loopback-3.16.2.tgz", - "integrity": "sha512-07mqcSZ2f9jRmA7wXen+2TQIn8MUKkTI0l78rvIBqVlmsUyFAaLCcVzISwzG1xi435jET802YOWYIACLlTT3NQ==", - "requires": { - "async": "2.6.0", - "bcryptjs": "2.4.3", - "bluebird": "3.5.0", - "body-parser": "1.18.2", - "canonical-json": "0.0.4", - "debug": "2.2.0", - "depd": "1.1.1", - "ejs": "2.5.7", - "express": "4.16.2", - "inflection": "1.12.0", - "isemail": "2.2.1", - "loopback-connector-remote": "3.3.0", - "loopback-datasource-juggler": "3.14.0", - "loopback-phase": "3.1.0", - "nodemailer": "2.7.2", - "nodemailer-stub-transport": "1.1.0", - "serve-favicon": "2.4.5", - "stable": "0.1.6", - "strong-globalize": "3.1.0", - "strong-remoting": "3.8.0", - "uid2": "0.0.3", - "underscore.string": "3.3.4" - }, - "dependencies": { - "nodemailer": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", - "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", - "requires": { - "libmime": "3.0.0", - "mailcomposer": "4.0.1", - "nodemailer-direct-transport": "3.3.2", - "nodemailer-shared": "1.1.0", - "nodemailer-smtp-pool": "2.8.2", - "nodemailer-smtp-transport": "2.7.2", - "socks": "1.1.9" - } - } - } - }, - "loopback-boot": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/loopback-boot/-/loopback-boot-2.27.0.tgz", - "integrity": "sha512-PO8VMisNyUW8lKAN1oitJn6WveZOazqLPXSi4SRmE0asU6rlOR90dUW0Hr1wkYzVm46CQlKKHvuIOmguTvFN7g==", - "requires": { - "async": "0.9.2", - "commondir": "0.0.1", - "debug": "2.2.0", - "lodash": "3.10.1", - "semver": "4.3.6", - "strong-globalize": "2.10.0", - "toposort": "0.2.12" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "requires": { + "color-name": "1.1.1" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" }, - "strong-globalize": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-2.10.0.tgz", - "integrity": "sha512-g2nNtA6YKBDXhIe6TC/b0lInge8WxcAlFss9OKNGiUHUlOkhIdBHn9AGMLVbKyfI9T8ijEBATcwFIPayWUpOdQ==", - "requires": { - "async": "1.5.2", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.4", - "htmlparser2": "3.9.2", - "lodash": "4.17.4", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "commondir": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", + "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compressible": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", + "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", + "requires": { + "mime-db": "1.34.0" }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { + "dependencies": { + "mime-db": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", + "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=" + } + } + }, + "compression": { + "version": "1.7.2", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "requires": { + "accepts": "1.3.5", + "bytes": "3.0.0", + "compressible": "2.0.14", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "1.1.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-security-policy-builder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz", + "integrity": "sha512-j+Nhmj1yfZAikJLImCvPJFE29x/UuBi+/MWqggGGc515JKaZrjuei2RhULJmy0MsstW3E3htl002bwmBNMKr7w==" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", + "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "4.1.1", + "vary": "1.1.2" + } + }, + "cross-fetch": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-0.0.8.tgz", + "integrity": "sha1-Ae2U3EB98sAPGAf95wCnz6SKIFw=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.3" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.45" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { "ms": "2.0.0" - } + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "dns-prefetch-control": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", + "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "2.0.2" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } } - } - } - } - }, - "loopback-component-explorer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/loopback-component-explorer/-/loopback-component-explorer-5.2.0.tgz", - "integrity": "sha512-6wKcGW7t17bzjjevlU9YuDKwD10qaQ6wFGK/Wm/MCHW6OurAgipuly1PKC2rZilrVEkQjK28QoX6P3qIFZbRmw==", - "requires": { - "cors": "2.8.4", - "debug": "2.2.0", - "depd": "1.1.1", - "lodash": "3.10.1", - "loopback-swagger": "5.5.0", - "strong-globalize": "3.1.0", - "swagger-ui": "2.2.10" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } - }, - "loopback-component-model-diagram": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/loopback-component-model-diagram/-/loopback-component-model-diagram-0.3.0.tgz", - "integrity": "sha1-sg2+GstsXMASRdpNYVbRAohdyLo=", - "requires": { - "eslint-plugin-import": "2.2.0", - "lodash": "4.17.4" - } - }, - "loopback-component-mq": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/loopback-component-mq/-/loopback-component-mq-2.2.5.tgz", - "integrity": "sha1-sfADliJc0lBkxyCIs5vbgUII1Gs=", - "requires": { - "amqp-stats": "https://github.com/fullcube/node-amqp-stats/tarball/fe86722fd278067969f03addde57ed53f0910cd8", - "bluebird": "3.5.0", - "debug": "3.0.0", - "lodash": "4.17.4", - "rabbot": "https://github.com/fullcube/rabbot/tarball/bbd6343777f8f341d592711e8e2bf23fe2ad76f5" - }, - "dependencies": { - "debug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.0.tgz", - "integrity": "sha512-XQkHxxqbsCb+zFurCHbotmJZl5jXsxvkRt952pT6Hpo7LmjWAJF12d9/kqBg5owjbLADbBDli1olravjSiSg8g==", - "requires": { - "ms": "2.0.0" - } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "loopback-component-passport": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/loopback-component-passport/-/loopback-component-passport-3.4.1.tgz", - "integrity": "sha1-LHyB6iPHLkN56BFLmS16v5Af2IU=", - "requires": { - "passport": "0.3.2", - "strong-globalize": "2.10.0", - "underscore": "1.8.3" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1.3.0" + } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "dont-sniff-mimetype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", + "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" }, - "strong-globalize": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-2.10.0.tgz", - "integrity": "sha512-g2nNtA6YKBDXhIe6TC/b0lInge8WxcAlFss9OKNGiUHUlOkhIdBHn9AGMLVbKyfI9T8ijEBATcwFIPayWUpOdQ==", - "requires": { - "async": "1.5.2", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.4", - "htmlparser2": "3.9.2", - "lodash": "4.17.4", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - } + "dtrace-provider": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", + "integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=", + "optional": true, + "requires": { + "nan": "2.10.0" + }, + "dependencies": { + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "optional": true + } + } }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - } - } - }, - "loopback-component-visualizer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/loopback-component-visualizer/-/loopback-component-visualizer-1.2.1.tgz", - "integrity": "sha1-45hAfSeKkic6bYI7KNhlJDy5ew0=", - "requires": { - "lodash": "4.17.4" - } - }, - "loopback-connector": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-4.4.0.tgz", - "integrity": "sha1-FRNlMolredjcKAvifWV/rQAMEgk=", - "requires": { - "async": "2.6.0", - "bluebird": "3.5.0", - "debug": "3.1.0", - "msgpack5": "3.6.0", - "strong-globalize": "3.1.0", - "uuid": "3.2.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + "duplex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/duplex/-/duplex-1.0.0.tgz", + "integrity": "sha1-arxcFuwX5MV4V4cnEmcAWQ06Ldo=" + }, + "duplexer": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.0.4.tgz", + "integrity": "sha1-r8t/H4uNdPggcmFx1dZKyeSo/yA=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "loopback-connector-kafka": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/loopback-connector-kafka/-/loopback-connector-kafka-0.2.1.tgz", - "integrity": "sha1-oRn7iqBmJzGMRlvsgX+nPbo43sE=", - "requires": { - "kafka-node": "0.2.30" - } - }, - "loopback-connector-mongodb": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/loopback-connector-mongodb/-/loopback-connector-mongodb-3.3.0.tgz", - "integrity": "sha1-WsS9GfgDFtyN8N8tg3NxSU/Ks8g=", - "requires": { - "async": "1.5.2", - "debug": "2.2.0", - "loopback-connector": "4.4.0", - "mongodb": "2.2.34", - "strong-globalize": "3.1.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - } - } - }, - "loopback-connector-remote": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/loopback-connector-remote/-/loopback-connector-remote-3.3.0.tgz", - "integrity": "sha512-dlZ7/hUqYpIoyQS1ZfUrQWODCP1qv+Ml7TuaH5HPf9KS62NtYLFkzIaXlklb+UVrCEAqnWaA018UTn57yALrIw==", - "requires": { - "eslint": "4.15.0", - "eslint-config-loopback": "8.0.0", - "loopback-datasource-juggler": "3.14.0", - "strong-remoting": "3.8.0" - }, - "dependencies": { - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==" + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" + }, + "encode-3986": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/encode-3986/-/encode-3986-1.0.0.tgz", + "integrity": "sha1-lA1RSY+HQa3hhLda0UObMXwMemA=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.23" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "es5-ext": { + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "4.2.4" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.2", + "debug": "2.6.9", + "doctrine": "2.1.0", + "escope": "3.6.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.8", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.17.2", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.10", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.10", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + } + } + }, + "eslint-config-loopback": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-loopback/-/eslint-config-loopback-8.0.0.tgz", + "integrity": "sha1-8UK8pHEimUoahfGcwhY1EWFrQVI=" + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "requires": { + "debug": "2.6.9", + "object-assign": "4.1.1", + "resolve": "1.7.1" + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.2.3", + "eslint-module-utils": "2.2.0", + "has": "1.0.3", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "pkg-up": "1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "requires": { + "acorn": "5.6.2", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.45" + } + }, + "eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expect-ct": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.1.tgz", + "integrity": "sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg==" + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.23", + "tmp": "0.0.33" + } + }, + "extfs": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/extfs/-/extfs-0.0.7.tgz", + "integrity": "sha1-owgQ5HRZCg280NL0V63IkAnFwKs=", + "dev": true, + "requires": { + "underscore": "1.7.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-patch": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.0.6.tgz", + "integrity": "sha1-hv/4+GYjkaqBlyKGTWMuYD5u5gU=", + "requires": { + "deep-equal": "1.0.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", + "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", + "requires": { + "async": "2.6.1", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "frameguard": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", + "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "g11n-pipeline": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/g11n-pipeline/-/g11n-pipeline-2.0.6.tgz", + "integrity": "sha512-ykVjThha+dGKAR/F31kCUxMn7vu1JrmUkDxMs+h7TvjGbQoNx29hsw618GQKm9eT4Qo6E+8zJAnt0BT3gMtggQ==", + "requires": { + "swagger-client": "3.8.6" + } + }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "requires": { + "ansi": "0.3.1", + "has-unicode": "2.0.1", + "lodash.pad": "4.5.1", + "lodash.padend": "4.6.1", + "lodash.padstart": "4.6.1" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globalize": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.3.0.tgz", + "integrity": "sha1-xWUkuKz9LOONDJfd/c6zj2RLM5I=", + "requires": { + "cldrjs": "0.4.8" + } + }, + "globals": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "helmet": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.12.1.tgz", + "integrity": "sha512-/CsAcbPIHgiGde395IkHUZyRLW126RJ6AtxFy6Y6bxhd44Qq8cZ5BBFZ0xNUSbcgX57j32Emh3OhWz/0XgAB5Q==", + "requires": { + "dns-prefetch-control": "0.1.0", + "dont-sniff-mimetype": "1.0.0", + "expect-ct": "0.1.1", + "frameguard": "3.0.0", + "helmet-csp": "2.7.0", + "hide-powered-by": "1.0.0", + "hpkp": "2.0.0", + "hsts": "2.1.0", + "ienoopen": "1.0.0", + "nocache": "2.0.0", + "referrer-policy": "1.1.0", + "x-xss-protection": "1.1.0" + } + }, + "helmet-csp": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.7.0.tgz", + "integrity": "sha512-IGIAkWnxjRbgMXFA2/kmDqSIrIaSfZ6vhMHlSHw7jm7Gm9nVVXqwJ2B1YEpYrJsLrqY+w2Bbimk7snux9+sZAw==", + "requires": { + "camelize": "1.0.0", + "content-security-policy-builder": "2.0.0", + "dasherize": "2.0.0", + "lodash.reduce": "4.6.0", + "platform": "1.3.5" + } + }, + "hide-powered-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz", + "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=" + }, + "hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "hsts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz", + "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==" + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.7.0", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.5.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" + } + }, + "http-status": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.2.0.tgz", + "integrity": "sha512-cSX+i/g4Kj5lkfOqS9w0SrxQF4hX7gsfikBtSDm5PFrAy+8fjRKk9+JRCG5cEZ40b6q6GOJk3P0QyDB5JpE0Ig==" + }, + "httpntlm": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "requires": { + "httpreq": "0.4.24", + "underscore": "1.7.0" + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=" + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + }, + "ienoopen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz", + "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-ip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz", + "integrity": "sha1-K7aVn3l8zW+f3IEnWLy8h8TFkHQ=", + "dev": true, + "requires": { + "ip-regex": "1.0.3" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isemail": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-2.2.1.tgz", + "integrity": "sha1-A1PT2aYpUQgMJiwqoKQrjqjp4qY=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isomorphic-form-data": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-0.0.1.tgz", + "integrity": "sha1-Am9ifgMrDNhBPsyHVZKLlKRosGI=", + "requires": { + "form-data": "1.0.1" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jayson": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-2.0.6.tgz", + "integrity": "sha512-ZIzF3DZ3ig9rNeOLUzGUbpxjOMqrfUX9a2H+3cmQHIGdBk8nZMEmHVZNXwxNYchgx6UnB/CFV+miFEfOjmMBmA==", + "requires": { + "JSONStream": "1.3.3", + "commander": "2.15.1", + "es6-promisify": "5.0.0", + "eyes": "0.1.8", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.10", + "uuid": "3.2.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "js2xmlparser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", + "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "requires": { + "xmlcreate": "1.0.2" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-buffer": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-2.0.11.tgz", + "integrity": "sha1-PkQf2jCYvo0eMXGtWRvGKjPi1V8=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kafka-node": { + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/kafka-node/-/kafka-node-0.2.30.tgz", + "integrity": "sha1-rDJRny9in/7GLuZoY5U8sZ9WyPo=", + "requires": { + "async": "1.5.2", + "binary": "0.3.0", + "buffer-crc32": "0.2.13", + "buffermaker": "1.2.0", + "debug": "2.6.9", + "lodash": "3.10.1", + "node-uuid": "1.4.8", + "node-zookeeper-client": "0.2.2", + "retry": "0.6.1", + "snappy": "4.1.2" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "ldap-filter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", + "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", + "requires": { + "assert-plus": "0.1.5" + }, + "dependencies": { + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" + } + } + }, + "ldapauth-fork": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.0.2.tgz", + "integrity": "sha512-YoPHsyfV6L/4SO5EMi/Jk1xUMaY+ANlR4Yp+WIsqGkWOLPKkuzRYB4s/IsdKBeb3sdwVCw+q/YN9eoa1dXmQdA==", + "requires": { + "@types/ldapjs": "1.0.3", + "@types/node": "7.0.65", + "bcryptjs": "2.4.3", + "ldapjs": "1.0.2", + "lru-cache": "4.1.3" + } + }, + "ldapjs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", + "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "backoff": "2.5.0", + "bunyan": "1.8.12", + "dashdash": "1.14.1", + "dtrace-provider": "0.8.7", + "ldap-filter": "0.2.2", + "once": "1.4.0", + "vasync": "1.6.4", + "verror": "1.10.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" + }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "long": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/long/-/long-1.1.2.tgz", + "integrity": "sha1-6u9ZUcp1UdlpJrgtokLbnWso+1M=" + }, + "loopback": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/loopback/-/loopback-3.20.0.tgz", + "integrity": "sha512-fiXt6T5tIAqmGNO1AtuE7PVM1wDqCOhjPPEyLDHkhFG1PJJ0K2YrGrwFTWTRi1BcuxjFF7z+BcL9pQzQmwot6g==", + "requires": { + "async": "2.6.1", + "bcryptjs": "2.4.3", + "bluebird": "3.5.1", + "body-parser": "1.18.3", + "canonical-json": "0.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "ejs": "2.6.1", + "express": "4.16.3", + "inflection": "1.12.0", + "isemail": "2.2.1", + "loopback-connector-remote": "3.3.1", + "loopback-datasource-juggler": "3.21.1", + "loopback-filters": "1.0.0", + "loopback-phase": "3.2.0", + "nodemailer": "4.6.6", + "nodemailer-direct-transport": "3.3.2", + "nodemailer-stub-transport": "1.1.0", + "serve-favicon": "2.4.5", + "stable": "0.1.8", + "strong-globalize": "4.1.1", + "strong-remoting": "3.12.0", + "uid2": "0.0.3", + "underscore.string": "3.3.4" + } + }, + "loopback-boot": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/loopback-boot/-/loopback-boot-2.27.1.tgz", + "integrity": "sha512-8w1EYcQCPwUrs5iplJv0iHMzmvfBRDRxsO40ladB8TL4Jat6jXfOaE0zAm1/9gh9pMCstHh01Nr52GpfCIHGZA==", + "requires": { + "async": "0.9.2", + "commondir": "0.0.1", + "debug": "2.6.9", + "lodash": "4.17.10", + "semver": "4.3.6", + "strong-globalize": "2.10.0", + "toposort": "0.2.12" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + }, + "strong-globalize": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-2.10.0.tgz", + "integrity": "sha512-g2nNtA6YKBDXhIe6TC/b0lInge8WxcAlFss9OKNGiUHUlOkhIdBHn9AGMLVbKyfI9T8ijEBATcwFIPayWUpOdQ==", + "requires": { + "async": "1.5.2", + "debug": "3.1.0", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "g11n-pipeline": "2.0.6", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "mktmpdir": "0.1.1", + "optional": "0.1.4", + "os-locale": "2.1.0", + "posix-getopt": "1.2.0", + "word-count": "0.2.2", + "xtend": "4.0.1", + "yamljs": "0.3.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "loopback-component-explorer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/loopback-component-explorer/-/loopback-component-explorer-6.0.1.tgz", + "integrity": "sha512-1PGhwqDr5NON9OmLY3y4TUcwvENk2QPMiUcsYEW/HQdw8FBlSfBXAXZBCWpVinvrxRyQbWTk5rVqWS9CPbKmTQ==", + "requires": { + "debug": "2.6.9", + "lodash": "4.17.10", + "loopback-swagger": "5.5.0", + "strong-globalize": "3.3.0", + "swagger-ui": "2.2.10" + }, + "dependencies": { + "strong-globalize": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", + "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "requires": { + "accept-language": "3.0.18", + "async": "2.6.1", + "debug": "3.1.0", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "g11n-pipeline": "2.0.6", + "globalize": "1.3.0", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "mktmpdir": "0.1.1", + "optional": "0.1.4", + "os-locale": "2.1.0", + "posix-getopt": "1.2.0", + "word-count": "0.2.2", + "xtend": "4.0.1", + "yamljs": "0.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "loopback-component-model-diagram": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/loopback-component-model-diagram/-/loopback-component-model-diagram-0.3.0.tgz", + "integrity": "sha1-sg2+GstsXMASRdpNYVbRAohdyLo=", + "requires": { + "eslint-plugin-import": "2.2.0", + "lodash": "4.17.10" + } + }, + "loopback-component-mq": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/loopback-component-mq/-/loopback-component-mq-2.2.5.tgz", + "integrity": "sha1-sfADliJc0lBkxyCIs5vbgUII1Gs=", + "requires": { + "amqp-stats": "https://github.com/fullcube/node-amqp-stats/tarball/fe86722fd278067969f03addde57ed53f0910cd8", + "bluebird": "3.5.0", + "debug": "3.0.0", + "lodash": "4.17.4", + "rabbot": "https://github.com/fullcube/rabbot/tarball/bbd6343777f8f341d592711e8e2bf23fe2ad76f5" + }, + "dependencies": { + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "debug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.0.tgz", + "integrity": "sha512-XQkHxxqbsCb+zFurCHbotmJZl5jXsxvkRt952pT6Hpo7LmjWAJF12d9/kqBg5owjbLADbBDli1olravjSiSg8g==", + "requires": { + "ms": "2.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + } + } + }, + "loopback-component-passport": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/loopback-component-passport/-/loopback-component-passport-3.8.1.tgz", + "integrity": "sha1-qKw969A2pGAU7o7zIe4QWgEfpsE=", + "requires": { + "passport": "0.4.0", + "strong-globalize": "2.10.0", + "underscore": "1.9.1", + "uuid": "3.2.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "strong-globalize": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-2.10.0.tgz", + "integrity": "sha512-g2nNtA6YKBDXhIe6TC/b0lInge8WxcAlFss9OKNGiUHUlOkhIdBHn9AGMLVbKyfI9T8ijEBATcwFIPayWUpOdQ==", + "requires": { + "async": "1.5.2", + "debug": "3.1.0", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "g11n-pipeline": "2.0.6", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "mktmpdir": "0.1.1", + "optional": "0.1.4", + "os-locale": "2.1.0", + "posix-getopt": "1.2.0", + "word-count": "0.2.2", + "xtend": "4.0.1", + "yamljs": "0.3.0" + } + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + } + } + }, + "loopback-component-visualizer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/loopback-component-visualizer/-/loopback-component-visualizer-1.2.1.tgz", + "integrity": "sha1-45hAfSeKkic6bYI7KNhlJDy5ew0=", + "requires": { + "lodash": "4.17.10" + } + }, + "loopback-connector": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-4.4.0.tgz", + "integrity": "sha1-FRNlMolredjcKAvifWV/rQAMEgk=", + "requires": { + "async": "2.6.1", + "bluebird": "3.5.1", + "debug": "3.1.0", + "msgpack5": "3.6.0", + "strong-globalize": "3.3.0", + "uuid": "3.2.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "strong-globalize": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", + "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "requires": { + "accept-language": "3.0.18", + "async": "2.6.1", + "debug": "3.1.0", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "g11n-pipeline": "2.0.6", + "globalize": "1.3.0", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "mktmpdir": "0.1.1", + "optional": "0.1.4", + "os-locale": "2.1.0", + "posix-getopt": "1.2.0", + "word-count": "0.2.2", + "xtend": "4.0.1", + "yamljs": "0.3.0" + } + } + } + }, + "loopback-connector-kafka": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/loopback-connector-kafka/-/loopback-connector-kafka-0.2.1.tgz", + "integrity": "sha1-oRn7iqBmJzGMRlvsgX+nPbo43sE=", + "requires": { + "kafka-node": "0.2.30" + } + }, + "loopback-connector-mongodb": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/loopback-connector-mongodb/-/loopback-connector-mongodb-3.4.4.tgz", + "integrity": "sha1-8EEpc3ytRfd+BKN7ppsmwnsjw18=", + "requires": { + "async": "2.6.1", + "bson": "1.0.9", + "debug": "3.1.0", + "loopback-connector": "4.4.0", + "mongodb": "3.0.10", + "strong-globalize": "3.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "strong-globalize": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", + "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "requires": { + "accept-language": "3.0.18", + "async": "2.6.1", + "debug": "3.1.0", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "g11n-pipeline": "2.0.6", + "globalize": "1.3.0", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "mktmpdir": "0.1.1", + "optional": "0.1.4", + "os-locale": "2.1.0", + "posix-getopt": "1.2.0", + "word-count": "0.2.2", + "xtend": "4.0.1", + "yamljs": "0.3.0" + } + } + } + }, + "loopback-connector-remote": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loopback-connector-remote/-/loopback-connector-remote-3.3.1.tgz", + "integrity": "sha512-GBX/v8ixXuwWS3LoDjJWR64aF82IEbGnFZ1dpAc2pSpYf/gyDLN6IN6UvfIKt4uda9u+OKsLsOh3dxCBDmjGWA==", + "requires": { + "eslint": "4.19.1", + "eslint-config-loopback": "8.0.0", + "loopback-datasource-juggler": "3.21.1", + "strong-remoting": "3.12.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "requires": { + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.1", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.5.0", + "ignore": "3.3.8", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "regexpp": "1.1.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + } + } + } + }, + "loopback-datasource-juggler": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-3.21.1.tgz", + "integrity": "sha512-8wIVdQjt86CCZykHUVn69yvdQIpRqZel4Mfk41F0qnkEPMi7x2/IdS11Y7q6fnn4wKy5sdBMVOwpPX7LTaA/zQ==", + "requires": { + "async": "2.6.1", + "bluebird": "3.5.1", + "debug": "3.1.0", + "depd": "1.1.2", + "inflection": "1.12.0", + "lodash": "4.17.10", + "loopback-connector": "4.4.0", + "minimatch": "3.0.4", + "qs": "6.5.2", + "shortid": "2.2.8", + "strong-globalize": "3.3.0", + "traverse": "0.6.6", + "uuid": "3.2.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "strong-globalize": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", + "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "requires": { + "accept-language": "3.0.18", + "async": "2.6.1", + "debug": "3.1.0", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "g11n-pipeline": "2.0.6", + "globalize": "1.3.0", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "mktmpdir": "0.1.1", + "optional": "0.1.4", + "os-locale": "2.1.0", + "posix-getopt": "1.2.0", + "word-count": "0.2.2", + "xtend": "4.0.1", + "yamljs": "0.3.0" + } + } + } + }, + "loopback-datatype-geopoint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loopback-datatype-geopoint/-/loopback-datatype-geopoint-1.0.0.tgz", + "integrity": "sha1-/apcerjXMKmrflRVS+Fl8xzfYQA=" + }, + "loopback-ds-timestamp-mixin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/loopback-ds-timestamp-mixin/-/loopback-ds-timestamp-mixin-3.4.1.tgz", + "integrity": "sha1-qw8N8AmzRvB573GkHEgxANLqayc=", + "requires": { + "debug": "2.6.9" + } + }, + "loopback-filters": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loopback-filters/-/loopback-filters-1.0.0.tgz", + "integrity": "sha512-uFQQLfj4T27CM6dzlWMH6aF1lf/Qj97VmXMlVnNWcG+Pd8R8ZbU4i/shArYXArXfis+ICD80YadrPbf9DYRbOA==", + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "loopback-phase": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loopback-phase/-/loopback-phase-3.2.0.tgz", + "integrity": "sha512-hqN72kDWuuZkT0jYtTpp6giNmkvbe6zAmIGeqA/5dIXNAzdSzNsUjvzzSOeTax82QJ+VkvNyMad4dmd3KbI+fQ==", + "requires": { + "async": "2.6.1", + "debug": "3.1.0", + "strong-globalize": "4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "loopback-swagger": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/loopback-swagger/-/loopback-swagger-5.5.0.tgz", + "integrity": "sha512-KSjZNl57+GfjpWBiPtilHJgOqu1HEHPzHQrLKnaa3hKf0qM6UuRrijwTIfu5YoXcZkSuZxGMlFgTikofPvQynQ==", + "requires": { + "async": "2.6.1", + "debug": "2.6.9", + "ejs": "2.6.1", + "lodash": "4.17.10", + "strong-globalize": "3.3.0" + }, + "dependencies": { + "strong-globalize": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", + "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "requires": { + "accept-language": "3.0.18", + "async": "2.6.1", + "debug": "3.1.0", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "g11n-pipeline": "2.0.6", + "globalize": "1.3.0", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "mktmpdir": "0.1.1", + "optional": "0.1.4", + "os-locale": "2.1.0", + "posix-getopt": "1.2.0", + "word-count": "0.2.2", + "xtend": "4.0.1", + "yamljs": "0.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "machina": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/machina/-/machina-2.0.2.tgz", + "integrity": "sha512-9U9g4eQjQ2JARX7h/051r65EQEfFfpPxoSjVmUMJG6gnfjVjM+rjwVLoq7Z9NovjYm7AR3oTWWPtHVlgeSZzYw==", + "requires": { + "lodash": "3.10.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "1.1.6" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "1.2.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mktmpdir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/mktmpdir/-/mktmpdir-0.1.1.tgz", + "integrity": "sha1-OKyCCVDXjvoLnN38A/99XFp4bbk=", + "requires": { + "rimraf": "2.2.8" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + } + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "moment-timezone": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.17.tgz", + "integrity": "sha512-Y/JpVEWIOA9Gho4vO15MTnW1FCmHi3ypprrkUaxsZ1TKg3uqC8q/qMBjTddkHoiwwZN3qvZSr4zJP7x9V3LpXA==", + "requires": { + "moment": "2.22.2" + } + }, + "mongodb": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.10.tgz", + "integrity": "sha512-jy9s4FgcM4rl8sHNETYHGeWcuRh9AlwQCUuMiTj041t/HD02HwyFgmm2VZdd9/mA9YNHaUJLqj0tzBx2QFivtg==", + "requires": { + "mongodb-core": "3.0.9" + } + }, + "mongodb-core": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.9.tgz", + "integrity": "sha512-buOWjdLLBlEqjHDeHYSXqXx173wHMVp7bafhdHxSjxWdB9V6Ri4myTqxjYZwL/eGFZxvd8oRQSuhwuIDbaaB+g==", + "requires": { + "bson": "1.0.9", + "require_optional": "1.0.1" + } + }, + "monologue.js": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/monologue.js/-/monologue.js-0.3.5.tgz", + "integrity": "sha1-IM5RQ9ZegqOh91rakUfFJIeRSWk=", + "requires": { + "lodash": "3.10.1", + "riveter": "0.2.0" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "msgpack-js": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/msgpack-js/-/msgpack-js-0.3.0.tgz", + "integrity": "sha1-Aw7AjFlW+cp9F9QKVy1Tlv7BCSM=", + "requires": { + "bops": "0.0.7" + }, + "dependencies": { + "base64-js": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz", + "integrity": "sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q=" + }, + "bops": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.7.tgz", + "integrity": "sha1-tKClqDmkBkVK8P4FqLkaenZqVOI=", + "requires": { + "base64-js": "0.0.2", + "to-utf8": "0.0.1" + } + } + } + }, + "msgpack-stream": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/msgpack-stream/-/msgpack-stream-0.0.13.tgz", + "integrity": "sha1-UKZzrE6uyl43cBkk0JPUM1DB5Sw=", + "requires": { + "bops": "1.0.0", + "msgpack-js": "0.3.0", + "through": "2.3.4" + }, + "dependencies": { + "through": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", + "integrity": "sha1-SV5A6Nio6uvHwnXqiMK4/BTFZFU=" + } + } + }, + "msgpack5": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/msgpack5/-/msgpack5-3.6.0.tgz", + "integrity": "sha512-6HuCZHA57WtNUzrKIvjJ8OMxigzveJ6D5i13y6TsgGu3X3zxABpuBvChpppOoGdB9SyWZcmqUs1fwUV/PpSQ7Q==", + "requires": { + "bl": "1.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.1" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "mux-demux": { + "version": "3.7.9", + "resolved": "https://registry.npmjs.org/mux-demux/-/mux-demux-3.7.9.tgz", + "integrity": "sha1-NTZ3GP02AcgLzi63YlMVdtekrO8=", + "requires": { + "duplex": "1.0.0", + "json-buffer": "2.0.11", + "msgpack-stream": "0.0.13", + "stream-combiner": "0.0.2", + "stream-serializer": "1.1.2", + "through": "2.3.8", + "xtend": "1.0.3" + }, + "dependencies": { + "xtend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-1.0.3.tgz", + "integrity": "sha1-P12Tc1PM7Y4IU5mlY/2yJUHClgo=" + } + } + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "ncp": "2.0.0", + "rimraf": "2.4.5" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "6.0.4" + } + } + } + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nocache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", + "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=" + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-gyp": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.2.1.tgz", + "integrity": "sha1-9d1WmXClCEZMw8Fdfp6NLehjjdU=", + "requires": { + "fstream": "1.0.11", + "glob": "4.5.3", + "graceful-fs": "4.1.11", + "minimatch": "1.0.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "1.2.1", + "osenv": "0.1.5", + "path-array": "1.0.1", + "request": "2.87.0", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "2.2.1", + "which": "1.3.1" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "1.1.11" + } + } + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "node-zookeeper-client": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/node-zookeeper-client/-/node-zookeeper-client-0.2.2.tgz", + "integrity": "sha1-CXvaAZme749gLOBotjJgAGnb9oU=", + "requires": { + "async": "0.2.10", + "underscore": "1.4.4" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" + } + } + }, + "nodemailer": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.6.tgz", + "integrity": "sha512-sIcM/Do0XBJmu7ruENLoR+4TCk0B4C1ftqRjWrVeoez9Dt23SmL9bXKqswVqyxuT/RdK8TKWciZvxHykerXCRw==" + }, + "nodemailer-direct-transport": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", + "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", + "requires": { + "nodemailer-shared": "1.1.0", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=" + }, + "nodemailer-shared": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "requires": { + "nodemailer-fetch": "1.6.0" + } + }, + "nodemailer-stub-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-stub-transport/-/nodemailer-stub-transport-1.1.0.tgz", + "integrity": "sha1-EUIdLWa07m9AU1T5FMH0ZB6ySw0=" + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1.1.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "requires": { + "ansi": "0.3.1", + "are-we-there-yet": "1.0.6", + "gauge": "1.2.7" + } + }, + "nsp": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/nsp/-/nsp-2.8.1.tgz", + "integrity": "sha512-jvjDg2Gsw4coD/iZ5eQddsDlkvnwMCNnpG05BproSnuG+Gr1bSQMwWMcQeYje+qdDl3XznmhblMPLpZLecTORQ==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "cli-table": "0.3.1", + "cvss": "1.0.2", + "https-proxy-agent": "1.0.0", + "joi": "6.10.1", + "nodesecurity-npm-utils": "5.0.0", + "path-is-absolute": "1.0.1", + "rc": "1.2.1", + "semver": "5.4.1", + "subcommand": "2.1.0", + "wreck": "6.3.0" + }, + "dependencies": { + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "3.0.1", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "cliclopts": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cliclopts/-/cliclopts-1.1.1.tgz", + "integrity": "sha1-aUMcfLWvcjd0sNORG0w3USQxkQ8=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "cvss": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cvss/-/cvss-1.0.2.tgz", + "integrity": "sha1-32fpK/EqeW9J6Sh5nI2zunS5/NY=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "isemail": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=", + "dev": true + }, + "joi": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", + "dev": true, + "requires": { + "hoek": "2.16.3", + "isemail": "1.2.0", + "moment": "2.18.1", + "topo": "1.1.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "moment": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nodesecurity-npm-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nodesecurity-npm-utils/-/nodesecurity-npm-utils-5.0.0.tgz", + "integrity": "sha1-Baow3jDKjIRcQEjpT9eOXgi1Xtk=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "subcommand": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/subcommand/-/subcommand-2.1.0.tgz", + "integrity": "sha1-XkzspaN3njNlsVEeBfhmh3MC92A=", + "dev": true, + "requires": { + "cliclopts": "1.1.1", + "debug": "2.6.9", + "minimist": "1.2.0", + "xtend": "4.0.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "topo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "wreck": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", + "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", + "dev": true, + "requires": { + "boom": "2.10.1", + "hoek": "2.16.3" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.2.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optional": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", + "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==" + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "passport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", + "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "requires": { + "passport-strategy": "1.0.0", + "pause": "0.0.1" + } + }, + "passport-ldapauth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.0.0.tgz", + "integrity": "sha1-Qt/wBEFxhdCk2fd2o+7Y1HMf1ok=", + "requires": { + "@types/node": "7.0.65", + "@types/passport": "0.3.5", + "ldapauth-fork": "4.0.2", + "passport-strategy": "1.0.0" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "requires": { + "passport-strategy": "1.0.0" + } + }, + "passport-openidconnect": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/passport-openidconnect/-/passport-openidconnect-0.0.2.tgz", + "integrity": "sha1-5Ij4vbOGyan9OckdWrjIgBVugVM=", + "requires": { + "oauth": "0.9.15", + "passport-strategy": "1.0.0", + "request": "2.87.0", + "webfinger": "0.4.2" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", + "integrity": "sha1-fi8PNfB6IBUSK4aLfqwOssT+wnE=", + "requires": { + "array-index": "1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "requires": { + "find-up": "1.1.2" + } + }, + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "requires": { + "find-up": "1.1.2" + } + }, + "platform": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", + "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==" }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + "posix-getopt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/posix-getopt/-/posix-getopt-1.2.0.tgz", + "integrity": "sha1-Su7rfa3mb8qKk2XdqfawBXQctiE=" }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "postal": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/postal/-/postal-2.0.5.tgz", + "integrity": "sha1-f58DWUOiTaqZY6xaU7XQzwffJLk=", + "requires": { + "lodash": "4.17.10" + } }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.1" - } + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "2.0.0" - } + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "2.0.2" - } + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, - "eslint": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.15.0.tgz", - "integrity": "sha512-zEO/Z1ZUxIQ+MhDVKkVTUYpIPDTEJLXGMrkID+5v1NeQHtCz6FZikWuFRgxE1Q/RV2V4zVl1u3xmpPADHhMZ6A==", - "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.22.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.2", - "esquery": "1.0.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.1.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" - } + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" }, - "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", - "requires": { - "acorn": "5.3.0", - "acorn-jsx": "3.0.1" - } + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-browser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/querystring-browser/-/querystring-browser-1.0.4.tgz", + "integrity": "sha1-8uNYgYQKgZvHsb9Zf68JeeZiLcY=" + }, + "rabbot": { + "version": "https://github.com/fullcube/rabbot/tarball/bbd6343777f8f341d592711e8e2bf23fe2ad76f5", + "integrity": "sha512-FB6koa2jnLbzVutyokovM/OuvVApUwnNwIC+JJjEXDF7cGUIjaG52VThZGaPwKBVUysf2rbOk0exATqgvYFEZQ==", + "requires": { + "amqplib": "0.5.2", + "bluebird": "3.5.1", + "bluebird-defer": "1.0.0", + "debug": "2.6.9", + "lodash": "4.17.10", + "machina": "2.0.2", + "monologue.js": "0.3.5", + "postal": "2.0.5", + "uuid": "3.2.1", + "whistlepunk": "0.3.3" + } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "1.0.5" - } + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } }, - "globals": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz", - "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ==" + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.1.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + } + } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.7.1" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "referrer-policy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", + "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "1.1.0" - } + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.1", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + }, + "dependencies": { + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + } + } }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.5.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + } + } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "2.1.0" - } + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "requires": { + "path-parse": "1.0.5" + } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "requires": { - "is-fullwidth-code-point": "2.0.0" - } + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } + "retry": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz", + "integrity": "sha1-/ckO7ZQ/3hG4k1VLjMY9DombqRg=" }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "2.0.0" - } + "riveter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/riveter/-/riveter-0.2.0.tgz", + "integrity": "sha1-H3yOhlxFURX95ZS+JLAHLr3IvuQ=", + "requires": { + "lodash": "2.4.2" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + } + } }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - } - } - } - }, - "loopback-datasource-juggler": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-3.14.0.tgz", - "integrity": "sha512-HI33GzGTH0dBdNjGBNCX6NGMiNQz5FvoAvSJ6yixPtGcnJrf/XiHsxedi4q0/AAEmHtfyR8EIOgBKSk/P6jZ2A==", - "requires": { - "async": "2.1.5", - "bluebird": "3.5.0", - "debug": "3.1.0", - "depd": "1.1.1", - "inflection": "1.12.0", - "lodash": "4.17.4", - "loopback-connector": "4.4.0", - "minimatch": "3.0.4", - "qs": "6.5.1", - "shortid": "2.2.8", - "strong-globalize": "3.1.0", - "traverse": "0.6.6", - "uuid": "3.2.1" - }, - "dependencies": { - "async": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/async/-/async-2.1.5.tgz", - "integrity": "sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw=", - "requires": { - "lodash": "4.17.4" - } + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "4.0.8" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - } - } - }, - "loopback-datatype-geopoint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/loopback-datatype-geopoint/-/loopback-datatype-geopoint-1.0.0.tgz", - "integrity": "sha1-/apcerjXMKmrflRVS+Fl8xzfYQA=" - }, - "loopback-ds-timestamp-mixin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/loopback-ds-timestamp-mixin/-/loopback-ds-timestamp-mixin-3.4.1.tgz", - "integrity": "sha1-qw8N8AmzRvB573GkHEgxANLqayc=", - "requires": { - "debug": "2.6.9" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "loopback-phase": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/loopback-phase/-/loopback-phase-3.1.0.tgz", - "integrity": "sha512-0FFccBdB28h5/G9r1bjeuDqE5xD/Wv42uo8dWKMz4yd300+Jc5dfso/dmJzdSyLMxI8RLtx15mkFT9JVAXRduw==", - "requires": { - "async": "0.9.2", - "debug": "2.2.0", - "strong-globalize": "3.1.0" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - } - } - }, - "loopback-swagger": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/loopback-swagger/-/loopback-swagger-5.5.0.tgz", - "integrity": "sha512-KSjZNl57+GfjpWBiPtilHJgOqu1HEHPzHQrLKnaa3hKf0qM6UuRrijwTIfu5YoXcZkSuZxGMlFgTikofPvQynQ==", - "requires": { - "async": "2.6.0", - "debug": "2.6.9", - "ejs": "2.5.7", - "lodash": "4.17.4", - "strong-globalize": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } + "safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "machina": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/machina/-/machina-2.0.2.tgz", - "integrity": "sha512-9U9g4eQjQ2JARX7h/051r65EQEfFfpPxoSjVmUMJG6gnfjVjM+rjwVLoq7Z9NovjYm7AR3oTWWPtHVlgeSZzYw==", - "requires": { - "lodash": "3.10.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } - }, - "mailcomposer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", - "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", - "requires": { - "buildmail": "4.0.1", - "libmime": "3.0.0" - } - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.6" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "1.1.0" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "requires": { - "mime-db": "1.27.0" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mktmpdir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/mktmpdir/-/mktmpdir-0.1.1.tgz", - "integrity": "sha1-OKyCCVDXjvoLnN38A/99XFp4bbk=", - "requires": { - "rimraf": "2.2.8" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" - } - } - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.3", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "moment": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", - "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==" - }, - "moment-timezone": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.14.tgz", - "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", - "requires": { - "moment": "2.21.0" - } - }, - "mongodb": { - "version": "2.2.34", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.34.tgz", - "integrity": "sha1-o09Zu+thdUrsQy3nLD/iFSakTBo=", - "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.18", - "readable-stream": "2.2.7" - }, - "dependencies": { - "readable-stream": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", - "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - } - } - }, - "mongodb-core": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.18.tgz", - "integrity": "sha1-TEYTm986HwMt7ZHbSfOO7AFlkFA=", - "requires": { - "bson": "1.0.4", - "require_optional": "1.0.1" - } - }, - "monologue.js": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/monologue.js/-/monologue.js-0.3.5.tgz", - "integrity": "sha1-IM5RQ9ZegqOh91rakUfFJIeRSWk=", - "requires": { - "lodash": "3.10.1", - "riveter": "0.2.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - }, - "msgpack-js": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/msgpack-js/-/msgpack-js-0.3.0.tgz", - "integrity": "sha1-Aw7AjFlW+cp9F9QKVy1Tlv7BCSM=", - "requires": { - "bops": "0.0.7" - }, - "dependencies": { - "base64-js": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz", - "integrity": "sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q=" + "serve-favicon": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", + "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "ms": "2.0.0", + "parseurl": "1.3.2", + "safe-buffer": "5.1.1" + } }, - "bops": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.7.tgz", - "integrity": "sha1-tKClqDmkBkVK8P4FqLkaenZqVOI=", - "requires": { - "base64-js": "0.0.2", - "to-utf8": "0.0.1" - } - } - } - }, - "msgpack-stream": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/msgpack-stream/-/msgpack-stream-0.0.13.tgz", - "integrity": "sha1-UKZzrE6uyl43cBkk0JPUM1DB5Sw=", - "requires": { - "bops": "1.0.0", - "msgpack-js": "0.3.0", - "through": "2.3.4" - }, - "dependencies": { - "through": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.4.tgz", - "integrity": "sha1-SV5A6Nio6uvHwnXqiMK4/BTFZFU=" - } - } - }, - "msgpack5": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/msgpack5/-/msgpack5-3.6.0.tgz", - "integrity": "sha512-6HuCZHA57WtNUzrKIvjJ8OMxigzveJ6D5i13y6TsgGu3X3zxABpuBvChpppOoGdB9SyWZcmqUs1fwUV/PpSQ7Q==", - "requires": { - "bl": "1.2.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "safe-buffer": "5.1.1" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "mux-demux": { - "version": "3.7.9", - "resolved": "https://registry.npmjs.org/mux-demux/-/mux-demux-3.7.9.tgz", - "integrity": "sha1-NTZ3GP02AcgLzi63YlMVdtekrO8=", - "requires": { - "duplex": "1.0.0", - "json-buffer": "2.0.11", - "msgpack-stream": "0.0.13", - "stream-combiner": "0.0.2", - "stream-serializer": "1.1.2", - "through": "2.3.8", - "xtend": "1.0.3" - }, - "dependencies": { - "xtend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-1.0.3.tgz", - "integrity": "sha1-P12Tc1PM7Y4IU5mlY/2yJUHClgo=" - } - } - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "ncp": "2.0.0", - "rimraf": "2.4.5" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" + } }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "requires": { - "glob": "6.0.4" - } - } - } - }, - "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nocache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", - "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=" - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "node-gyp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.2.1.tgz", - "integrity": "sha1-9d1WmXClCEZMw8Fdfp6NLehjjdU=", - "requires": { - "fstream": "1.0.11", - "glob": "4.5.3", - "graceful-fs": "4.1.11", - "minimatch": "1.0.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "1.2.1", - "osenv": "0.1.5", - "path-array": "1.0.1", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.4.1", - "tar": "2.2.1", - "which": "1.3.0" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" - }, - "dependencies": { - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "requires": { - "brace-expansion": "1.1.8" - } - } - } + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } }, - "minimatch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", - "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - } - } - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "node-zookeeper-client": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/node-zookeeper-client/-/node-zookeeper-client-0.2.2.tgz", - "integrity": "sha1-CXvaAZme749gLOBotjJgAGnb9oU=", - "requires": { - "async": "0.2.10", - "underscore": "1.4.4" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + "shortid": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", + "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" - } - } - }, - "nodemailer": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.4.1.tgz", - "integrity": "sha512-1bnszJJXatcHJhLpxQ1XMkLDjCjPKvGKMtRQ73FOsoNln3UQjddEQmz6fAwM3aj0GtQ3dQX9qtMHPelz63GU7A==" - }, - "nodemailer-direct-transport": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", - "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", - "requires": { - "nodemailer-shared": "1.1.0", - "smtp-connection": "2.12.0" - } - }, - "nodemailer-fetch": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", - "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=" - }, - "nodemailer-shared": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", - "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", - "requires": { - "nodemailer-fetch": "1.6.0" - } - }, - "nodemailer-smtp-pool": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", - "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", - "requires": { - "nodemailer-shared": "1.1.0", - "nodemailer-wellknown": "0.1.10", - "smtp-connection": "2.12.0" - } - }, - "nodemailer-smtp-transport": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", - "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", - "requires": { - "nodemailer-shared": "1.1.0", - "nodemailer-wellknown": "0.1.10", - "smtp-connection": "2.12.0" - } - }, - "nodemailer-stub-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nodemailer-stub-transport/-/nodemailer-stub-transport-1.1.0.tgz", - "integrity": "sha1-EUIdLWa07m9AU1T5FMH0ZB6ySw0=" - }, - "nodemailer-wellknown": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", - "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=" - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1.1.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "2.0.1" - } - }, - "npmlog": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", - "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", - "requires": { - "ansi": "0.3.1", - "are-we-there-yet": "1.0.6", - "gauge": "1.2.7" - } - }, - "nsp": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/nsp/-/nsp-2.8.1.tgz", - "integrity": "sha512-jvjDg2Gsw4coD/iZ5eQddsDlkvnwMCNnpG05BproSnuG+Gr1bSQMwWMcQeYje+qdDl3XznmhblMPLpZLecTORQ==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-table": "0.3.1", - "cvss": "1.0.2", - "https-proxy-agent": "1.0.0", - "joi": "6.10.1", - "nodesecurity-npm-utils": "5.0.0", - "path-is-absolute": "1.0.1", - "rc": "1.2.1", - "semver": "5.4.1", - "subcommand": "2.1.0", - "wreck": "6.3.0" - }, - "dependencies": { - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "dev": true, - "requires": { - "extend": "3.0.1", - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } - } + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "requires": { + "is-fullwidth-code-point": "2.0.0" + } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, - "cliclopts": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cliclopts/-/cliclopts-1.1.1.tgz", - "integrity": "sha1-aUMcfLWvcjd0sNORG0w3USQxkQ8=", - "dev": true + "smtp-connection": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", + "requires": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" + } }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true + "snappy": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/snappy/-/snappy-4.1.2.tgz", + "integrity": "sha1-jN2cAIK5sF8VfsVv2RLBd0QBQps=", + "requires": { + "bindings": "1.2.1", + "nan": "2.2.0", + "node-gyp": "3.2.1" + } }, - "cvss": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cvss/-/cvss-1.0.2.tgz", - "integrity": "sha1-32fpK/EqeW9J6Sh5nI2zunS5/NY=", - "dev": true + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sse": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/sse/-/sse-0.0.8.tgz", + "integrity": "sha512-cviG7JH31TUhZeaEVhac3zTzA+2FwA7qvHziAHpb7mC7RNVJ/RbHN+6LIGsS2ugP4o2H15DWmrSMK+91CboIcg==", + "requires": { + "options": "0.0.6" + } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "step": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/step/-/step-0.0.6.tgz", + "integrity": "sha1-FD54SaXX0/SgiP4pr5SRUhbu7eI=" + }, + "stream-combiner": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.2.tgz", + "integrity": "sha1-3+DnRnV0JWXnbGBWeI6lwjvZfbQ=", + "requires": { + "duplexer": "0.0.4" + } }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "stream-serializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/stream-serializer/-/stream-serializer-1.1.2.tgz", + "integrity": "sha1-wfl9FdolH1lK4n1B7IraCahG408=" }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" - } - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } }, - "isemail": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=", - "dev": true - }, - "joi": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", - "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", - "dev": true, - "requires": { - "hoek": "2.16.3", - "isemail": "1.2.0", - "moment": "2.18.1", - "topo": "1.1.0" - } + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "5.1.1" + } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } + } }, - "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", - "dev": true + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, - "nodesecurity-npm-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nodesecurity-npm-utils/-/nodesecurity-npm-utils-5.0.0.tgz", - "integrity": "sha1-Baow3jDKjIRcQEjpT9eOXgi1Xtk=", - "dev": true + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "strong-error-handler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-2.3.0.tgz", + "integrity": "sha512-aBeGbfOBm2LyAtno8yXJSRNDW3vZxjIHNI6y120WirkDIPV5Ytcx9Y1IG22qo3tXi6Zo2s1OJssUM9ji8PzwXA==", + "requires": { + "accepts": "1.3.5", + "debug": "2.6.9", + "ejs": "2.6.1", + "http-status": "1.2.0", + "js2xmlparser": "3.0.0", + "strong-globalize": "3.3.0" + }, + "dependencies": { + "strong-globalize": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", + "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "requires": { + "accept-language": "3.0.18", + "async": "2.6.1", + "debug": "3.1.0", + "esprima": "4.0.0", + "estraverse": "4.2.0", + "g11n-pipeline": "2.0.6", + "globalize": "1.3.0", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "mktmpdir": "0.1.1", + "optional": "0.1.4", + "os-locale": "2.1.0", + "posix-getopt": "1.2.0", + "word-count": "0.2.2", + "xtend": "4.0.1", + "yamljs": "0.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + } + } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } + "strong-globalize": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-4.1.1.tgz", + "integrity": "sha512-WeuQM1oXEiFppxgqYn4bU5L7J6MjE5LPfmCtCrrs8DnGNLlXoRX0n3ZgTqw/CaG6Hcj4LPB/egBGOk3Dew7j0g==", + "requires": { + "accept-language": "3.0.18", + "debug": "3.1.0", + "globalize": "1.3.0", + "lodash": "4.17.10", + "md5": "2.2.1", + "mkdirp": "0.5.1", + "os-locale": "2.1.0", + "yamljs": "0.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true + "strong-remoting": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/strong-remoting/-/strong-remoting-3.12.0.tgz", + "integrity": "sha512-GNH0Uz+sChRDhZe8KSSQ4DlLf385bLUmNGpTVqhZrYuuQV7TTYYYPx0aJ1sRXluJyxgmV95WlkW6yxkAft/ijg==", + "requires": { + "async": "2.6.1", + "body-parser": "1.18.3", + "debug": "3.1.0", + "depd": "1.1.2", + "escape-string-regexp": "1.0.5", + "eventemitter2": "5.0.1", + "express": "4.16.3", + "inflection": "1.12.0", + "jayson": "2.0.6", + "js2xmlparser": "3.0.0", + "loopback-datatype-geopoint": "1.0.0", + "loopback-phase": "3.2.0", + "mux-demux": "3.7.9", + "qs": "6.5.2", + "request": "2.87.0", + "sse": "0.0.8", + "strong-error-handler": "2.3.0", + "strong-globalize": "4.1.1", + "traverse": "0.6.6", + "xml2js": "0.4.19" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } + "superagent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", + "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.0.6", + "debug": "2.6.9", + "extend": "3.0.1", + "form-data": "1.0.0-rc4", + "formidable": "1.2.1", + "methods": "1.1.2", + "mime": "1.4.1", + "qs": "6.5.2", + "readable-stream": "2.3.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "form-data": { + "version": "1.0.0-rc4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", + "dev": true, + "requires": { + "async": "1.5.2", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + } + } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "subcommand": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/subcommand/-/subcommand-2.1.0.tgz", - "integrity": "sha1-XkzspaN3njNlsVEeBfhmh3MC92A=", - "dev": true, - "requires": { - "cliclopts": "1.1.1", - "debug": "2.6.9", - "minimist": "1.2.0", - "xtend": "4.0.1" - } + "supertest": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.1.0.tgz", + "integrity": "sha512-O44AMnmJqx294uJQjfUmEyYOg7d9mylNFsMw/Wkz4evKd1njyPrtCN+U6ZIC7sKtfEVQhfTqFFijlXx8KP/Czw==", + "dev": true, + "requires": { + "methods": "1.1.2", + "superagent": "3.8.2" + }, + "dependencies": { + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "superagent": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", + "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.1.2", + "debug": "3.1.0", + "extend": "3.0.1", + "form-data": "2.3.2", + "formidable": "1.2.1", + "methods": "1.1.2", + "mime": "1.4.1", + "qs": "6.5.2", + "readable-stream": "2.3.6" + } + } + } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "topo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", - "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "wreck": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", - "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", - "dev": true, - "requires": { - "boom": "2.10.1", - "hoek": "2.16.3" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "swagger-client": { + "version": "3.8.6", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.8.6.tgz", + "integrity": "sha1-TxiDhEkYwNEjgC1bThBp/jRCUlQ=", + "requires": { + "@kyleshockey/object-assign-deep": "0.4.2", + "babel-runtime": "6.26.0", + "btoa": "1.1.2", + "buffer": "5.1.0", + "cookie": "0.3.1", + "cross-fetch": "0.0.8", + "deep-extend": "0.5.1", + "encode-3986": "1.0.0", + "fast-json-patch": "2.0.6", + "isomorphic-form-data": "0.0.1", + "js-yaml": "3.12.0", + "lodash": "4.17.10", + "qs": "6.5.2", + "querystring-browser": "1.0.4", + "url": "0.11.0", + "utf8-bytes": "0.0.1", + "utfstring": "2.0.0" + } }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "oauth": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==" - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - } - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "passport": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.3.2.tgz", - "integrity": "sha1-ndAJ+RXo/glbASSgG4+C2gdRAQI=", - "requires": { - "passport-strategy": "1.0.0", - "pause": "0.0.1" - } - }, - "passport-ldapauth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.0.0.tgz", - "integrity": "sha1-Qt/wBEFxhdCk2fd2o+7Y1HMf1ok=", - "requires": { - "@types/node": "7.0.52", - "@types/passport": "0.3.5", - "ldapauth-fork": "4.0.2", - "passport-strategy": "1.0.0" - } - }, - "passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", - "requires": { - "passport-strategy": "1.0.0" - } - }, - "passport-openidconnect": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/passport-openidconnect/-/passport-openidconnect-0.0.2.tgz", - "integrity": "sha1-5Ij4vbOGyan9OckdWrjIgBVugVM=", - "requires": { - "oauth": "0.9.15", - "passport-strategy": "1.0.0", - "request": "2.81.0", - "webfinger": "0.4.2" - } - }, - "passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" - }, - "path-array": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", - "integrity": "sha1-fi8PNfB6IBUSK4aLfqwOssT+wnE=", - "requires": { - "array-index": "1.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "1.1.2" - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "requires": { - "find-up": "1.1.2" - } - }, - "platform": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.4.tgz", - "integrity": "sha1-bw+xftqqSPIUQrOpdcBjEw8cPr0=" - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "posix-getopt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/posix-getopt/-/posix-getopt-1.2.0.tgz", - "integrity": "sha1-Su7rfa3mb8qKk2XdqfawBXQctiE=" - }, - "postal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/postal/-/postal-2.0.5.tgz", - "integrity": "sha1-f58DWUOiTaqZY6xaU7XQzwffJLk=", - "requires": { - "lodash": "4.17.4" - } - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "rabbot": { - "version": "https://github.com/fullcube/rabbot/tarball/bbd6343777f8f341d592711e8e2bf23fe2ad76f5", - "integrity": "sha512-FB6koa2jnLbzVutyokovM/OuvVApUwnNwIC+JJjEXDF7cGUIjaG52VThZGaPwKBVUysf2rbOk0exATqgvYFEZQ==", - "requires": { - "amqplib": "0.5.2", - "bluebird": "3.5.0", - "bluebird-defer": "1.0.0", - "debug": "2.2.0", - "lodash": "4.17.4", - "machina": "2.0.2", - "monologue.js": "0.3.5", - "postal": "2.0.5", - "uuid": "3.2.1", - "whistlepunk": "0.3.3" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "referrer-policy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", - "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - }, - "dependencies": { - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - } - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" - } - } - }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "2.0.0", - "semver": "5.4.1" - } - }, - "resolve": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", - "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "retry": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz", - "integrity": "sha1-/ckO7ZQ/3hG4k1VLjMY9DombqRg=" - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - } - }, - "riveter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/riveter/-/riveter-0.2.0.tgz", - "integrity": "sha1-H3yOhlxFURX95ZS+JLAHLr3IvuQ=", - "requires": { - "lodash": "2.4.2" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" - } - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "requires": { - "rx-lite": "3.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "safe-json-stringify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz", - "integrity": "sha1-gaCY9Efku8P/MxKiQ1IbwGDvWRE=", - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "requires": { - "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } + "swagger-ui": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-2.2.10.tgz", + "integrity": "sha1-sl56IWZOXZC/OR2zDbCN5B6FLXs=" }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.4.1", + "lodash": "4.17.10", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "serve-favicon": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", - "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "ms": "2.0.0", - "parseurl": "1.3.2", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shortid": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", - "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0" - } - }, - "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" - }, - "smtp-connection": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", - "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", - "requires": { - "httpntlm": "1.6.1", - "nodemailer-shared": "1.1.0" - } - }, - "snappy": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/snappy/-/snappy-4.1.2.tgz", - "integrity": "sha1-jN2cAIK5sF8VfsVv2RLBd0QBQps=", - "requires": { - "bindings": "1.2.1", - "nan": "2.2.0", - "node-gyp": "3.2.1" - }, - "dependencies": { - "nan": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", - "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=" - } - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.16.3" - } - }, - "socks": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", - "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sse": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/sse/-/sse-0.0.6.tgz", - "integrity": "sha1-MZJGHfo4x4Qk3Zv46gJWGaElqhA=", - "requires": { - "options": "0.0.6" - }, - "dependencies": { - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" - } - } - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "stable": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", - "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=" - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - }, - "step": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/step/-/step-0.0.6.tgz", - "integrity": "sha1-FD54SaXX0/SgiP4pr5SRUhbu7eI=" - }, - "stream-combiner": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.2.tgz", - "integrity": "sha1-3+DnRnV0JWXnbGBWeI6lwjvZfbQ=", - "requires": { - "duplexer": "0.0.4" - } - }, - "stream-serializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/stream-serializer/-/stream-serializer-1.1.2.tgz", - "integrity": "sha1-wfl9FdolH1lK4n1B7IraCahG408=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "strong-error-handler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-2.3.0.tgz", - "integrity": "sha512-aBeGbfOBm2LyAtno8yXJSRNDW3vZxjIHNI6y120WirkDIPV5Ytcx9Y1IG22qo3tXi6Zo2s1OJssUM9ji8PzwXA==", - "requires": { - "accepts": "1.3.4", - "debug": "2.2.0", - "ejs": "2.5.7", - "http-status": "1.0.1", - "js2xmlparser": "3.0.0", - "strong-globalize": "3.1.0" - }, - "dependencies": { - "js2xmlparser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", - "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", - "requires": { - "xmlcreate": "1.0.2" - } - } - } - }, - "strong-globalize": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.1.0.tgz", - "integrity": "sha512-n81I4Zc+V9gSju7SW7QoZkMoBH4j806nrJdigBDF8juzbGGDI+TNaiw9moHNHyHwBV9E9zy1bGGmBWm80II6ww==", - "requires": { - "async": "2.6.0", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.4", - "htmlparser2": "3.9.2", - "lodash": "4.17.4", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "strong-remoting": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/strong-remoting/-/strong-remoting-3.8.0.tgz", - "integrity": "sha512-CYBKa7m87allzEHHSSIVnvttYAS3QDP19c2djUwYgXOcQ5AWtHE1y5ajnFBAfEubmUXq4FSYsFeN+Sa+mKmeDA==", - "requires": { - "async": "2.6.0", - "body-parser": "1.18.2", - "debug": "2.2.0", - "depd": "1.1.1", - "escape-string-regexp": "1.0.5", - "eventemitter2": "2.2.2", - "express": "4.16.2", - "inflection": "1.12.0", - "jayson": "1.2.2", - "js2xmlparser": "1.0.0", - "loopback-datatype-geopoint": "1.0.0", - "loopback-phase": "3.1.0", - "mux-demux": "3.7.9", - "qs": "6.4.0", - "request": "2.83.0", - "sse": "0.0.6", - "strong-error-handler": "2.3.0", - "strong-globalize": "3.1.0", - "traverse": "0.6.6", - "xml2js": "0.4.19" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "1.0.2" + } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "to-utf8": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", + "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.0" - } - } - } + "toposort": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-0.2.12.tgz", + "integrity": "sha1-x9KYTz1IwhcxXMMtdwiIt3lJHoE=" }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "1.1.2" + } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" - } + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.18" + } }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.inflections": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/underscore.inflections/-/underscore.inflections-0.2.1.tgz", + "integrity": "sha1-EBvTWeAq8pOqWhBidI6WPiCHZ/E=", + "dev": true, + "requires": { + "underscore": "1.7.0", + "underscore.string": "3.3.4" + } }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - }, - "dependencies": { - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - } - } - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.2.0" - } + "underscore.string": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", + "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "requires": { + "sprintf-js": "1.0.3", + "util-deprecate": "1.0.2" + } }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "1.4.1" - } - } - } - }, - "superagent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", - "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "2.2.0", - "extend": "3.0.1", - "form-data": "1.0.0-rc4", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.3.4", - "qs": "6.4.0", - "readable-stream": "2.3.3" - } - }, - "supertest": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz", - "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=", - "dev": true, - "requires": { - "methods": "1.1.2", - "superagent": "3.8.2" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.15" - } + "utf8-bytes": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz", + "integrity": "sha1-EWsCVEjJtQAIHN+/H01sbDfYg30=" + }, + "utfstring": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/utfstring/-/utfstring-2.0.0.tgz", + "integrity": "sha512-/ugBfyvIoLe9xqkFHio3CxXnpUKQ1p2LfTxPr6QTRj6GiwpHo73YGdh03UmAzDQNOWpNIE0J5nLss00L4xlWgg==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vasync": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", + "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", + "requires": { + "verror": "1.6.0" + }, + "dependencies": { + "extsprintf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", + "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=" + }, + "verror": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", + "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", + "requires": { + "extsprintf": "1.2.0" + } + } + } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "webfinger": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/webfinger/-/webfinger-0.4.2.tgz", + "integrity": "sha1-NHem2XeZRhiWA5/P/GULc0aO520=", + "requires": { + "step": "0.0.6", + "xml2js": "0.1.14" + }, + "dependencies": { + "xml2js": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.1.14.tgz", + "integrity": "sha1-UnTmf1pkxfkpdM2FE54DMq3GuQw=", + "requires": { + "sax": "1.2.4" + } + } + } }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "2.0.0" + } }, - "superagent": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", - "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.2", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.1", - "readable-stream": "2.3.3" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "swagger-client": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.4.4.tgz", - "integrity": "sha1-5eiFXe0x00EUMctyfSGryCq4ao4=", - "requires": { - "babel-runtime": "6.26.0", - "btoa": "1.1.2", - "cookie": "0.3.1", - "cross-fetch": "0.0.8", - "deep-extend": "0.4.2", - "encode-3986": "1.0.0", - "fast-json-patch": "1.1.8", - "isomorphic-form-data": "0.0.1", - "js-yaml": "3.10.0", - "lodash": "4.17.4", - "qs": "6.4.0", - "url": "0.11.0", - "utf8-bytes": "0.0.1", - "utfstring": "2.0.0" - } - }, - "swagger-ui": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-2.2.10.tgz", - "integrity": "sha1-sl56IWZOXZC/OR2zDbCN5B6FLXs=" - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } + "whistlepunk": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/whistlepunk/-/whistlepunk-0.3.3.tgz", + "integrity": "sha1-gTM/hp+bd0KbKRWjUAEkyEwTtWA=", + "requires": { + "colors": "1.0.3", + "debug": "2.2.0", + "lodash": "3.10.1", + "machina": "1.1.2", + "moment": "2.10.2", + "postal": "1.0.11", + "when": "3.7.8" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "machina": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/machina/-/machina-1.1.2.tgz", + "integrity": "sha1-GMq+pfqet8AyQI6zCf6yr3qDckc=", + "requires": { + "lodash": "3.10.1" + } + }, + "moment": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.10.2.tgz", + "integrity": "sha1-+vjAnKgvA/lJYuO1pyOSY+pQ0Ic=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "postal": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/postal/-/postal-1.0.11.tgz", + "integrity": "sha1-ejf/YCaGJthFzAM25X2QokU2l50=", + "requires": { + "lodash": "4.17.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } + } + } + } }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } + "word-count": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/word-count/-/word-count-0.2.2.tgz", + "integrity": "sha1-aZGS/KaCn+k21Byw2V25JIxXBFE=" }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "requires": { + "mkdirp": "0.5.1" + } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "to-utf8": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", - "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" - }, - "toposort": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-0.2.12.tgz", - "integrity": "sha1-x9KYTz1IwhcxXMMtdwiIt3lJHoE=" - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "requires": { - "punycode": "1.4.1" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" - }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-detect": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", - "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", - "dev": true - }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.15" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" - }, - "underscore.inflections": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/underscore.inflections/-/underscore.inflections-0.2.1.tgz", - "integrity": "sha1-EBvTWeAq8pOqWhBidI6WPiCHZ/E=", - "dev": true, - "requires": { - "underscore": "1.7.0", - "underscore.string": "3.3.4" - } - }, - "underscore.string": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", - "requires": { - "sprintf-js": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "utf8-bytes": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz", - "integrity": "sha1-EWsCVEjJtQAIHN+/H01sbDfYg30=" - }, - "utfstring": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/utfstring/-/utfstring-2.0.0.tgz", - "integrity": "sha512-/ugBfyvIoLe9xqkFHio3CxXnpUKQ1p2LfTxPr6QTRj6GiwpHo73YGdh03UmAzDQNOWpNIE0J5nLss00L4xlWgg==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vasync": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", - "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", - "requires": { - "verror": "1.6.0" - }, - "dependencies": { - "extsprintf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", - "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=" + "x-xss-protection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.1.0.tgz", + "integrity": "sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg==" }, - "verror": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", - "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", - "requires": { - "extsprintf": "1.2.0" - } - } - } - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "requires": { - "extsprintf": "1.0.2" - } - }, - "webfinger": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/webfinger/-/webfinger-0.4.2.tgz", - "integrity": "sha1-NHem2XeZRhiWA5/P/GULc0aO520=", - "requires": { - "step": "0.0.6", - "xml2js": "0.1.14" - }, - "dependencies": { "xml2js": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.1.14.tgz", - "integrity": "sha1-UnTmf1pkxfkpdM2FE54DMq3GuQw=", - "requires": { - "sax": "1.2.4" - } - } - } - }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" - }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "requires": { - "isexe": "2.0.0" - } - }, - "whistlepunk": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/whistlepunk/-/whistlepunk-0.3.3.tgz", - "integrity": "sha1-gTM/hp+bd0KbKRWjUAEkyEwTtWA=", - "requires": { - "colors": "1.0.3", - "debug": "2.2.0", - "lodash": "3.10.1", - "machina": "1.1.2", - "moment": "2.10.2", - "postal": "1.0.11", - "when": "3.7.8" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": "1.2.4", + "xmlbuilder": "9.0.7" + } }, - "machina": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/machina/-/machina-1.1.2.tgz", - "integrity": "sha1-GMq+pfqet8AyQI6zCf6yr3qDckc=", - "requires": { - "lodash": "3.10.1" - } + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, - "moment": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.10.2.tgz", - "integrity": "sha1-+vjAnKgvA/lJYuO1pyOSY+pQ0Ic=" + "xmlcreate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", + "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=" }, - "postal": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/postal/-/postal-1.0.11.tgz", - "integrity": "sha1-ejf/YCaGJthFzAM25X2QokU2l50=", - "requires": { - "lodash": "4.17.5" - }, - "dependencies": { - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" - } - } + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "requires": { + "argparse": "1.0.10", + "glob": "7.1.2" + } } - } - }, - "word-count": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/word-count/-/word-count-0.2.2.tgz", - "integrity": "sha1-aZGS/KaCn+k21Byw2V25JIxXBFE=" - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "requires": { - "mkdirp": "0.5.1" - } - }, - "x-xss-protection": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz", - "integrity": "sha1-iYr7k4abJGYc+cUvnujbjtB2Tdk=" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.4" - } - }, - "xmlbuilder": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", - "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=" - }, - "xmlcreate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", - "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "requires": { - "argparse": "1.0.9", - "glob": "7.1.2" - } } - } } diff --git a/package.json b/package.json index b5adf880..490a8f22 100644 --- a/package.json +++ b/package.json @@ -1,51 +1,54 @@ { - "name": "dacat-api", - "version": "2.8.0", - "main": "server/server.js", - "scripts": { - "lint": "eslint common/models", - "start": "node .", - "posttests": "npm run lint && nsp check", - "test": "./node_modules/mocha/bin/mocha --timeout=10000 --reporter spec --exit 2>/dev/null" - }, - "dependencies": { - "compression": "1.7.1", - "cors": "2.8.4", - "helmet": "3.9.0", - "loopback": "3.16.2", - "loopback-boot": "2.27.0", - "loopback-component-explorer": "5.2.0", - "loopback-component-model-diagram": "0.3.0", - "loopback-component-mq": "^2.2.5", - "loopback-component-passport": "3.4.1", - "loopback-component-visualizer": "1.2.1", - "loopback-connector-kafka": "^0.2.1", - "loopback-connector-mongodb": "3.3.0", - "loopback-ds-timestamp-mixin": "^3.4.1", - "moment": "^2.20.1", - "moment-timezone": "^0.5.14", - "nodemailer": "^4.3.1", - "passport-ldapauth": "2.0.0", - "passport-local": "1.0.0", - "passport-openidconnect": "0.0.2", - "serve-favicon": "2.4.5", - "strong-error-handler": "2.3.0", - "uuid": "^3.2.1" - }, - "devDependencies": { - "@mean-expert/loopback-sdk-builder": "2.1.0", - "chai": "^4.1.2", - "chai-http": "^3.0.0", - "eslint": "4.10.0", - "eslint-config-loopback": "8.0.0", - "mocha": "^4.1.0", - "nsp": "2.8.1", - "supertest": "^3.0.0" - }, - "repository": { - "type": "", - "url": "" - }, - "license": "GPL-3.0", - "description": "dacat-api" + "name": "dacat-api", + "version": "2.8.1", + "main": "server/server.js", + "engines": { + "node": ">=4" + }, + "scripts": { + "lint": "eslint common/models", + "start": "node .", + "posttests": "npm run lint && nsp check", + "test": "./node_modules/mocha/bin/mocha --timeout=10000 --reporter spec --exit 2>/dev/null" + }, + "dependencies": { + "compression": "^1.0.3", + "cors": "^2.5.2", + "helmet": "^3.10.0", + "loopback-boot": "^2.6.5", + "serve-favicon": "2.4.5", + "strong-error-handler": "2.3.0", + "loopback-component-explorer": "^6.0.0", + "loopback": "^3.19.0", + "loopback-component-model-diagram": "^0.3.0", + "loopback-component-mq": "^2.2.5", + "loopback-component-passport": "^3.4.1", + "loopback-component-visualizer": "^1.2.1", + "loopback-connector-kafka": "^0.2.1", + "loopback-connector-mongodb": "^3.3.0", + "loopback-ds-timestamp-mixin": "^3.4.1", + "moment": "^2.20.1", + "moment-timezone": "^0.5.14", + "nodemailer": "^4.3.1", + "passport-ldapauth": "^2.0.0", + "passport-local": "^1.0.0", + "passport-openidconnect": "^0.0.2", + "uuid": "^3.2.1" + }, + "devDependencies": { + "eslint": "^3.17.1", + "eslint-config-loopback": "^8.0.0", + "nsp": "^2.1.0", + "@mean-expert/loopback-sdk-builder": "^2.1.0", + "chai": "^4.1.2", + "chai-http": "^3.0.0", + "mocha": "^4.1.0", + "supertest": "^3.0.0" + }, + "repository": { + "type": "", + "url": "" + }, + "license": "GPL-3.0", + "description": "dacat-api" } diff --git a/test/Dataset.js b/test/Dataset.js index a42a8b31..a7b14862 100644 --- a/test/Dataset.js +++ b/test/Dataset.js @@ -111,9 +111,9 @@ describe('Simple Dataset tests', () => { .expect(200) .expect('Content-Type', /json/) .end((err, res) => { - res.body.should.be.an('array'); if(err) - done(err); + return done(err); + res.body.should.be.an('array'); done(); }); }); From 834adf9c20095dfdbc90f0e062d47512fd4cdca0 Mon Sep 17 00:00:00 2001 From: murphy_g Date: Wed, 13 Jun 2018 14:33:45 +0200 Subject: [PATCH 003/147] Update server.js --- server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server.js b/server/server.js index 03bd30c4..7ad1d5b6 100644 --- a/server/server.js +++ b/server/server.js @@ -60,7 +60,7 @@ passportConfigurator.buildUserLdapProfile = function(user, options) { } if (!profile.id) { profile.id = user['uid']; - if (!(uid in user)){ + if (!('uid' in user)){ const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341'; const generated_id = uuidv3( user['mail'], MY_NAMESPACE); profile.id = generated_id; From b1f2e7ab315e8d74455ad11f5da2602498b783df Mon Sep 17 00:00:00 2001 From: murphy_g Date: Mon, 18 Jun 2018 11:39:58 +0200 Subject: [PATCH 004/147] Update Dockerfile.proxy --- CI/ESS/Dockerfile.proxy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CI/ESS/Dockerfile.proxy b/CI/ESS/Dockerfile.proxy index 86deee26..6e7fab9f 100644 --- a/CI/ESS/Dockerfile.proxy +++ b/CI/ESS/Dockerfile.proxy @@ -31,7 +31,7 @@ COPY CI/ESS/envfiles/middleware.json /usr/src/app/server/ #COPY CI/ESS/envfiles/providers.json /usr/src/app/server/ #COPY CI/ESS/envfiles/datasources.json /usr/src/app/server/ #COPY CI/ESS/envfiles/component-config.json /usr/src/app/server/ -COPY CI/ESS/start.sh /usr/src/app/start.sh +#COPY CI/ESS/start.sh /usr/src/app/start.sh #COPY CI/ESS/settings.json /usr/src/app/test/config/ RUN NODE_ENV=dev # Start the app From 9adc6013107fe23a8bb9b29be09b79e610661bd1 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 20 Jun 2018 11:02:22 +0200 Subject: [PATCH 005/147] Fixed proposalIngest 500 code for missing measurement period --- common/models/proposal.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/common/models/proposal.js b/common/models/proposal.js index 939c573a..78a10dd8 100644 --- a/common/models/proposal.js +++ b/common/models/proposal.js @@ -6,19 +6,25 @@ module.exports = function(Proposal) { // put Proposal.beforeRemote('replaceOrCreate', function(ctx, instance, next) { // handle embedded datafile documents - utils.updateAllTimesToUTC(["start", "end"], ctx.args.data.MeasurementPeriodList) + if ("MeasurementPeriodList" in ctx.args.data) { + utils.updateAllTimesToUTC(["start", "end"], ctx.args.data.MeasurementPeriodList) + } next(); }); //patch Proposal.beforeRemote('patchOrCreate', function(ctx, instance, next) { - utils.updateAllTimesToUTC(["start", "end"], ctx.args.data.MeasurementPeriodList) + if ("MeasurementPeriodList" in ctx.args.data) { + utils.updateAllTimesToUTC(["start", "end"], ctx.args.data.MeasurementPeriodList) + } next(); }); //post Proposal.beforeRemote('create', function(ctx, unused, next) { - utils.updateAllTimesToUTC(["start", "end"], ctx.args.data.MeasurementPeriodList) + if ("MeasurementPeriodList" in ctx.args.data) { + utils.updateAllTimesToUTC(["start", "end"], ctx.args.data.MeasurementPeriodList) + } next(); }); From 097a4a89296f4b5608cced680f4546b5d1206d4c Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 25 Jun 2018 15:07:06 +0200 Subject: [PATCH 006/147] Additional mocha tests for issue #501 --- test/Proposal.js | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 test/Proposal.js diff --git a/test/Proposal.js b/test/Proposal.js new file mode 100644 index 00000000..972420c4 --- /dev/null +++ b/test/Proposal.js @@ -0,0 +1,82 @@ +/* jshint node:true */ +/* jshint esversion:6 */ +'use strict'; + +// process.env.NODE_ENV = 'test'; + +var chai = require('chai'); +var chaiHttp = require('chai-http'); +var request = require('supertest'); +var app = require('../server/server'); +var should = chai.should(); +var utils = require('./LoginUtils'); + +var accessToken = null, + proposalId = null; + +var testdataset = { + "proposalId": "20170266", + "email": "proposer%40uni.edu", + "title": "A test proposal", + "abstract": "Abstract of test proposal", + "ownerGroup": "20170251-group" + +} + +describe('Simple Proposal tests', () => { + before((done) => { + utils.getToken(app, { + 'username': 'proposalIngestor', + 'password': 'aman' + }, + (tokenVal) => { + accessToken = tokenVal; + done(); + }); + }); + + it('adds a new proposal', function(done) { + request(app) + .post('/api/v2/Proposals?access_token=' + accessToken) + .send(testdataset) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + res.body.should.have.property('ownerGroup').and.be.string; + res.body.should.have.property('proposalId').and.be.string; + proposalId = encodeURIComponent(res.body['proposalId']); + done(); + }); + }); + + it('should fetch this new proposal', function(done) { + request(app) + .get('/api/v2/Proposals/' + proposalId + '?access_token=' + accessToken) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + it('should delete this proposal', function(done) { + request(app) + .delete('/api/v2/Proposals/' + proposalId + '?access_token=' + accessToken) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + +}); From e6238b6d180aac56bb869274c75257984df4a92b Mon Sep 17 00:00:00 2001 From: egli Date: Wed, 27 Jun 2018 11:45:18 +0200 Subject: [PATCH 007/147] Initial changes to the model logic to allow for automated job creation, not ready yet --- common/models/job.js | 1 + common/models/orig-datablock.js | 4 +- common/models/utils.js | 112 ++++++++++++++++++++++++++++++-- 3 files changed, 109 insertions(+), 8 deletions(-) diff --git a/common/models/job.js b/common/models/job.js index 54a5eb1c..5807c7d9 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -26,6 +26,7 @@ module.exports = function (Job) { // make some consistency checks: // - ensure that all wanted datasets exist already // - TODO: for archive jobs all datasetslifecycle should be in an "archiveable" state + // TODO ensure that job is created by user who has read access to all datasets in case of retrieve JOBS var Dataset = app.models.Dataset; // create array of all pids // console.log("Verifying datasets:",ctx.options) diff --git a/common/models/orig-datablock.js b/common/models/orig-datablock.js index fef6a976..8b4da21e 100644 --- a/common/models/orig-datablock.js +++ b/common/models/orig-datablock.js @@ -35,8 +35,8 @@ module.exports = function(Origdatablock) { // transfer size info to dataset Origdatablock.observe('after save', (ctx, next) => { var OrigDatablock = app.models.OrigDatablock + utils.createArchiveJob(app.models.UserIdentity, app.models.Policy, app.models.Job, ctx) utils.transferSizeToDataset(OrigDatablock, 'size', ctx, next) - }) Origdatablock.isValid = function(instance, next) { @@ -54,4 +54,4 @@ module.exports = function(Origdatablock) { } }); } -}; +} diff --git a/common/models/utils.js b/common/models/utils.js index e6885015..c51e622c 100644 --- a/common/models/utils.js +++ b/common/models/utils.js @@ -128,22 +128,47 @@ exports.createNewFacetPipeline = function(name, type, query) { const pipeline = []; if (type.constructor === Array) { - pipeline.push({ $unwind: '$'+name }); + pipeline.push({ + $unwind: '$' + name + }); } // add all conditions from "other" facets, exclude own conditions if (query && Object.keys(query).length > 0) { //console.log("createFacet query:",query); var q = Object.assign({}, query); delete q[name]; - if(Object.keys(q).length > 0) - pipeline.push({$match: q}); + if (Object.keys(q).length > 0) + pipeline.push({ + $match: q + }); } - let grp = {$group: {_id: '$' + name, count: {$sum: 1}}}; + let grp = { + $group: { + _id: '$' + name, + count: { + $sum: 1 + } + } + }; if (type === 'date') { - grp.$group._id = {year: {$year: '$' + name}, month: {$month: '$' + name}, day: {$dayOfMonth: '$' + name}} + grp.$group._id = { + year: { + $year: '$' + name + }, + month: { + $month: '$' + name + }, + day: { + $dayOfMonth: '$' + name + } + } } pipeline.push(grp); - const sort = {$sort: {_id: -1}}; + const sort = { + $sort: { + _id: -1 + } + }; pipeline.push(sort); return pipeline; } @@ -213,3 +238,78 @@ exports.handleOwnerGroups = function(ctx, next) { } }); } + +// TODO minimize number of parabers: +exports.createArchiveJob = function(UserIdentity, Policy, Job, ctx) { + var instance = ctx.instance + if (!instance) { + instance = ctx.currentInstance + } + console.log("Instance:", JSON.stringify(instance)) + + const token = ctx.options && ctx.options.accessToken; + const userId = token && token.userId; + + console.log("options, userid:", ctx.options, userId) + //const user = userId ? 'user#' + userId : ''; + UserIdentity.findOne({ + where: { + userId: userId + } + }, function(err, user) { + console.log("UserIdentity Instance:", user) + // TODO: get it from User models + // TODO get proper emails in case of unctional accounts + // TODO remove console.log messages + // TODO add test cases + // TODO add creationTime (should not be needed any more) + var email + var login + if (user && user.profile) { + login = user.profile.login + email = user.profile.email + } else { + login = Object.keys(ctx.options.authorizedRoles)[0] + email = login + } + console.log("Email:", email) // check if a normal user or an internal ROLE + Policy.findOne({ + where: { + ownerGroup: instance.ownerGroup + } + }, function(err2, policyInstance) { + // get policy values for the instance.ownerGroups + if (err2) { + console.log("Error when looking for Policy of pgroup ", instance.ownerGroup, err2) + } else { + var jobParams = {} + jobParams.username = login + if (policyInstance) { + jobParams.autoArchive = (autoArchive in policyInstance) ? policyInstance.autoArchive : false + jobParams.tapeCopies = (tapeCopies in policyInstance) ? policyInstance.tapeCopies : "one" + } else { + console.log("No policy settings found for ownerGroup", instance.ownerGroup) + console.log("Assuming default values") + jobParams.autoArchive = false + jobParams.tapeCopies = "one" + } + var body = { + emailJobInitiator: email, + type: "archive", + jobParams: jobParams, + datasetList: [{ + pid: instance.datasetId, + files: [] + }] + } + console.log("Job body:", body) + if (jobParams.autoArchive) { + Job.create(body, function(err, jobmodel) { + console.log("Created Job:", err, jobmodel) + }) + } + } + + }) + }) +}; From 0455c3701b72b2145f90bc75932504c4a4abc38e Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 27 Jun 2018 14:30:09 +0200 Subject: [PATCH 008/147] added additional properties to policy model --- common/models/policy.json | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/common/models/policy.json b/common/models/policy.json index a7dcba92..70513b29 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -8,7 +8,11 @@ "validateUpsert": true }, "properties": { - "availability": { + "manager": { + "type": "string", + "description": "Defines the users that can modify the policy parameters" + }, + "tapeRedundancy": { "type": "string", "description": "Defines the level of redundancy in storage to minimize loss of data. Allowed values are low, medium, high. Low could e.g. mean one tape copy only, medium could mean two tape copies and high two geo-redundant tape copies", "default": "low" @@ -22,6 +26,24 @@ "type": "number", "description": "Number of days after dataset creation that (remaining) datasets are archived automatically", "default": 7 + }, + "archiveEmailNotification": { + "type": "boolean", + "description": "Flag is true when an email notification should be sent to archiveEmailsToBeNotified upon an archive job creation", + "default": false + }, + "archiveEmailsToBeNotified": { + "type": "string", + "description": "Array of additional email addresses that should be notified up an archive job creation" + }, + "retrieveEmailNotification": { + "type": "boolean", + "description": "Flag is true when an email notification should be sent to retrieveEmailsToBeNotified upon a retrieval job creation", + "default": false + }, + "retrieveEmailsToBeNotified": { + "type": "string", + "description": "Array of additional email addresses that should be notified up a retrieval job creation" } }, "validations": [], From 837a42ae24987224087d2e5525d00538f86729b2 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 27 Jun 2018 15:11:12 +0200 Subject: [PATCH 009/147] added additional properties to policy model --- common/models/policy.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/models/policy.json b/common/models/policy.json index 70513b29..fe5d98a5 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -9,7 +9,7 @@ }, "properties": { "manager": { - "type": "string", + "type": "array", "description": "Defines the users that can modify the policy parameters" }, "tapeRedundancy": { @@ -33,7 +33,7 @@ "default": false }, "archiveEmailsToBeNotified": { - "type": "string", + "type": "array", "description": "Array of additional email addresses that should be notified up an archive job creation" }, "retrieveEmailNotification": { @@ -42,7 +42,7 @@ "default": false }, "retrieveEmailsToBeNotified": { - "type": "string", + "type": "array", "description": "Array of additional email addresses that should be notified up a retrieval job creation" } }, From a2415a06309ea95c86126ca109c605a41cc7dd08 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Thu, 28 Jun 2018 10:23:59 +0200 Subject: [PATCH 010/147] corrected loopback array syntax --- common/models/policy.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/models/policy.json b/common/models/policy.json index fe5d98a5..e8d8be79 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -9,7 +9,7 @@ }, "properties": { "manager": { - "type": "array", + "type": ["array"], "description": "Defines the users that can modify the policy parameters" }, "tapeRedundancy": { @@ -33,7 +33,7 @@ "default": false }, "archiveEmailsToBeNotified": { - "type": "array", + "type": ["array"], "description": "Array of additional email addresses that should be notified up an archive job creation" }, "retrieveEmailNotification": { @@ -42,7 +42,7 @@ "default": false }, "retrieveEmailsToBeNotified": { - "type": "array", + "type": ["array"], "description": "Array of additional email addresses that should be notified up a retrieval job creation" } }, From f057e96b578c87826c5efa02fcd7450fd4c34e2d Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Thu, 28 Jun 2018 10:24:37 +0200 Subject: [PATCH 011/147] corrected loopback array syntax again --- common/models/policy.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/models/policy.json b/common/models/policy.json index e8d8be79..8e9adf16 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -9,7 +9,7 @@ }, "properties": { "manager": { - "type": ["array"], + "type": ["string"], "description": "Defines the users that can modify the policy parameters" }, "tapeRedundancy": { @@ -33,7 +33,7 @@ "default": false }, "archiveEmailsToBeNotified": { - "type": ["array"], + "type": ["string"], "description": "Array of additional email addresses that should be notified up an archive job creation" }, "retrieveEmailNotification": { @@ -42,7 +42,7 @@ "default": false }, "retrieveEmailsToBeNotified": { - "type": ["array"], + "type": ["string"], "description": "Array of additional email addresses that should be notified up a retrieval job creation" } }, From a649064a3733522044bf9b7511e4e93fd0bbf4b1 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Fri, 6 Jul 2018 10:13:33 +0200 Subject: [PATCH 012/147] minor edit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 21aa78dc..ff0087dd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# Data Catalog Backend +# SciCat Data Catalog Backend + The data catalog backend is based on [NoSQL database MongoDB](https://www.mongodb.com/), [the Node based web application framework Express](http://expressjs.com/) and [the API framework Loopback](http://loopback.io/) technology stack (the "MEL" part of the "MELANIE" technology stack). It provides a REST based API which allows to store information about datasets and to allow to answer queries about the stored meta data for these datasets # Getting started From b52a001b64ee388e049967d33b0d8e39c9359f2f Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Fri, 6 Jul 2018 14:48:22 +0200 Subject: [PATCH 013/147] Update issue templates --- .github/ISSUE_TEMPLATE/issue-.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/issue-.md diff --git a/.github/ISSUE_TEMPLATE/issue-.md b/.github/ISSUE_TEMPLATE/issue-.md new file mode 100644 index 00000000..60f04d42 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-.md @@ -0,0 +1,19 @@ +--- +name: 'Issue ' +about: Describe this issue purpose here. + +--- + +## Issue Name + +### Summary + +### Steps to Reproduce + +### Current Behaviour + +### Expected Behaviour + +### Extra Details + +Here you should include details about the system (if it is unique) and possible information about a fix (feel free to link to code where relevant). Screenshots/GIFs are also fine here. From 5734ce4c4856385859d5ce2f478830a9337c46b2 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 9 Jul 2018 11:36:48 +0200 Subject: [PATCH 014/147] work in progress, includes temp bug fix to be removed --- common/models/policy.js | 35 +++++++++++++++++++++++++++++++++++ common/models/policy.json | 9 ++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/common/models/policy.js b/common/models/policy.js index 621ec5de..c7972527 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -3,3 +3,38 @@ module.exports = function(Policy) { }; + +//model extension file + +/*var config = require('../../server/config.local'); +var p = require('../../package.json'); +var utils = require('./utils'); +var dsl = require('./dataset-lifecycle.json'); +var ds = require('./dataset.json'); +var dsr = require('./raw-dataset.json'); +var dsd = require('./derived-dataset.json'); +var own = require('./ownable.json'); + +module.exports = function(Policy) { + var app = require('../../server/server'); + console.log("Log: policy.js 1!"); + + // check logged in user email is a member of policy.manager + Policy.observe('before save', (ctx, next) => { + console.log("I am her!!!!!!!!"); + if (ctx.instance) { + var email + var login + if (user && user.profile) { + login = user.profile.login + email = user.profile.email + } else { + login = Object.keys(ctx.options.authorizedRoles)[0] + email = login + } + + } + next(); + }); + }; +*/ diff --git a/common/models/policy.json b/common/models/policy.json index 8e9adf16..6f0382b8 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -48,6 +48,13 @@ }, "validations": [], "relations": {}, - "acls": [], + "acls": [ + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW" + } + ], "methods": {} } From ff4a1d0b673d013729cd768d09b2b268e484b6d9 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 16 Jul 2018 13:27:00 +0200 Subject: [PATCH 015/147] adding published data --- common/models/published-data.js | 20 +++++++++ common/models/published-data.json | 67 ++++++++++++++++++++++++++++ common/models/published-dataset.js | 20 +++++++++ common/models/published-dataset.json | 67 ++++++++++++++++++++++++++++ 4 files changed, 174 insertions(+) create mode 100644 common/models/published-data.js create mode 100644 common/models/published-data.json create mode 100644 common/models/published-dataset.js create mode 100644 common/models/published-dataset.json diff --git a/common/models/published-data.js b/common/models/published-data.js new file mode 100644 index 00000000..63def396 --- /dev/null +++ b/common/models/published-data.js @@ -0,0 +1,20 @@ +'use strict'; +var utils = require('./utils'); + +module.exports = function(PublishedData) { + + // put + PublishedData.beforeRemote('replaceOrCreate', function(ctx, instance, next) { + // convert base64 image + + next(); + }); + + //patch + PublishedData.beforeRemote('patchOrCreate', function(ctx, instance, next) { + next(); + }); + +} + + diff --git a/common/models/published-data.json b/common/models/published-data.json new file mode 100644 index 00000000..0d72c303 --- /dev/null +++ b/common/models/published-data.json @@ -0,0 +1,67 @@ +{ + "name": "PublishedData", + "idInjection": false, + "base": "PersistedModel", + "strict": false, + "options": { + "validateUpsert": true, + "mongodb": { + "collection": "PublishedData" + } + }, + "description": "Digital Object Identifier (DOI) mandatory fields, URL for making dataset metadata accessible online", + "properties": { + "doi": { + "type": "string", + "required": true, + "description": "Digitial Object Identifier", + "default": "retrieve" + }, + "affiliation": { + "type": "string", + "required": true, + "description": "Creator Affiliation", + "default": "retrieve" + }, + "creator": { + "type": "string", + "required": true, + "description": "Creator of dataset/dataset collection", + "default": "retrieve" + }, + "publisher": { + "type": "string", + "required": true, + "description": "Dataset publisher", + "default": "retrieve" + }, + "publicationYear": { + "type": "string", + "required": true, + "description": "YEar of publication ", + "default": "retrieve" + }, + "title": { + "type": "string", + "required": true, + "description": "Title", + "default": "retrieve" + }, + "creationTime": { + "type": "date", + "index": true, + "description": "Time when publication is created. Format according to chapter 5.6 internet date/time format in RFC 3339" + } + }, + "validations": [], + "relations": { + "dataset": { + "type": "belongsTo", + "model": "Dataset", + "foreignKey": "", + "required": true + } + }, + "acls": [], + "methods": {} +} diff --git a/common/models/published-dataset.js b/common/models/published-dataset.js new file mode 100644 index 00000000..91f22b94 --- /dev/null +++ b/common/models/published-dataset.js @@ -0,0 +1,20 @@ +'use strict'; +var utils = require('./utils'); + +module.exports = function(PublishedDataset) { + + // put + PublishedDataset.beforeRemote('replaceOrCreate', function(ctx, instance, next) { + // convert base64 image + + next(); + }); + + //patch + PublishedDataset.beforeRemote('patchOrCreate', function(ctx, instance, next) { + next(); + }); + +} + + diff --git a/common/models/published-dataset.json b/common/models/published-dataset.json new file mode 100644 index 00000000..4d2d39e3 --- /dev/null +++ b/common/models/published-dataset.json @@ -0,0 +1,67 @@ +{ + "name": "PublishedDataset", + "idInjection": false, + "base": "PersistedModel", + "strict": false, + "options": { + "validateUpsert": true, + "mongodb": { + "collection": "PublishedDataset" + } + }, + "description": "Digital Object Identifier (DOI) mandatory fields, URL for making dataset metadata accessible online", + "properties": { + "doi": { + "type": "string", + "required": true, + "description": "Digitial Object Identifier", + "default": "retrieve" + }, + "affiliation": { + "type": "string", + "required": true, + "description": "Creator Affiliation", + "default": "retrieve" + }, + "creator": { + "type": "string", + "required": true, + "description": "Creator of dataset/dataset collection", + "default": "retrieve" + }, + "publisher": { + "type": "string", + "required": true, + "description": "Dataset publisher", + "default": "retrieve" + }, + "publicationYear": { + "type": "string", + "required": true, + "description": "YEar of publication ", + "default": "retrieve" + }, + "title": { + "type": "string", + "required": true, + "description": "Title", + "default": "retrieve" + }, + "creationTime": { + "type": "date", + "index": true, + "description": "Time when publication is created. Format according to chapter 5.6 internet date/time format in RFC 3339" + } + }, + "validations": [], + "relations": { + "dataset": { + "type": "belongsTo", + "model": "Dataset", + "foreignKey": "", + "required": true + } + }, + "acls": [], + "methods": {} +} From 2f96a8cebb926b9a93e8d6728bc20b37efd14519 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 16 Jul 2018 13:28:58 +0200 Subject: [PATCH 016/147] deleting unneeded files --- common/models/published-dataset.js | 20 --------- common/models/published-dataset.json | 67 ---------------------------- 2 files changed, 87 deletions(-) delete mode 100644 common/models/published-dataset.js delete mode 100644 common/models/published-dataset.json diff --git a/common/models/published-dataset.js b/common/models/published-dataset.js deleted file mode 100644 index 91f22b94..00000000 --- a/common/models/published-dataset.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; -var utils = require('./utils'); - -module.exports = function(PublishedDataset) { - - // put - PublishedDataset.beforeRemote('replaceOrCreate', function(ctx, instance, next) { - // convert base64 image - - next(); - }); - - //patch - PublishedDataset.beforeRemote('patchOrCreate', function(ctx, instance, next) { - next(); - }); - -} - - diff --git a/common/models/published-dataset.json b/common/models/published-dataset.json deleted file mode 100644 index 4d2d39e3..00000000 --- a/common/models/published-dataset.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "PublishedDataset", - "idInjection": false, - "base": "PersistedModel", - "strict": false, - "options": { - "validateUpsert": true, - "mongodb": { - "collection": "PublishedDataset" - } - }, - "description": "Digital Object Identifier (DOI) mandatory fields, URL for making dataset metadata accessible online", - "properties": { - "doi": { - "type": "string", - "required": true, - "description": "Digitial Object Identifier", - "default": "retrieve" - }, - "affiliation": { - "type": "string", - "required": true, - "description": "Creator Affiliation", - "default": "retrieve" - }, - "creator": { - "type": "string", - "required": true, - "description": "Creator of dataset/dataset collection", - "default": "retrieve" - }, - "publisher": { - "type": "string", - "required": true, - "description": "Dataset publisher", - "default": "retrieve" - }, - "publicationYear": { - "type": "string", - "required": true, - "description": "YEar of publication ", - "default": "retrieve" - }, - "title": { - "type": "string", - "required": true, - "description": "Title", - "default": "retrieve" - }, - "creationTime": { - "type": "date", - "index": true, - "description": "Time when publication is created. Format according to chapter 5.6 internet date/time format in RFC 3339" - } - }, - "validations": [], - "relations": { - "dataset": { - "type": "belongsTo", - "model": "Dataset", - "foreignKey": "", - "required": true - } - }, - "acls": [], - "methods": {} -} From 3d230e27f9282ac8d13a295d21f017020b73a43d Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 16 Jul 2018 13:43:08 +0200 Subject: [PATCH 017/147] adding fields from workflow discussion --- common/models/published-data.json | 16 ++++++++++++++++ server/model-config.json | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/common/models/published-data.json b/common/models/published-data.json index 0d72c303..37f0e4b2 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -47,6 +47,22 @@ "description": "Title", "default": "retrieve" }, + "pidArray": { + "type": "string", + "required": true, + "description": "Array of one or more PIDS which make up the published data", + "default": "retrieve" + }, + "doiPostedSuccessfullyTime": { + "type": "date", + "index": true, + "description": "time when doi is successfully posted" + }, + "lastModificationTime": { + "type": "date", + "index": true, + "description": "time when last modified" + }, "creationTime": { "type": "date", "index": true, diff --git a/server/model-config.json b/server/model-config.json index 59e9b601..591888ea 100644 --- a/server/model-config.json +++ b/server/model-config.json @@ -55,6 +55,10 @@ "dataSource": "mongo", "public": true }, + "PublishedData": { + "dataSource": "mongo", + "public": true + }, "Datafile": { "dataSource": "transient", "public": false From b8648ab60938b0ee18573b0333460e40118b0b1f Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 16 Jul 2018 13:44:33 +0200 Subject: [PATCH 018/147] add array for PIDs --- common/models/published-data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 37f0e4b2..aaa0295f 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -48,7 +48,7 @@ "default": "retrieve" }, "pidArray": { - "type": "string", + "type":[ "string"], "required": true, "description": "Array of one or more PIDS which make up the published data", "default": "retrieve" From 32b4542903bca41586d93a7831446ee71999b648 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 16 Jul 2018 13:49:06 +0200 Subject: [PATCH 019/147] update description --- common/models/published-data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index aaa0295f..07ecb31a 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -9,7 +9,7 @@ "collection": "PublishedData" } }, - "description": "Digital Object Identifier (DOI) mandatory fields, URL for making dataset metadata accessible online", + "description": "Stores the meta data information for an accessible, published and DOI-identified collection of datasets. It defines a list of mandatory and optional metadata fields to be included. DataCite mandatory fields are included also a full URL and modification times ", "properties": { "doi": { "type": "string", From b5525b4c84701670029b06846c885e2ef428d76a Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 16 Jul 2018 13:49:58 +0200 Subject: [PATCH 020/147] update description --- common/models/published-data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 07ecb31a..48694f9f 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -51,7 +51,7 @@ "type":[ "string"], "required": true, "description": "Array of one or more PIDS which make up the published data", - "default": "retrieve" + "default": ["retrieve"] }, "doiPostedSuccessfullyTime": { "type": "date", From 29306479bf8eae199a341fa0c130098dd269d258 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 16 Jul 2018 13:59:40 +0200 Subject: [PATCH 021/147] Adding published data model (see issue #34) --- common/models/published-data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 48694f9f..89cb5312 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -9,7 +9,7 @@ "collection": "PublishedData" } }, - "description": "Stores the meta data information for an accessible, published and DOI-identified collection of datasets. It defines a list of mandatory and optional metadata fields to be included. DataCite mandatory fields are included also a full URL and modification times ", + "description": "Stores the meta data information for an accessible, published and DOI-identified collection of datasets. It defines a list of mandatory and optional metadata fields to be included. DataCite mandatory fields, a full URL and modification times are included.", "properties": { "doi": { "type": "string", From 4907257cddc282340db3cd29d8c8456f2ff944d9 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 16 Jul 2018 14:22:48 +0200 Subject: [PATCH 022/147] add owner array --- common/models/published-data.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 89cb5312..b01163bc 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -36,10 +36,10 @@ "default": "retrieve" }, "publicationYear": { - "type": "string", + "type": "number", "required": true, - "description": "YEar of publication ", - "default": "retrieve" + "description": "Year of publication ", + "default": "2018" }, "title": { "type": "string", @@ -53,6 +53,12 @@ "description": "Array of one or more PIDS which make up the published data", "default": ["retrieve"] }, + "owner": { + "type":[ "string"], + "required": true, + "description": "Array of one or more owners who can publish data", + "default": ["owner"] + }, "doiPostedSuccessfullyTime": { "type": "date", "index": true, From 8d0ba5c4b2e9d7c243255140cc9ff5837bc5613c Mon Sep 17 00:00:00 2001 From: egli Date: Wed, 18 Jul 2018 11:56:45 +0200 Subject: [PATCH 023/147] Solve issue #39, allow authenticated users to create ownable objects --- common/models/dataset.json | 6 -- common/models/ownable.json | 6 ++ common/models/utils.js | 2 +- test/LoginUtils.js | 14 ++++ test/SITES_PSI/Ownable.js | 144 +++++++++++++++++++++++++++++++++++++ 5 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 test/SITES_PSI/Ownable.js diff --git a/common/models/dataset.json b/common/models/dataset.json index da469bc1..637fd515 100644 --- a/common/models/dataset.json +++ b/common/models/dataset.json @@ -168,12 +168,6 @@ "principalId": "ingestor", "permission": "ALLOW", "property": ["facet","fullquery","fullfacet"] - }, - { - "principalType": "ROLE", - "principalId": "$authenticated", - "permission": "ALLOW", - "property": ["create"] } ], "methods": { diff --git a/common/models/ownable.json b/common/models/ownable.json index 57ac00fe..ea0ba293 100644 --- a/common/models/ownable.json +++ b/common/models/ownable.json @@ -57,6 +57,12 @@ "principalId": "$everyone", "permission": "ALLOW", "property": "isValid" + }, + { + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW", + "property": "create" } ], "methods": { diff --git a/common/models/utils.js b/common/models/utils.js index c51e622c..fd1d3781 100644 --- a/common/models/utils.js +++ b/common/models/utils.js @@ -239,7 +239,7 @@ exports.handleOwnerGroups = function(ctx, next) { }); } -// TODO minimize number of parabers: + exports.createArchiveJob = function(UserIdentity, Policy, Job, ctx) { var instance = ctx.instance if (!instance) { diff --git a/test/LoginUtils.js b/test/LoginUtils.js index c7ad6f71..8b6d8177 100644 --- a/test/LoginUtils.js +++ b/test/LoginUtils.js @@ -16,3 +16,17 @@ exports.getToken = function (app, user, cb) { } }); }; + +exports.getTokenAD = function (app, user, cb) { + request(app) + .post('/auth/msad') + .send(user) + .set('Accept', 'application/json') + .end((err, res) => { + if (err) { + cb(err) + } else { + cb(res.body.access_token); + } + }); +}; diff --git a/test/SITES_PSI/Ownable.js b/test/SITES_PSI/Ownable.js new file mode 100644 index 00000000..d1cbeac2 --- /dev/null +++ b/test/SITES_PSI/Ownable.js @@ -0,0 +1,144 @@ +/* jshint node:true */ +/* jshint esversion:6 */ +'use strict'; + +// process.env.NODE_ENV = 'test'; +var config = require('../config/settings') +var chai = require('chai'); +var chaiHttp = require('chai-http'); +var request = require('supertest'); +var app = require('../../server/server'); +var should = chai.should(); +var utils = require('../LoginUtils'); + +var accessToken = null, + pid = null; + +var testraw = { + "principalInvestigator": "bertram.astor@grumble.com", + "endTime": "2011-09-14T06:31:25.000Z", + "creationLocation": "/SU/XQX/RAMJET", + "dataFormat": "Upchuck pre 2017", + "scientificMetadata": { + "beamlineParameters": { + "Monostripe": "Ru/C", + "Ring current": { + "v": 0.402246, + "u": "A" + }, + "Beam energy": { + "v": 22595, + "u": "eV" + } + }, + "detectorParameters": { + "Objective": 20, + "Scintillator": "LAG 20um", + "Exposure time": { + "v": 0.4, + "u": "s" + } + }, + "scanParameters": { + "Number of projections": 1801, + "Rot Y min position": { + "v": 0, + "u": "deg" + }, + "Inner scan flag": 0, + "File Prefix": "817b_B2_", + "Sample In": { + "v": 0, + "u": "m" + }, + "Sample folder": "/ramjet/817b_B2_", + "Number of darks": 10, + "Rot Y max position": { + "v": 180, + "u": "deg" + }, + "Angular step": { + "v": 0.1, + "u": "deg" + }, + "Number of flats": 120, + "Sample Out": { + "v": -0.005, + "u": "m" + }, + "Flat frequency": 0, + "Number of inter-flats": 0 + } + }, + "owner": "Bertram Astor", + "ownerEmail": "bertram.astor@grumble.com", + "orcidOfOwner": "unknown", + "contactEmail": "bertram.astor@grumble.com", + "sourceFolder": "/iramjet/tif/", + "size": 0, + "creationTime": "2011-09-14T06:08:25.000Z", + "description": "None", + "doi": "not yet defined", + "isPublished": false, + "ownerGroup": "p10021", + "accessGroups": [], + "proposalId": "10.540.16635/20110123" +} + + +describe('TestCreation', () => { + before((done) => { + utils.getTokenAD(app, { + 'username': config.users.user.username, + 'password': config.users.user.password + }, + (tokenVal) => { + accessToken = tokenVal; + done(); + }); + }); + it('adds a new raw dataset', function(done) { + request(app) + .post('/api/v2/RawDatasets?access_token=' + accessToken) + .send(testraw) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + res.body.should.have.property('owner').and.be.string; + res.body.should.have.property('type').and.equal('raw'); + res.body.should.have.property('pid').and.be.string; + pid = encodeURIComponent(res.body['pid']); + done(); + }); + }); + + + it('should fetch this raw dataset', function(done) { + request(app) + .get('/api/v2/RawDatasets/' + pid + '?access_token=' + accessToken) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + it('should not delete this raw dataset', function(done) { + request(app) + .delete('/api/v2/RawDatasets/' + pid + '?access_token=' + accessToken) + .set('Accept', 'application/json') + .expect(401) + .expect('Content-Type', /json/) + .end((err, res) => { + res.body.should.have.property('error'); + done(); + }); + }); + +}); From 5cd3dc1327c66f29ab421052c30af86834534719 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 18 Jul 2018 15:14:26 +0200 Subject: [PATCH 024/147] Issue #41 work in progress --- common/models/policy.js | 61 ++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/common/models/policy.js b/common/models/policy.js index c7972527..3ab1a585 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -1,40 +1,45 @@ 'use strict'; -module.exports = function(Policy) { - -}; - //model extension file -/*var config = require('../../server/config.local'); +var config = require('../../server/config.local'); var p = require('../../package.json'); var utils = require('./utils'); -var dsl = require('./dataset-lifecycle.json'); -var ds = require('./dataset.json'); -var dsr = require('./raw-dataset.json'); -var dsd = require('./derived-dataset.json'); var own = require('./ownable.json'); module.exports = function(Policy) { - var app = require('../../server/server'); - console.log("Log: policy.js 1!"); + var app = require('../../server/server'); - // check logged in user email is a member of policy.manager - Policy.observe('before save', (ctx, next) => { - console.log("I am her!!!!!!!!"); - if (ctx.instance) { - var email - var login - if (user && user.profile) { - login = user.profile.login - email = user.profile.email - } else { - login = Object.keys(ctx.options.authorizedRoles)[0] - email = login - } + // for policy interactions + // check logged in user email is a member of policy.manager + Policy.observe('before save', (ctx, next) => { - } + if (ctx.currentInstance) { + //is a partial update currentInstance rather than instance + var UserIdentity = app.models.UserIdentity; + var userId = ctx.options.accessToken.userId; + + //PersistedModel Static Method call + UserIdentity.findOne({ + //json filter + where: { + userId: userId + } + }, function(err, instance) { + var email = instance.profile.email; + //console.log("email:", email); + //console.log("manager: ", ctx.currentInstance.manager); + if (!ctx.currentInstance.manager.includes(email)) { + var e = new Error('Access Not Allowed - policy manager action'); + e.statusCode = 401; + next(e); + } + else next(); + }); + } else { + //is an full update/insert/delete + //should only be proposalingestor next(); - }); - }; -*/ + } + }); +}; From 011bf357fee96074d048bc325b2cd42f904f02a8 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Thu, 19 Jul 2018 12:05:27 +0200 Subject: [PATCH 025/147] Issue #41 added test for policy model --- test/Policy.js | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 test/Policy.js diff --git a/test/Policy.js b/test/Policy.js new file mode 100644 index 00000000..76bb1539 --- /dev/null +++ b/test/Policy.js @@ -0,0 +1,96 @@ +/* jshint node:true */ +/* jshint esversion:6 */ +'use strict'; + +// process.env.NODE_ENV = 'test'; + +var chai = require('chai'); +var chaiHttp = require('chai-http'); +var request = require('supertest'); +var app = require('../server/server'); +var should = chai.should(); +var utils = require('./LoginUtils'); + +var accessToken = null, + id = null; + +var testdataset = { + "manager": [ + "stephan.egli@psi.ch" + ], + "tapeRedundancy": "low", + "tapeRetentionTime": 3, + "autoArchiveDelay": 7, + "archiveEmailNotification": false, + "archiveEmailsToBeNotified": [ + "none" + ], + "retrieveEmailNotification": false, + "retrieveEmailsToBeNotified": [ + "none" + ], + "ownerGroup": "p10021", + "accessGroups": [ + "none" + ] +} + + + +describe('Simple Policy tests', () => { + before((done) => { + utils.getToken(app, { + 'username': 'ingestor', + 'password': 'aman' + }, + (tokenVal) => { + accessToken = tokenVal; + done(); + }); + }); + + it('adds a new policy', function(done) { + request(app) + .post('/api/v2/Policies?access_token=' + accessToken) + .send(testdataset) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + res.body.should.have.property('manager').and.be.string; + res.body.should.have.property('ownerGroup').and.be.string; + id = encodeURIComponent(res.body['id']); + done(); + }); + }); + + it('should fetch this new policy', function(done) { + request(app) + .get('/api/v2/Policies/' + id + '?access_token=' + accessToken) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + it('should delete this policy', function(done) { + request(app) + .delete('/api/v2/Policies/' + id + '?access_token=' + accessToken) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + +}); From 888ed0e01c0b3eb7546941ded6c1fd0aa6b5bec5 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Thu, 19 Jul 2018 14:41:47 +0200 Subject: [PATCH 026/147] Issue #41 added additional field to policy --- common/models/policy.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/common/models/policy.json b/common/models/policy.json index 6f0382b8..6541c8e2 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -10,17 +10,16 @@ "properties": { "manager": { "type": ["string"], - "description": "Defines the users that can modify the policy parameters" + "description": "Defines the emails of users that can modify the policy parameters" }, "tapeRedundancy": { "type": "string", "description": "Defines the level of redundancy in storage to minimize loss of data. Allowed values are low, medium, high. Low could e.g. mean one tape copy only, medium could mean two tape copies and high two geo-redundant tape copies", "default": "low" }, - "tapeRetentionTime": { - "type": "number", - "description": "Number of years after creation time, where datasets are subject to retention policies, possibly leading to deletion of data on tape.", - "default": 10 + "autoArchive": { + "type": "boolean", + "description": "automatically archive dataset" }, "autoArchiveDelay": { "type": "number", From 91f067ed12376bb893481437f9f01386f321167f Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 19 Jul 2018 15:17:35 +0200 Subject: [PATCH 027/147] changing owner to author --- common/models/published-data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index b01163bc..15f2ffec 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -53,7 +53,7 @@ "description": "Array of one or more PIDS which make up the published data", "default": ["retrieve"] }, - "owner": { + "author": { "type":[ "string"], "required": true, "description": "Array of one or more owners who can publish data", From 6c5a39a9d124d07464c26fdc9d57045a7ddb6d8d Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 19 Jul 2018 15:21:03 +0200 Subject: [PATCH 028/147] changing posted->registered and removing defaults (Issue #34) --- common/models/published-data.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 15f2ffec..2e589090 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -14,26 +14,22 @@ "doi": { "type": "string", "required": true, - "description": "Digitial Object Identifier", - "default": "retrieve" + "description": "Digitial Object Identifier" }, "affiliation": { "type": "string", "required": true, - "description": "Creator Affiliation", - "default": "retrieve" + "description": "Creator Affiliation" }, "creator": { "type": "string", "required": true, - "description": "Creator of dataset/dataset collection", - "default": "retrieve" + "description": "Creator of dataset/dataset collection" }, "publisher": { "type": "string", "required": true, - "description": "Dataset publisher", - "default": "retrieve" + "description": "Dataset publisher" }, "publicationYear": { "type": "number", @@ -44,8 +40,12 @@ "title": { "type": "string", "required": true, - "description": "Title", - "default": "retrieve" + "description": "Title" + }, + "url": { + "type": "string", + "required": true, + "description": "Full local URL" }, "pidArray": { "type":[ "string"], @@ -59,7 +59,7 @@ "description": "Array of one or more owners who can publish data", "default": ["owner"] }, - "doiPostedSuccessfullyTime": { + "doiRegisteredSuccessfullyTime": { "type": "date", "index": true, "description": "time when doi is successfully posted" From 5c75b3d5a6a56f8353ec97339587b7d9c12fd7ad Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 19 Jul 2018 15:23:55 +0200 Subject: [PATCH 029/147] removing created/updated fields as they will be populated by mixins (See #Issue 34) --- common/models/published-data.json | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 2e589090..b78ba8fe 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -63,16 +63,6 @@ "type": "date", "index": true, "description": "time when doi is successfully posted" - }, - "lastModificationTime": { - "type": "date", - "index": true, - "description": "time when last modified" - }, - "creationTime": { - "type": "date", - "index": true, - "description": "Time when publication is created. Format according to chapter 5.6 internet date/time format in RFC 3339" } }, "validations": [], From 98c4364f66b62a67463b49d73a2e6ef15d7a17a4 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 9 Aug 2018 14:09:30 +0200 Subject: [PATCH 030/147] Some suggested changes to the new data model --- common/models/published-data.js | 26 +++++++++++++------------- common/models/published-data.json | 23 +++++++---------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/common/models/published-data.js b/common/models/published-data.js index 63def396..57adff64 100644 --- a/common/models/published-data.js +++ b/common/models/published-data.js @@ -1,20 +1,20 @@ 'use strict'; -var utils = require('./utils'); +// var utils = require('./utils'); module.exports = function(PublishedData) { - // put - PublishedData.beforeRemote('replaceOrCreate', function(ctx, instance, next) { - // convert base64 image - - next(); - }); + // TODO add logic that give authors privileges to modify data - //patch - PublishedData.beforeRemote('patchOrCreate', function(ctx, instance, next) { - next(); - }); + // // put + // PublishedData.beforeRemote('replaceOrCreate', function(ctx, instance, next) { + // // convert base64 image + // + // next(); + // }); + // + // //patch + // PublishedData.beforeRemote('patchOrCreate', function(ctx, instance, next) { + // next(); + // }); } - - diff --git a/common/models/published-data.json b/common/models/published-data.json index b78ba8fe..44dbcd2c 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -9,7 +9,7 @@ "collection": "PublishedData" } }, - "description": "Stores the meta data information for an accessible, published and DOI-identified collection of datasets. It defines a list of mandatory and optional metadata fields to be included. DataCite mandatory fields, a full URL and modification times are included.", + "description": "Stores the meta data information for an accessible, published and DOI-identified collection of datasets. It defines a list of mandatory and optional metadata fields to be included. DataCite mandatory fields, a full URL to the landing page and modification times are included.", "properties": { "doi": { "type": "string", @@ -34,8 +34,7 @@ "publicationYear": { "type": "number", "required": true, - "description": "Year of publication ", - "default": "2018" + "description": "Year of publication " }, "title": { "type": "string", @@ -45,7 +44,7 @@ "url": { "type": "string", "required": true, - "description": "Full local URL" + "description": "Full URL to the landing page for this DOI" }, "pidArray": { "type":[ "string"], @@ -53,27 +52,19 @@ "description": "Array of one or more PIDS which make up the published data", "default": ["retrieve"] }, - "author": { + "authors": { "type":[ "string"], "required": true, - "description": "Array of one or more owners who can publish data", - "default": ["owner"] + "description": "Array of one or more persons who are able to update this entry of published data" }, "doiRegisteredSuccessfullyTime": { "type": "date", "index": true, - "description": "time when doi is successfully posted" + "description": "Time when doi is successfully registered" } }, "validations": [], - "relations": { - "dataset": { - "type": "belongsTo", - "model": "Dataset", - "foreignKey": "", - "required": true - } - }, + "relations": {}, "acls": [], "methods": {} } From 11c1e5037526cc5f7e3a2a87af4eca9c529ec84d Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 9 Aug 2018 14:11:26 +0200 Subject: [PATCH 031/147] Removed one dafault value --- common/models/published-data.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 44dbcd2c..3548d49e 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -49,8 +49,7 @@ "pidArray": { "type":[ "string"], "required": true, - "description": "Array of one or more PIDS which make up the published data", - "default": ["retrieve"] + "description": "Array of one or more PIDS which make up the published data" }, "authors": { "type":[ "string"], From e299f905639edbf1a082a309ca781c8430f6c3d9 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 13 Aug 2018 17:04:29 +0200 Subject: [PATCH 032/147] Issue #41 added autoArchive to model --- common/models/policy.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/models/policy.json b/common/models/policy.json index 6f0382b8..deaf329e 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -22,6 +22,11 @@ "description": "Number of years after creation time, where datasets are subject to retention policies, possibly leading to deletion of data on tape.", "default": 10 }, + "autoArchive": { + "type": "boolean", + "description": "Flag to indicate that a dataset should be automatically archived after ingest. If false then archive delay is ignored", + "default": true + }, "autoArchiveDelay": { "type": "number", "description": "Number of days after dataset creation that (remaining) datasets are archived automatically", From 1352558cb7dabf5989174419c79659ea94de5364 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Thu, 16 Aug 2018 17:24:15 +0200 Subject: [PATCH 033/147] Issue 41 modified test --- test/Policy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Policy.js b/test/Policy.js index 76bb1539..38c32e42 100644 --- a/test/Policy.js +++ b/test/Policy.js @@ -19,7 +19,7 @@ var testdataset = { "stephan.egli@psi.ch" ], "tapeRedundancy": "low", - "tapeRetentionTime": 3, + //"tapeRetentionTime": 3, "autoArchiveDelay": 7, "archiveEmailNotification": false, "archiveEmailsToBeNotified": [ From 95dc89abb19796aadcc660337c174c96267f7324 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 17 Aug 2018 19:05:20 +0000 Subject: [PATCH 034/147] chore(package): update dependencies --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 490a8f22..ecdc16e6 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,11 @@ "cors": "^2.5.2", "helmet": "^3.10.0", "loopback-boot": "^2.6.5", - "serve-favicon": "2.4.5", - "strong-error-handler": "2.3.0", + "serve-favicon": "2.5.0", + "strong-error-handler": "3.1.0", "loopback-component-explorer": "^6.0.0", "loopback": "^3.19.0", - "loopback-component-model-diagram": "^0.3.0", + "loopback-component-model-diagram": "^0.4.2", "loopback-component-mq": "^2.2.5", "loopback-component-passport": "^3.4.1", "loopback-component-visualizer": "^1.2.1", @@ -36,13 +36,13 @@ "uuid": "^3.2.1" }, "devDependencies": { - "eslint": "^3.17.1", - "eslint-config-loopback": "^8.0.0", - "nsp": "^2.1.0", + "eslint": "^5.3.0", + "eslint-config-loopback": "^11.0.0", + "nsp": "^3.2.1", "@mean-expert/loopback-sdk-builder": "^2.1.0", "chai": "^4.1.2", - "chai-http": "^3.0.0", - "mocha": "^4.1.0", + "chai-http": "^4.0.0", + "mocha": "^5.2.0", "supertest": "^3.0.0" }, "repository": { From ee380666aafc2c608dd8f9393684224e70998162 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 17 Aug 2018 19:05:22 +0000 Subject: [PATCH 035/147] docs(readme): add Greenkeeper badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ff0087dd..646db569 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # SciCat Data Catalog Backend +[![Greenkeeper badge](https://badges.greenkeeper.io/SciCatProject/catamel.svg)](https://greenkeeper.io/) + The data catalog backend is based on [NoSQL database MongoDB](https://www.mongodb.com/), [the Node based web application framework Express](http://expressjs.com/) and [the API framework Loopback](http://loopback.io/) technology stack (the "MEL" part of the "MELANIE" technology stack). It provides a REST based API which allows to store information about datasets and to allow to answer queries about the stored meta data for these datasets # Getting started From 7eedfa5857c516d044c4f3a435298b78d8bc88d5 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Fri, 17 Aug 2018 21:30:46 +0200 Subject: [PATCH 036/147] Update package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index ecdc16e6..5b67488d 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ "devDependencies": { "eslint": "^5.3.0", "eslint-config-loopback": "^11.0.0", - "nsp": "^3.2.1", "@mean-expert/loopback-sdk-builder": "^2.1.0", "chai": "^4.1.2", "chai-http": "^4.0.0", From b631dee2d0f29d5591ef3f3bbd134f22a0f7227c Mon Sep 17 00:00:00 2001 From: egli Date: Wed, 22 Aug 2018 09:23:00 +0200 Subject: [PATCH 037/147] Disable functionality which is still WIP and was committed to develop erroneously on June 27th --- common/models/orig-datablock.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/orig-datablock.js b/common/models/orig-datablock.js index 8b4da21e..9696a035 100644 --- a/common/models/orig-datablock.js +++ b/common/models/orig-datablock.js @@ -35,7 +35,7 @@ module.exports = function(Origdatablock) { // transfer size info to dataset Origdatablock.observe('after save', (ctx, next) => { var OrigDatablock = app.models.OrigDatablock - utils.createArchiveJob(app.models.UserIdentity, app.models.Policy, app.models.Job, ctx) + // not yet ready utils.createArchiveJob(app.models.UserIdentity, app.models.Policy, app.models.Job, ctx) utils.transferSizeToDataset(OrigDatablock, 'size', ctx, next) }) From 519a95cccd055a5248a24d021262e9d2f57c225b Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Fri, 24 Aug 2018 10:23:05 +0200 Subject: [PATCH 038/147] published data now accessible without login --- common/models/published-data.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 3548d49e..ad03865a 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -64,6 +64,13 @@ }, "validations": [], "relations": {}, - "acls": [], + "acls": [ + { + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$unauthenticated", + "permission": "ALLOW" + } + ], "methods": {} } From a1f25c6332cb1764125e415fadec1d1c24c3bdc1 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Fri, 24 Aug 2018 10:42:49 +0200 Subject: [PATCH 039/147] adding access control to published data model (see Issue #47) --- common/models/published-data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index ad03865a..995a6245 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -68,7 +68,7 @@ { "accessType": "READ", "principalType": "ROLE", - "principalId": "$unauthenticated", + "principalId": "$everyone", "permission": "ALLOW" } ], From a7df693844af4c87c3f657c6ffd6a56736482344 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Fri, 24 Aug 2018 10:46:11 +0200 Subject: [PATCH 040/147] Create PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 PULL_REQUEST_TEMPLATE.md diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..c20589b1 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,23 @@ +## Description + +## Motivation + +Link to any open issues here + +## Fixes: + +* +* + +## Changes: + +* +* + +## Tests included/Docs Updated? + +- [ ] Included for each change/fix? +- [ ] Passing? (Merge will not be approved unless this is checked) +- [ ] Docs updated? + +## Extra Information/Screenshots From 5be730ecaa8fd2c6ccf05fa2931453412a1a03de Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 27 Aug 2018 06:42:56 +0200 Subject: [PATCH 041/147] add extra fields to published data --- common/models/published-data.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/common/models/published-data.json b/common/models/published-data.json index 995a6245..65d071e3 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -46,6 +46,22 @@ "required": true, "description": "Full URL to the landing page for this DOI" }, + "resourceType": { + "type": "string", + "required": true, + "description": "Type of files, format etc" + }, + "numberOfFiles": { + "type": "number", + "required": true, + "description": "Number of files" + }, + "sizeOfArchive": { + "type": "number", + "required": true, + "description": "Number of files" + }, + "pidArray": { "pidArray": { "type":[ "string"], "required": true, From c814849600780c38f9c9fd7d6509bc62316e6c4a Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 27 Aug 2018 11:44:14 +0200 Subject: [PATCH 042/147] add extra fields to publsihed data (See issue #50) --- common/models/published-data.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 65d071e3..3175ea57 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -46,6 +46,11 @@ "required": true, "description": "Full URL to the landing page for this DOI" }, + "abstract": { + "type": "string", + "required": true, + "description": "Abstract text for published datasets" + }, "resourceType": { "type": "string", "required": true, @@ -61,7 +66,6 @@ "required": true, "description": "Number of files" }, - "pidArray": { "pidArray": { "type":[ "string"], "required": true, From 8897b5b01e95f277eb74f4cff50dc9afb3cbe878 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 27 Aug 2018 11:49:36 +0200 Subject: [PATCH 043/147] move mongodb for travis tests --- docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 2891a0c0..c70d57bd 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -7,7 +7,7 @@ services: ports: - "27017:27017" volumes: - - './mongodb:/bitnami' + - 'mongodb_data:/bitnami' catamel: From 70107d7c14c778822093d52861884be098c67855 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 27 Aug 2018 14:49:15 +0200 Subject: [PATCH 044/147] make doi field key --- common/models/published-data.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/common/models/published-data.json b/common/models/published-data.json index 3175ea57..7c6a9647 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -13,8 +13,9 @@ "properties": { "doi": { "type": "string", - "required": true, - "description": "Digitial Object Identifier" + "id": true, + "description": "Digital Object Identifier", + "defaultFn": "uuidv4" }, "affiliation": { "type": "string", @@ -64,7 +65,7 @@ "sizeOfArchive": { "type": "number", "required": true, - "description": "Number of files" + "description": "Size of archive" }, "pidArray": { "type":[ "string"], From f268adb9041df77838450382083abc81894789c7 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Tue, 28 Aug 2018 13:54:55 +0200 Subject: [PATCH 045/147] add thumbnail image --- common/models/published-data.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/models/published-data.json b/common/models/published-data.json index 7c6a9647..ef5d0714 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -52,6 +52,11 @@ "required": true, "description": "Abstract text for published datasets" }, + "thumbnail": { + "type": "string", + "required": true, + "description": "Small, less than 16 MB base 64 image preview of dataset" + }, "resourceType": { "type": "string", "required": true, From 1c5ff72178eda3a33ce8fb19965a9c6cbe0a31c4 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 29 Aug 2018 20:03:09 +0000 Subject: [PATCH 046/147] chore(package): update eslint-config-loopback to version 12.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5b67488d..7e9ab273 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ }, "devDependencies": { "eslint": "^5.3.0", - "eslint-config-loopback": "^11.0.0", + "eslint-config-loopback": "^12.0.0", "@mean-expert/loopback-sdk-builder": "^2.1.0", "chai": "^4.1.2", "chai-http": "^4.0.0", From a79c966b54dfa4b958c0920b5d4d480dc3cacdca Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 30 Aug 2018 17:58:38 +0000 Subject: [PATCH 047/147] fix(package): update strong-error-handler to version 3.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5b67488d..22749588 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "helmet": "^3.10.0", "loopback-boot": "^2.6.5", "serve-favicon": "2.5.0", - "strong-error-handler": "3.1.0", + "strong-error-handler": "3.2.0", "loopback-component-explorer": "^6.0.0", "loopback": "^3.19.0", "loopback-component-model-diagram": "^0.4.2", From dc0a520d0ee2a41880d33313210db063ef24616d Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 6 Sep 2018 16:25:38 +0200 Subject: [PATCH 048/147] Initial commit of changes, not yet complete --- common/models/dataset-lifecycle.json | 286 ++++++++++--------- common/models/job.js | 31 +- common/models/job.json | 27 +- common/models/message.js | 5 + common/models/message.json | 49 ++++ package.json | 100 ++++--- server/model-config.json | 236 +++++++-------- test/Job.js | 413 +++++++++++++++++++++++++++ 8 files changed, 831 insertions(+), 316 deletions(-) create mode 100644 common/models/message.js create mode 100644 common/models/message.json create mode 100644 test/Job.js diff --git a/common/models/dataset-lifecycle.json b/common/models/dataset-lifecycle.json index 42022be1..c035f470 100644 --- a/common/models/dataset-lifecycle.json +++ b/common/models/dataset-lifecycle.json @@ -1,146 +1,156 @@ { - "name": "DatasetLifecycle", - "description":"For each dataset there exists exactly one dataset lifecycle document which describes the current status of the dataset during its lifetime with respect to the storage handling systems", - "base": "Ownable", - "idInjection": false, - "strict": true, - "indexes": { - "datasetId_index": { - "keys": { - "datasetId": 1 - } - } - }, - "options": { - "validateUpsert": true - }, - "replaceOnPUT": false, - "mixins": { - "TimeStamp": { - "createdAt": "createdAt", - "updatedAt": "updatedAt", - "required": false, - "validateUpsert": true, - "silenceWarnings": false - } - }, - "properties": { - "id": { - "type": "string", - "id": true, - "required": true, - "description": "ID of status information. This must be the ID of the associated dataset" - }, - "isOnDisk": { - "type": "boolean", - "description": "Flag which is true, if full dataset is available on disk. Warning: will be obsoleted in coming versions" - }, - "isOnTape": { - "type": "boolean", - "description": "Flag which is true, if full dataset has been stored to tape. Warning: will be obsoleted in coming versions" - }, - "archivable": { - "type": "boolean", - "description": "Flag which is true, if dataset is available to be archived and no archive job for this dataset exists yet" - }, - "retrievable": { - "type": "boolean", - "description": "Flag which is true, if dataset is stored on archive system and is ready to be retrieved" - }, - "archiveStatusMessage": { - "type": "string", - "description": "Current status of Dataset with respect to storage on disk/tape" - }, - "retrieveStatusMessage": { - "type": "string", - "description": "Latest message for this dataset concerning retrieve from archive system" - }, - "lastUpdateMessage": { - "type": "string", - "description": "Latest status update / transition message for this dataset" - }, - "archiveReturnMessage": { - "type": "string", - "description": "Detailed status or error message returned by archive system when treating this dataset" - }, - "dateOfLastMessage": { - "type": "date", - "description": "Time when last status message was sent. Format according to chapter 5.6 internet date/time format in RFC 3339. This will be filled automatically if not provided. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server" - }, - "dateOfDiskPurging": { - "type": "date", - "description": "Day when dataset will be removed from disk, assuming that is already stored on tape." - }, - "archiveRetentionTime": { - "type": "date", - "description": "Day when the dataset's future fate will be evaluated again, e.g. to decide if the dataset can be deleted from archive." - }, - "isExported": { - "type": "boolean", - "description": "Flag is true if data was exported to another location" - }, - "exportedTo": { - "type": "string", - "description": "Location of the export destination" + "name": "DatasetLifecycle", + "description": "For each dataset there exists exactly one dataset lifecycle document which describes the current status of the dataset during its lifetime with respect to the storage handling systems", + "base": "Ownable", + "idInjection": false, + "strict": true, + "indexes": { + "datasetId_index": { + "keys": { + "datasetId": 1 + } + } }, - "dateOfPublishing": { - "type": "date", - "description": "Day when dataset is supposed to become public according to data policy" - } - }, - "validations": [], - "relations": { - "dataset": { - "type": "belongsTo", - "model": "Dataset", - "foreignKey": "", - "required": true - } - }, - "acls": [ - { - "accessType": "*", - "principalType": "ROLE", - "principalId": "$everyone", - "permission": "DENY" + "options": { + "validateUpsert": true + }, + "replaceOnPUT": false, + "mixins": { + "TimeStamp": { + "createdAt": "createdAt", + "updatedAt": "updatedAt", + "required": false, + "validateUpsert": true, + "silenceWarnings": false + } }, - { - "accessType": "*", - "principalType": "ROLE", - "principalId": "admin", - "permission": "ALLOW" + "properties": { + "id": { + "type": "string", + "id": true, + "required": true, + "description": "ID of status information. This must be the ID of the associated dataset" + }, + "archivable": { + "type": "boolean", + "description": "Flag which is true, if dataset is available to be archived and no archive job for this dataset exists yet" + }, + "retrievable": { + "type": "boolean", + "description": "Flag which is true, if dataset is stored on archive system and is ready to be retrieved" + }, + "dateOfDiskPurging": { + "type": "date", + "description": "Day when dataset will be removed from disk, assuming that is already stored on tape." + }, + "archiveRetentionTime": { + "type": "date", + "description": "Day when the dataset's future fate will be evaluated again, e.g. to decide if the dataset can be deleted from archive." + }, + "dateOfPublishing": { + "type": "date", + "description": "Day when dataset is supposed to become public according to data policy" + }, + "isOnDisk": { + "type": "boolean", + "description": "Flag which is true, if full dataset is available on disk. Warning: will be obsoleted in coming versions" + }, + "isOnTape": { + "type": "boolean", + "description": "Flag which is true, if full dataset has been stored to tape. Warning: will be obsoleted in coming versions" + }, + "archiveStatusMessage": { + "type": "string", + "description": "Current status of Dataset with respect to storage on disk/tape. Warning: will be obsoleted in coming versions" + }, + "retrieveStatusMessage": { + "type": "string", + "description": "Latest message for this dataset concerning retrieve from archive system. Warning: will be obsoleted in coming versions" + }, + "lastUpdateMessage": { + "type": "string", + "description": "Latest status update / transition message for this dataset. Warning: will be obsoleted in coming versions" + }, + "archiveReturnMessage": { + "type": "string", + "description": "Detailed status or error message returned by archive system when treating this dataset. Warning: will be obsoleted in coming versions" + }, + "dateOfLastMessage": { + "type": "date", + "description": "Time when last status message was sent. Format according to chapter 5.6 internet date/time format in RFC 3339. This will be filled automatically if not provided. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server. Warning: will be obsoleted in coming versions" + }, + "isExported": { + "type": "boolean", + "description": "Flag is true if data was exported to another location. Warning: will be obsoleted in coming versions" + }, + "exportedTo": { + "type": "string", + "description": "Location of the export destination. Warning: will be obsoleted in coming versions" + } }, - { - "accessType": "*", - "principalType": "ROLE", - "principalId": "ingestor", - "permission": "ALLOW" + "validations": [], + "relations": { + "dataset": { + "type": "belongsTo", + "model": "Dataset", + "foreignKey": "", + "required": true + }, + "messageHistory": { + "type": "embedsMany", + "model": "Message", + "property": "messageHistory", + "options": { + "validate": false, + "forceId": false, + "persistent": true + } + } }, - { - "accessType": "*", - "principalType": "ROLE", - "principalId": "archivemanager", - "permission": "ALLOW" - } - ], - "methods":{ - "reset": { - "accepts": [{ - "arg": "datasetId", - "type": "string" - }, - { - "arg": "options", - "type": "object", - "http": "optionsFromRequest" - }], - "returns": { - "root": true - }, - "description": "Delete datablocks of dataset and reset status message.", - "http": { - "path": "/resetArchiveStatus", - "verb": "put" + "acls": [{ + "accessType": "*", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "DENY" + }, + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "admin", + "permission": "ALLOW" + }, + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "ingestor", + "permission": "ALLOW" + }, + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "archivemanager", + "permission": "ALLOW" + } + ], + "methods": { + "reset": { + "accepts": [{ + "arg": "datasetId", + "type": "string" + }, + { + "arg": "options", + "type": "object", + "http": "optionsFromRequest" + } + ], + "returns": { + "root": true + }, + "description": "Delete datablocks of dataset and reset status message.", + "http": { + "path": "/resetArchiveStatus", + "verb": "put" } } } diff --git a/common/models/job.js b/common/models/job.js index 5807c7d9..b6c05178 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -76,11 +76,36 @@ module.exports = function (Job) { }); } }); + } else { + next() } } else { - console.log('Updated %s matching %j', ctx.Model.pluralModelName, - ctx.where); - next(); + if ('smtpSettings' in config && 'smtpMessage' in config) { + let transporter = nodemailer.createTransport(config.smtpSettings); + transporter.verify(function (error, success) { + if (error) { + console.log(error); + next(); + } else { + console.log('Server is ready to take our messages'); + var message = Object.assign({}, config.smtpMessage); + message['to'] = ctx.instance.emailJobInitiator; + message['subject'] += ' Job Finished with status '+ ctx.instance.jobStatusMessage; + let text = 'Hello, \n\n Your Job with id is now finished. \n\n The resulting job description is.\n\n'+JSON.stringify(ctx.instance, null, 4); + message['text'] = text; + transporter.sendMail(message, function (err, info) { + if (err) { + console.log(err); + } else { + console.log('Email sent'); + } + next(); + }); + } + }); + } else { + next() + } } }); }; diff --git a/common/models/job.json b/common/models/job.json index f99e9a87..99f93c68 100644 --- a/common/models/job.json +++ b/common/models/job.json @@ -54,22 +54,33 @@ "type": "string", "description": "Defines current status of job lifecycle" }, + "datasetList": { + "type": "object", + "required": true, + "description": "Array of objects with keys: pid, files. The value for the pid key defines the dataset ID, the value for the files key is an array of file names. This array is either an empty array, implying that all files within the dataset are selected or an explicit list of dataset-relative file paths, which should be selected" + }, "archiveReturnMessage": { "type": "string", - "description": "Detailed status or error message returned by archive system at archive job creation time. If One Job request triggers many archive requests, e.g. when archiving multiple datasets in one job, then this message contains the result of the last dataset handled" + "description": "Detailed status or error message returned by archive system at archive job creation time. If One Job request triggers many archive requests, e.g. when archiving multiple datasets in one job, then this message contains the result of the last dataset handled. Warning: to be obsoleted" }, "dateOfLastMessage": { "type": "date", - "description": "Time when last status message was sent. Format according to chapter 5.6 internet date/time format in RFC 3339. This will be filled automatically if not provided" - }, - "datasetList": { - "type": "object", - "required": true, - "description": "Array of objects with keys: pid, files. The value for the pid key defines the dataset ID, the value for the files key is an array of file names. This array is either an empty array, implying that all files within the dataset are selected or an explicit list of dataset-relative file paths, which should be selected" + "description": "Time when last status message was sent. Format according to chapter 5.6 internet date/time format in RFC 3339. This will be filled automatically if not provided. Warning: to be obsoleted." } }, "validations": [], - "relations": {}, + "relations": { + "messageHistory": { + "type": "embedsMany", + "model": "Message", + "property": "messageHistory", + "options": { + "validate": false, + "forceId": false, + "persistent": true + } + } + }, "acls": [], "methods": {} } diff --git a/common/models/message.js b/common/models/message.js new file mode 100644 index 00000000..a0f88c8a --- /dev/null +++ b/common/models/message.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = function(Message) { + +}; diff --git a/common/models/message.json b/common/models/message.json new file mode 100644 index 00000000..684800ae --- /dev/null +++ b/common/models/message.json @@ -0,0 +1,49 @@ +{ + "name": "Message", + "description": "Embedded information used inside DatasetLifecycle or Job to keep track of history.", + "base": "PersistedModel", + "idInjection": true, + "strict": true, + "options": { + "validateUpsert": true + }, + "properties": { + "id": { + "type": "string", + "id": "true", + "required": true, + "description": "id currently needed by limitation in embedsmanny" + }, + "shortMessage": { + "type": "string", + "required": true, + "index": true, + "description": "Short description of message, like datasetArchiveSuccesful" + }, + "sender": { + "type": "string", + "required": true, + "index": true, + "description": "User or role who triggered the message" + }, + "when": { + "type": "Date", + "index": true, + "default": "$now", + "description": "Time when message was received. Will be filled automatically by the server, format according to chapter 5.6 internet date/time format in RFC 3339." + }, + "comment": { + "type": "Object", + "description": "Additional information relevant for this message" + } + }, + "validations": [], + "relations": {}, + "acls": [{ + "accessType": "*", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }], + "methods": {} +} diff --git a/package.json b/package.json index 5b67488d..b5adf880 100644 --- a/package.json +++ b/package.json @@ -1,53 +1,51 @@ { - "name": "dacat-api", - "version": "2.8.1", - "main": "server/server.js", - "engines": { - "node": ">=4" - }, - "scripts": { - "lint": "eslint common/models", - "start": "node .", - "posttests": "npm run lint && nsp check", - "test": "./node_modules/mocha/bin/mocha --timeout=10000 --reporter spec --exit 2>/dev/null" - }, - "dependencies": { - "compression": "^1.0.3", - "cors": "^2.5.2", - "helmet": "^3.10.0", - "loopback-boot": "^2.6.5", - "serve-favicon": "2.5.0", - "strong-error-handler": "3.1.0", - "loopback-component-explorer": "^6.0.0", - "loopback": "^3.19.0", - "loopback-component-model-diagram": "^0.4.2", - "loopback-component-mq": "^2.2.5", - "loopback-component-passport": "^3.4.1", - "loopback-component-visualizer": "^1.2.1", - "loopback-connector-kafka": "^0.2.1", - "loopback-connector-mongodb": "^3.3.0", - "loopback-ds-timestamp-mixin": "^3.4.1", - "moment": "^2.20.1", - "moment-timezone": "^0.5.14", - "nodemailer": "^4.3.1", - "passport-ldapauth": "^2.0.0", - "passport-local": "^1.0.0", - "passport-openidconnect": "^0.0.2", - "uuid": "^3.2.1" - }, - "devDependencies": { - "eslint": "^5.3.0", - "eslint-config-loopback": "^11.0.0", - "@mean-expert/loopback-sdk-builder": "^2.1.0", - "chai": "^4.1.2", - "chai-http": "^4.0.0", - "mocha": "^5.2.0", - "supertest": "^3.0.0" - }, - "repository": { - "type": "", - "url": "" - }, - "license": "GPL-3.0", - "description": "dacat-api" + "name": "dacat-api", + "version": "2.8.0", + "main": "server/server.js", + "scripts": { + "lint": "eslint common/models", + "start": "node .", + "posttests": "npm run lint && nsp check", + "test": "./node_modules/mocha/bin/mocha --timeout=10000 --reporter spec --exit 2>/dev/null" + }, + "dependencies": { + "compression": "1.7.1", + "cors": "2.8.4", + "helmet": "3.9.0", + "loopback": "3.16.2", + "loopback-boot": "2.27.0", + "loopback-component-explorer": "5.2.0", + "loopback-component-model-diagram": "0.3.0", + "loopback-component-mq": "^2.2.5", + "loopback-component-passport": "3.4.1", + "loopback-component-visualizer": "1.2.1", + "loopback-connector-kafka": "^0.2.1", + "loopback-connector-mongodb": "3.3.0", + "loopback-ds-timestamp-mixin": "^3.4.1", + "moment": "^2.20.1", + "moment-timezone": "^0.5.14", + "nodemailer": "^4.3.1", + "passport-ldapauth": "2.0.0", + "passport-local": "1.0.0", + "passport-openidconnect": "0.0.2", + "serve-favicon": "2.4.5", + "strong-error-handler": "2.3.0", + "uuid": "^3.2.1" + }, + "devDependencies": { + "@mean-expert/loopback-sdk-builder": "2.1.0", + "chai": "^4.1.2", + "chai-http": "^3.0.0", + "eslint": "4.10.0", + "eslint-config-loopback": "8.0.0", + "mocha": "^4.1.0", + "nsp": "2.8.1", + "supertest": "^3.0.0" + }, + "repository": { + "type": "", + "url": "" + }, + "license": "GPL-3.0", + "description": "dacat-api" } diff --git a/server/model-config.json b/server/model-config.json index 591888ea..ae5abd8b 100644 --- a/server/model-config.json +++ b/server/model-config.json @@ -1,118 +1,122 @@ { - "_meta": { - "sources": [ - "loopback/common/models", - "loopback/server/models", - "../common/models", - "./models", - "./node_modules/loopback-component-passport/lib/models" - ], - "mixins": [ - "loopback/common/mixins", - "loopback/server/mixins", - "../node_modules/loopback-component-mq/lib/mixins", - "../node_modules/loopback-ds-timestamp-mixin", - "../common/mixins", - "./mixins" - ] - }, - "User": { - "dataSource": "mongo" - }, - "AccessToken": { - "dataSource": "mongo", - "public": false - }, - "ACL": { - "dataSource": "mongo", - "public": false - }, - "RoleMapping": { - "dataSource": "mongo", - "public": false - }, - "Role": { - "dataSource": "mongo", - "public": false - }, - "Dataset": { - "dataSource": "mongo", - "public": true - }, - "RawDataset": { - "dataSource": "mongo", - "public": true - }, - "DerivedDataset": { - "dataSource": "mongo", - "public": true - }, - "Sample": { - "dataSource": "mongo", - "public": true - }, - "Proposal": { - "dataSource": "mongo", - "public": true - }, - "PublishedData": { - "dataSource": "mongo", - "public": true - }, - "Datafile": { - "dataSource": "transient", - "public": false - }, - "DatasetLifecycle": { - "dataSource": "mongo", - "public": true - }, - "Datablock": { - "dataSource": "mongo", - "public": true - }, - "MeasurementPeriod": { - "dataSource": "transient", - "public": false - }, - "AccessUser": { - "dataSource": "mongo", - "public": true - }, - "AccessGroup": { - "dataSource": "mongo", - "public": true - }, - "UserCredential": { - "dataSource": "mongo", - "public": true - }, - "UserIdentity": { - "dataSource": "mongo", - "public": true - }, - "ApplicationCredential": { - "dataSource": "mongo", - "public": true - }, - "Ownable": { - "dataSource": "mongo", - "public": false - }, - "Policy": { - "dataSource": "mongo", - "public": true - }, - "Job": { - "dataSource": "mongo", - "public": true - }, - "DatasetAttachment": { - "dataSource": "mongo", - "public": true - }, - "OrigDatablock": { - "dataSource": "mongo", - "public": true - } + "_meta": { + "sources": [ + "loopback/common/models", + "loopback/server/models", + "../common/models", + "./models", + "./node_modules/loopback-component-passport/lib/models" + ], + "mixins": [ + "loopback/common/mixins", + "loopback/server/mixins", + "../node_modules/loopback-component-mq/lib/mixins", + "../node_modules/loopback-ds-timestamp-mixin", + "../common/mixins", + "./mixins" + ] + }, + "User": { + "dataSource": "mongo" + }, + "AccessToken": { + "dataSource": "mongo", + "public": false + }, + "ACL": { + "dataSource": "mongo", + "public": false + }, + "RoleMapping": { + "dataSource": "mongo", + "public": false + }, + "Role": { + "dataSource": "mongo", + "public": false + }, + "Dataset": { + "dataSource": "mongo", + "public": true + }, + "RawDataset": { + "dataSource": "mongo", + "public": true + }, + "DerivedDataset": { + "dataSource": "mongo", + "public": true + }, + "Sample": { + "dataSource": "mongo", + "public": true + }, + "Proposal": { + "dataSource": "mongo", + "public": true + }, + "PublishedData": { + "dataSource": "mongo", + "public": true + }, + "Datafile": { + "dataSource": "transient", + "public": false + }, + "DatasetLifecycle": { + "dataSource": "mongo", + "public": true + }, + "Datablock": { + "dataSource": "mongo", + "public": true + }, + "MeasurementPeriod": { + "dataSource": "transient", + "public": false + }, + "AccessUser": { + "dataSource": "mongo", + "public": true + }, + "AccessGroup": { + "dataSource": "mongo", + "public": true + }, + "UserCredential": { + "dataSource": "mongo", + "public": true + }, + "UserIdentity": { + "dataSource": "mongo", + "public": true + }, + "ApplicationCredential": { + "dataSource": "mongo", + "public": true + }, + "Ownable": { + "dataSource": "mongo", + "public": false + }, + "Policy": { + "dataSource": "mongo", + "public": true + }, + "Job": { + "dataSource": "mongo", + "public": true + }, + "DatasetAttachment": { + "dataSource": "mongo", + "public": true + }, + "OrigDatablock": { + "dataSource": "mongo", + "public": true + }, + "Message": { + "dataSource": "transient", + "public": false + } } diff --git a/test/Job.js b/test/Job.js new file mode 100644 index 00000000..686bf6bb --- /dev/null +++ b/test/Job.js @@ -0,0 +1,413 @@ +/* jshint node:true */ +/* jshint esversion:6 */ +'use strict'; + +// process.env.NODE_ENV = 'test'; + +var chai = require('chai'); +var chaiHttp = require('chai-http'); +var request = require('supertest'); +var app = require('../server/server'); +var should = chai.should(); +var utils = require('./LoginUtils'); + +var accessTokenIngestor = null; +var accessTokenArchiveManager = null; +var accessTokenUser = null; + +var pid = null; +var pid2 = null; +var idDatasetLifecycle = null; +var idDatasetLifecycle2 = null; + +var testraw = { + "principalInvestigator": "bertram.astor@grumble.com", + "endTime": "2011-09-14T06:31:25.000Z", + "creationLocation": "/SU/XQX/RAMJET", + "dataFormat": "Upchuck pre 2017", + "scientificMetadata": { + "beamlineParameters": { + "Monostripe": "Ru/C", + "Ring current": { + "v": 0.402246, + "u": "A" + }, + "Beam energy": { + "v": 22595, + "u": "eV" + } + }, + "detectorParameters": { + "Objective": 20, + "Scintillator": "LAG 20um", + "Exposure time": { + "v": 0.4, + "u": "s" + } + }, + "scanParameters": { + "Number of projections": 1801, + "Rot Y min position": { + "v": 0, + "u": "deg" + }, + "Inner scan flag": 0, + "File Prefix": "817b_B2_", + "Sample In": { + "v": 0, + "u": "m" + }, + "Sample folder": "/ramjet/817b_B2_", + "Number of darks": 10, + "Rot Y max position": { + "v": 180, + "u": "deg" + }, + "Angular step": { + "v": 0.1, + "u": "deg" + }, + "Number of flats": 120, + "Sample Out": { + "v": -0.005, + "u": "m" + }, + "Flat frequency": 0, + "Number of inter-flats": 0 + } + }, + "owner": "Bertram Astor", + "ownerEmail": "bertram.astor@grumble.com", + "orcidOfOwner": "unknown", + "contactEmail": "bertram.astor@grumble.com", + "sourceFolder": "/iramjet/tif/", + "size": 0, + "creationTime": "2011-09-14T06:08:25.000Z", + "description": "The ultimate test", + "doi": "not yet defined", + "isPublished": false, + "ownerGroup": "p10029", + "accessGroups": [], + "proposalId": "10.540.16635/20110123", + "keywords": ["sls", "protein"] +} + +var testDatasetLifecycle = { + "id": "", // must be set to the id of the dataset, + "isOnDisk": true, + "isOnTape": false, + "archiveStatusMessage": "datasetCreated", + "retrieveStatusMessage": "", + "isExported": false +} + + +describe('Test DatasetLifecycle and the relation to Datasets', () => { + before((done) => { + utils.getToken(app, { + 'username': 'ingestor', + 'password': 'aman' + }, + (tokenVal) => { + accessTokenIngestor = tokenVal; + }); + utils.getToken(app, { + 'username': 'archiveManager', + 'password': 'aman' + }, + (tokenVal) => { + accessTokenArchiveManager = tokenVal; + done(); + }); + }); + + it('adds a new raw dataset', function(done) { + request(app) + .post('/api/v2/RawDatasets?access_token=' + accessTokenIngestor) + .send(testraw) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + res.body.should.have.property('owner').and.be.string; + res.body.should.have.property('type').and.equal('raw'); + res.body.should.have.property('pid').and.be.string; + // store link to this dataset in datablocks + testDatasetLifecycle.id = res.body['pid'] + testDatasetLifecycle.datasetId = res.body['pid'] + pid = encodeURIComponent(res.body['pid']); + done(); + }); + }); + + it('adds a new DatasetLifecycle', function(done) { + request(app) + .post('/api/v2/DatasetLifecycles?access_token=' + accessTokenIngestor) + .send(testDatasetLifecycle) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + idDatasetLifecycle = encodeURIComponent(res.body['id']); + done(); + }); + }); + + it('adds another new raw dataset', function(done) { + // modify owner + testraw.ownerGroup = "p12345" + request(app) + .post('/api/v2/RawDatasets?access_token=' + accessTokenIngestor) + .send(testraw) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + res.body.should.have.property('owner').and.be.string; + res.body.should.have.property('type').and.equal('raw'); + res.body.should.have.property('pid').and.be.string; + // store link to this dataset in datablocks + testDatasetLifecycle.id = res.body['pid'] + testDatasetLifecycle.datasetId = res.body['pid'] + pid2 = encodeURIComponent(res.body['pid']); + done(); + }); + }); + + it('adds a corresponding new DatasetLifecycle', function(done) { + testDatasetLifecycle.archiveStatusMessage = "some other message" + request(app) + .post('/api/v2/DatasetLifecycles?access_token=' + accessTokenIngestor) + .send(testDatasetLifecycle) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + idDatasetLifecycle2 = encodeURIComponent(res.body['id']); + done(); + }); + }); + + // TODO add test for raw and derived dataset queries as well + + it('Should return datasets with complex join query fulfilled', function(done) { + var fields = { + "ownerGroup": ["p12345", "p10029"], + "text": "\"ultimate test\"", + "creationTime": { + "begin": "2011-09-13", + "end": "2011-09-15" + }, + "archiveStatusMessage": "datasetCreated", + "keywords": ["energy", "protein"] + } + + request(app) + .get('/api/v2/Datasets/fullquery?fields=' + encodeURIComponent(JSON.stringify(fields)) + '&access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + res.body.should.be.an('array').that.is.not.empty; + res.body[0]['datasetlifecycle'].should.have.property('archiveStatusMessage').and.equal("datasetCreated"); + done(); + }); + }); + + it('Should return datasets with ordered results', function(done) { + var fields = { + "ownerGroup": ["p12345", "p10029"] + } + var limits = { + order: "creationTime:desc", + skip: 0 + } + + request(app) + .get('/api/v2/Datasets/fullquery?fields=' + encodeURIComponent(JSON.stringify(fields)) + '&limits=' + encodeURIComponent(JSON.stringify(limits)) + '&access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + res.body.should.be.instanceof(Array); + done(); + }); + }); + + + it('Should return no datasets, because number of hits exhausted', function(done) { + var fields = { + ownerGroup: ["p12345"], + archiveStatusMessage: "datasetCreated" + } + var limits = { + skip: 10 + } + + request(app) + .get('/api/v2/Datasets/fullquery?fields=' + encodeURIComponent(JSON.stringify(fields)) + '&limits=' + encodeURIComponent(JSON.stringify(limits)) + '&access_token=' + accessTokenIngestor) + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + res.body.should.be.an('array').that.is.empty; + done(); + }); + }); + + it('Should return facets with complex join query fulfilled', function(done) { + var fields = { + "ownerGroup": ["p12345", "p10029"], + "text": "\"ultimate test\"", + "creationTime": { + "begin": "2011-09-13", + "end": "2011-09-15" + }, + "keywords": ["energy", "protein"] + } + var facets=["type","creationTime","creationLocation","ownerGroup","keywords"] + request(app) + .get('/api/v2/Datasets/fullfacet?fields=' + encodeURIComponent(JSON.stringify(fields)) + '&facets=' + encodeURIComponent(JSON.stringify(facets))+ '&access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + + it('Should update archive status message from archiveManager account', function(done) { + request(app) + .patch('/api/v2/DatasetLifecycles/' + pid + '?access_token=' + accessTokenArchiveManager) + .send({ + "archiveStatusMessage": "dataArchivedOnTape" + }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + res.body.should.have.property('archiveStatusMessage').and.equal("dataArchivedOnTape"); + done(); + }); + + }); + + + it('Should fetch the datasetLifefycle belonging to the new dataset', function(done) { + request(app) + .get('/api/v2/Datasets/' + pid + '/datasetlifecycle?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + res.body.should.be.instanceof(Object); + done(); + }); + }); + + it('Should update a single field in DatasetLifecycle via PUT command', function(done) { + request(app) + .put('/api/v2/DatasetLifecycles/' + pid + '?access_token=' + accessTokenArchiveManager) + .send({ + "archiveStatusMessage": "someDummyMessage" + }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + res.body.archiveStatusMessage.should.be.equal('someDummyMessage'); + done(); + }); + }); + + it('Should reset the DatasetLifecycle status and delete Datablocks', function(done) { + request(app) + .put('/api/v2/DatasetLifecycles/resetArchiveStatus?access_token=' + accessTokenArchiveManager) + .send({ + datasetId: testDatasetLifecycle.id + }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + it('should delete the DatasetLifecycle', function(done) { + request(app) + .delete('/api/v2/DatasetLifecycles/' + idDatasetLifecycle + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + it('should delete the other DatasetLifecycle', function(done) { + request(app) + .delete('/api/v2/DatasetLifecycles/' + idDatasetLifecycle2 + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + + it('should delete the newly created dataset', function(done) { + request(app) + .delete('/api/v2/Datasets/' + pid + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + it('should delete the newly created dataset', function(done) { + request(app) + .delete('/api/v2/Datasets/' + pid2 + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + +}); From de4ae9912647758c09692ae7ddcf700cced008c9 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 6 Sep 2018 20:44:02 +0200 Subject: [PATCH 049/147] Testcase for new messageHistory for both Datasetlifecycle and Job added --- common/models/dataset-lifecycle.json | 2 +- common/models/job.json | 2 +- common/models/measurement-period.json | 2 +- common/models/message.json | 15 +- test/Job.js | 413 -------------------------- test/MessageHistory.js | 300 +++++++++++++++++++ 6 files changed, 309 insertions(+), 425 deletions(-) delete mode 100644 test/Job.js create mode 100644 test/MessageHistory.js diff --git a/common/models/dataset-lifecycle.json b/common/models/dataset-lifecycle.json index c035f470..7816b867 100644 --- a/common/models/dataset-lifecycle.json +++ b/common/models/dataset-lifecycle.json @@ -99,7 +99,7 @@ "messageHistory": { "type": "embedsMany", "model": "Message", - "property": "messageHistory", + "property": "MessageHistory", "options": { "validate": false, "forceId": false, diff --git a/common/models/job.json b/common/models/job.json index 99f93c68..2507a79e 100644 --- a/common/models/job.json +++ b/common/models/job.json @@ -73,7 +73,7 @@ "messageHistory": { "type": "embedsMany", "model": "Message", - "property": "messageHistory", + "property": "MessageHistory", "options": { "validate": false, "forceId": false, diff --git a/common/models/measurement-period.json b/common/models/measurement-period.json index 3e12b1ca..d8ddfdf4 100644 --- a/common/models/measurement-period.json +++ b/common/models/measurement-period.json @@ -12,7 +12,7 @@ "type": "string", "id": "true", "required": true, - "description": "id currently needed by limitation in embedsmanny" + "description": "id currently needed by limitation in embedsmany" }, "instrument": { "type": "string", diff --git a/common/models/message.json b/common/models/message.json index 684800ae..3c758a69 100644 --- a/common/models/message.json +++ b/common/models/message.json @@ -1,7 +1,7 @@ { "name": "Message", "description": "Embedded information used inside DatasetLifecycle or Job to keep track of history.", - "base": "PersistedModel", + "base": "Model", "idInjection": true, "strict": true, "options": { @@ -11,30 +11,27 @@ "id": { "type": "string", "id": "true", - "required": true, - "description": "id currently needed by limitation in embedsmanny" + "defaultFn": "uuid", + "description": "id currently needed by limitation in embedsmany" }, "shortMessage": { "type": "string", "required": true, - "index": true, "description": "Short description of message, like datasetArchiveSuccesful" }, "sender": { "type": "string", "required": true, - "index": true, - "description": "User or role who triggered the message" + "description": "Email of user or role who triggered the message" }, "when": { "type": "Date", - "index": true, "default": "$now", "description": "Time when message was received. Will be filled automatically by the server, format according to chapter 5.6 internet date/time format in RFC 3339." }, - "comment": { + "payload": { "type": "Object", - "description": "Additional information relevant for this message" + "description": "Additional information relevant for this message. Please note this is an object" } }, "validations": [], diff --git a/test/Job.js b/test/Job.js deleted file mode 100644 index 686bf6bb..00000000 --- a/test/Job.js +++ /dev/null @@ -1,413 +0,0 @@ -/* jshint node:true */ -/* jshint esversion:6 */ -'use strict'; - -// process.env.NODE_ENV = 'test'; - -var chai = require('chai'); -var chaiHttp = require('chai-http'); -var request = require('supertest'); -var app = require('../server/server'); -var should = chai.should(); -var utils = require('./LoginUtils'); - -var accessTokenIngestor = null; -var accessTokenArchiveManager = null; -var accessTokenUser = null; - -var pid = null; -var pid2 = null; -var idDatasetLifecycle = null; -var idDatasetLifecycle2 = null; - -var testraw = { - "principalInvestigator": "bertram.astor@grumble.com", - "endTime": "2011-09-14T06:31:25.000Z", - "creationLocation": "/SU/XQX/RAMJET", - "dataFormat": "Upchuck pre 2017", - "scientificMetadata": { - "beamlineParameters": { - "Monostripe": "Ru/C", - "Ring current": { - "v": 0.402246, - "u": "A" - }, - "Beam energy": { - "v": 22595, - "u": "eV" - } - }, - "detectorParameters": { - "Objective": 20, - "Scintillator": "LAG 20um", - "Exposure time": { - "v": 0.4, - "u": "s" - } - }, - "scanParameters": { - "Number of projections": 1801, - "Rot Y min position": { - "v": 0, - "u": "deg" - }, - "Inner scan flag": 0, - "File Prefix": "817b_B2_", - "Sample In": { - "v": 0, - "u": "m" - }, - "Sample folder": "/ramjet/817b_B2_", - "Number of darks": 10, - "Rot Y max position": { - "v": 180, - "u": "deg" - }, - "Angular step": { - "v": 0.1, - "u": "deg" - }, - "Number of flats": 120, - "Sample Out": { - "v": -0.005, - "u": "m" - }, - "Flat frequency": 0, - "Number of inter-flats": 0 - } - }, - "owner": "Bertram Astor", - "ownerEmail": "bertram.astor@grumble.com", - "orcidOfOwner": "unknown", - "contactEmail": "bertram.astor@grumble.com", - "sourceFolder": "/iramjet/tif/", - "size": 0, - "creationTime": "2011-09-14T06:08:25.000Z", - "description": "The ultimate test", - "doi": "not yet defined", - "isPublished": false, - "ownerGroup": "p10029", - "accessGroups": [], - "proposalId": "10.540.16635/20110123", - "keywords": ["sls", "protein"] -} - -var testDatasetLifecycle = { - "id": "", // must be set to the id of the dataset, - "isOnDisk": true, - "isOnTape": false, - "archiveStatusMessage": "datasetCreated", - "retrieveStatusMessage": "", - "isExported": false -} - - -describe('Test DatasetLifecycle and the relation to Datasets', () => { - before((done) => { - utils.getToken(app, { - 'username': 'ingestor', - 'password': 'aman' - }, - (tokenVal) => { - accessTokenIngestor = tokenVal; - }); - utils.getToken(app, { - 'username': 'archiveManager', - 'password': 'aman' - }, - (tokenVal) => { - accessTokenArchiveManager = tokenVal; - done(); - }); - }); - - it('adds a new raw dataset', function(done) { - request(app) - .post('/api/v2/RawDatasets?access_token=' + accessTokenIngestor) - .send(testraw) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end(function(err, res) { - if (err) - return done(err); - res.body.should.have.property('owner').and.be.string; - res.body.should.have.property('type').and.equal('raw'); - res.body.should.have.property('pid').and.be.string; - // store link to this dataset in datablocks - testDatasetLifecycle.id = res.body['pid'] - testDatasetLifecycle.datasetId = res.body['pid'] - pid = encodeURIComponent(res.body['pid']); - done(); - }); - }); - - it('adds a new DatasetLifecycle', function(done) { - request(app) - .post('/api/v2/DatasetLifecycles?access_token=' + accessTokenIngestor) - .send(testDatasetLifecycle) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end(function(err, res) { - if (err) - return done(err); - idDatasetLifecycle = encodeURIComponent(res.body['id']); - done(); - }); - }); - - it('adds another new raw dataset', function(done) { - // modify owner - testraw.ownerGroup = "p12345" - request(app) - .post('/api/v2/RawDatasets?access_token=' + accessTokenIngestor) - .send(testraw) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end(function(err, res) { - if (err) - return done(err); - res.body.should.have.property('owner').and.be.string; - res.body.should.have.property('type').and.equal('raw'); - res.body.should.have.property('pid').and.be.string; - // store link to this dataset in datablocks - testDatasetLifecycle.id = res.body['pid'] - testDatasetLifecycle.datasetId = res.body['pid'] - pid2 = encodeURIComponent(res.body['pid']); - done(); - }); - }); - - it('adds a corresponding new DatasetLifecycle', function(done) { - testDatasetLifecycle.archiveStatusMessage = "some other message" - request(app) - .post('/api/v2/DatasetLifecycles?access_token=' + accessTokenIngestor) - .send(testDatasetLifecycle) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end(function(err, res) { - if (err) - return done(err); - idDatasetLifecycle2 = encodeURIComponent(res.body['id']); - done(); - }); - }); - - // TODO add test for raw and derived dataset queries as well - - it('Should return datasets with complex join query fulfilled', function(done) { - var fields = { - "ownerGroup": ["p12345", "p10029"], - "text": "\"ultimate test\"", - "creationTime": { - "begin": "2011-09-13", - "end": "2011-09-15" - }, - "archiveStatusMessage": "datasetCreated", - "keywords": ["energy", "protein"] - } - - request(app) - .get('/api/v2/Datasets/fullquery?fields=' + encodeURIComponent(JSON.stringify(fields)) + '&access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - res.body.should.be.an('array').that.is.not.empty; - res.body[0]['datasetlifecycle'].should.have.property('archiveStatusMessage').and.equal("datasetCreated"); - done(); - }); - }); - - it('Should return datasets with ordered results', function(done) { - var fields = { - "ownerGroup": ["p12345", "p10029"] - } - var limits = { - order: "creationTime:desc", - skip: 0 - } - - request(app) - .get('/api/v2/Datasets/fullquery?fields=' + encodeURIComponent(JSON.stringify(fields)) + '&limits=' + encodeURIComponent(JSON.stringify(limits)) + '&access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - res.body.should.be.instanceof(Array); - done(); - }); - }); - - - it('Should return no datasets, because number of hits exhausted', function(done) { - var fields = { - ownerGroup: ["p12345"], - archiveStatusMessage: "datasetCreated" - } - var limits = { - skip: 10 - } - - request(app) - .get('/api/v2/Datasets/fullquery?fields=' + encodeURIComponent(JSON.stringify(fields)) + '&limits=' + encodeURIComponent(JSON.stringify(limits)) + '&access_token=' + accessTokenIngestor) - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - res.body.should.be.an('array').that.is.empty; - done(); - }); - }); - - it('Should return facets with complex join query fulfilled', function(done) { - var fields = { - "ownerGroup": ["p12345", "p10029"], - "text": "\"ultimate test\"", - "creationTime": { - "begin": "2011-09-13", - "end": "2011-09-15" - }, - "keywords": ["energy", "protein"] - } - var facets=["type","creationTime","creationLocation","ownerGroup","keywords"] - request(app) - .get('/api/v2/Datasets/fullfacet?fields=' + encodeURIComponent(JSON.stringify(fields)) + '&facets=' + encodeURIComponent(JSON.stringify(facets))+ '&access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - - - it('Should update archive status message from archiveManager account', function(done) { - request(app) - .patch('/api/v2/DatasetLifecycles/' + pid + '?access_token=' + accessTokenArchiveManager) - .send({ - "archiveStatusMessage": "dataArchivedOnTape" - }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - res.body.should.have.property('archiveStatusMessage').and.equal("dataArchivedOnTape"); - done(); - }); - - }); - - - it('Should fetch the datasetLifefycle belonging to the new dataset', function(done) { - request(app) - .get('/api/v2/Datasets/' + pid + '/datasetlifecycle?access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - res.body.should.be.instanceof(Object); - done(); - }); - }); - - it('Should update a single field in DatasetLifecycle via PUT command', function(done) { - request(app) - .put('/api/v2/DatasetLifecycles/' + pid + '?access_token=' + accessTokenArchiveManager) - .send({ - "archiveStatusMessage": "someDummyMessage" - }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - res.body.archiveStatusMessage.should.be.equal('someDummyMessage'); - done(); - }); - }); - - it('Should reset the DatasetLifecycle status and delete Datablocks', function(done) { - request(app) - .put('/api/v2/DatasetLifecycles/resetArchiveStatus?access_token=' + accessTokenArchiveManager) - .send({ - datasetId: testDatasetLifecycle.id - }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - - it('should delete the DatasetLifecycle', function(done) { - request(app) - .delete('/api/v2/DatasetLifecycles/' + idDatasetLifecycle + '?access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - - it('should delete the other DatasetLifecycle', function(done) { - request(app) - .delete('/api/v2/DatasetLifecycles/' + idDatasetLifecycle2 + '?access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - - - it('should delete the newly created dataset', function(done) { - request(app) - .delete('/api/v2/Datasets/' + pid + '?access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - - it('should delete the newly created dataset', function(done) { - request(app) - .delete('/api/v2/Datasets/' + pid2 + '?access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - - -}); diff --git a/test/MessageHistory.js b/test/MessageHistory.js new file mode 100644 index 00000000..420186b4 --- /dev/null +++ b/test/MessageHistory.js @@ -0,0 +1,300 @@ +/* jshint node:true */ +/* jshint esversion:6 */ +'use strict'; + +// process.env.NODE_ENV = 'test'; + +var chai = require('chai'); +var chaiHttp = require('chai-http'); +var request = require('supertest'); +var app = require('../server/server'); +var should = chai.should(); +var utils = require('./LoginUtils'); + +var accessTokenIngestor = null; +var accessTokenArchiveManager = null; +var accessTokenUser = null; + +var pid = null; +var pid2 = null; +var idDatasetLifecycle = null; +var idDatasetLifecycle2 = null; +var idJob = null + +var testraw = { + "principalInvestigator": "bertram.astor@grumble.com", + "endTime": "2011-09-14T06:31:25.000Z", + "creationLocation": "/SU/XQX/RAMJET", + "dataFormat": "Upchuck pre 2017", + "scientificMetadata": { + "beamlineParameters": { + "Monostripe": "Ru/C", + "Ring current": { + "v": 0.402246, + "u": "A" + }, + "Beam energy": { + "v": 22595, + "u": "eV" + } + }, + "detectorParameters": { + "Objective": 20, + "Scintillator": "LAG 20um", + "Exposure time": { + "v": 0.4, + "u": "s" + } + }, + "scanParameters": { + "Number of projections": 1801, + "Rot Y min position": { + "v": 0, + "u": "deg" + }, + "Inner scan flag": 0, + "File Prefix": "817b_B2_", + "Sample In": { + "v": 0, + "u": "m" + }, + "Sample folder": "/ramjet/817b_B2_", + "Number of darks": 10, + "Rot Y max position": { + "v": 180, + "u": "deg" + }, + "Angular step": { + "v": 0.1, + "u": "deg" + }, + "Number of flats": 120, + "Sample Out": { + "v": -0.005, + "u": "m" + }, + "Flat frequency": 0, + "Number of inter-flats": 0 + } + }, + "owner": "Bertram Astor", + "ownerEmail": "bertram.astor@grumble.com", + "orcidOfOwner": "unknown", + "contactEmail": "bertram.astor@grumble.com", + "sourceFolder": "/iramjet/tif/", + "size": 0, + "creationTime": "2011-09-14T06:08:25.000Z", + "description": "The ultimate test", + "doi": "not yet defined", + "isPublished": false, + "ownerGroup": "p10029", + "accessGroups": [], + "proposalId": "10.540.16635/20110123", + "keywords": ["sls", "protein"] +} + +var testDatasetLifecycle = { + "id": "", // must be set to the id of the dataset, + // the following 4 fields become obsolete in future + "isOnDisk": true, + "isOnTape": false, + "archiveStatusMessage": "datasetCreated", + "retrieveStatusMessage": "", + "isExported": false, + "archivable": true, + "retrievable": false, + "MessageHistory": [{ + "shortMessage": "datasetCreated", + "sender": "stephan.egli@psi.ch", + "payload": { + "text": "Nothing special to report" + } + }] +} + +var testjob = { + "emailJobInitiator": "scicatarchivemanger@psi.ch", + "type": "retrieve", + "jobStatusMessage": "jobForwarded", + "datasetList": [{ + "pid": "20.500.11935/93128a6e-6c0c-48aa-bd3d-34b8fafc29ff", + "files": [] + }, + { + "pid": "20.500.11935/c26ab160-3725-459c-a4fd-a8c88d0ff170", + "files": [] + }, + ], + "archiveReturnMessage": "will move to messageList", + "MessageHistory": [] +} + + + +// TODO do I need to pass id explicitly ? +var newMessage = { + "shortMessage": "JustAnExample", + "sender": "stephan.egli@psi.ch", + "payload": { + "text": "whatever" + } +} + +describe('Test DatasetLifecycle and the relation to Datasets', () => { + before((done) => { + utils.getToken(app, { + 'username': 'ingestor', + 'password': 'aman' + }, + (tokenVal) => { + accessTokenIngestor = tokenVal; + }); + utils.getToken(app, { + 'username': 'archiveManager', + 'password': 'aman' + }, + (tokenVal) => { + accessTokenArchiveManager = tokenVal; + done(); + }); + }); + + it('adds a new raw dataset', function(done) { + request(app) + .post('/api/v2/RawDatasets?access_token=' + accessTokenIngestor) + .send(testraw) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + res.body.should.have.property('owner').and.be.string; + res.body.should.have.property('type').and.equal('raw'); + res.body.should.have.property('pid').and.be.string; + // store link to this dataset in datablocks + testDatasetLifecycle.id = res.body['pid'] + testDatasetLifecycle.datasetId = res.body['pid'] + pid = encodeURIComponent(res.body['pid']); + done(); + }); + }); + + it('adds a new DatasetLifecycle including messageHistory', function(done) { + request(app) + .post('/api/v2/DatasetLifecycles?access_token=' + accessTokenIngestor) + .send(testDatasetLifecycle) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + idDatasetLifecycle = encodeURIComponent(res.body['id']); + done(); + }); + }); + + it('Adds a new message to Datasetlifecycle MessageHistory', function(done) { + request(app) + .post('/api/v2/DatasetLifecycles/' + idDatasetLifecycle + '/messageHistory?access_token=' + accessTokenIngestor) + .send(newMessage) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + done(); + }); + }); + + it('Check if message was added', function(done) { + request(app) + .get('/api/v2/DatasetLifecycles/' + idDatasetLifecycle + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + // console.log("Lifecycle with new message:", res.body) + done(); + }); + }); + + + it('Adds a new job request', function(done) { + request(app) + .post('/api/v2/Jobs?access_token=' + accessTokenIngestor) + .send(testjob) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + res.body.should.have.property('type').and.be.string; + idJob = res.body['id'] + console.log("Jobid:",idJob) + done(); + }); + }); + + it('Adds a new message to Jobs MessageHistory', function(done) { + request(app) + .post('/api/v2/DatasetLifecycles/' + idDatasetLifecycle + '/messageHistory?access_token=' + accessTokenIngestor) + .send(newMessage) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + console.log(res.body) + done(); + }); + }); + + +it('should delete the Job', function(done) { + request(app) + .delete('/api/v2/Jobs/' + idJob+ '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); +}); + + it('should delete the DatasetLifecycle', function(done) { + request(app) + .delete('/api/v2/DatasetLifecycles/' + idDatasetLifecycle + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + + + it('should delete the newly created dataset', function(done) { + request(app) + .delete('/api/v2/Datasets/' + pid + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); + +}); From 5436cee607b7260a3e71055832a4a081cd8ffe39 Mon Sep 17 00:00:00 2001 From: egli Date: Sun, 9 Sep 2018 17:20:18 +0200 Subject: [PATCH 050/147] Correct package handling for docker deployment --- Dockerfile | 2 +- package-lock.json | 1296 +++++++++++++-------------------------------- package.json | 100 ++-- 3 files changed, 417 insertions(+), 981 deletions(-) diff --git a/Dockerfile b/Dockerfile index b08803c3..04688404 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN addgroup mygroup && adduser -D -G mygroup myuser && mkdir -p /usr/src/app && # Prepare app directory WORKDIR /usr/src/app -COPY package.json /usr/src/app/ +COPY package*.json ./ USER myuser # Install our packages diff --git a/package-lock.json b/package-lock.json index e635fba0..c1a1de21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,34 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "esutils": "2.0.2", + "js-tokens": "4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, "@kyleshockey/object-assign-deep": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@kyleshockey/object-assign-deep/-/object-assign-deep-0.4.2.tgz", @@ -72,6 +100,12 @@ "@types/node": "7.0.65" } }, + "@types/chai": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.4.tgz", + "integrity": "sha512-h6+VEw2Vr3ORiFCyyJmcho2zALnUq9cvdB/IO8Xs9itrJVCenC7o26A6+m7D0ihTTr65eS259H5/Ghl/VjYs6g==", + "dev": true + }, "@types/connect": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", @@ -80,6 +114,12 @@ "@types/node": "7.0.65" } }, + "@types/cookiejar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.0.tgz", + "integrity": "sha512-EIjmpvnHj+T4nMcKwHwxZKUfDmphIKJc2qnEMhSoOvr1lYEQpuRKRz8orWr//krYIIArS/KGGLfL2YGVUYXmIA==", + "dev": true + }, "@types/events": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", @@ -146,6 +186,16 @@ "@types/mime": "2.0.0" } }, + "@types/superagent": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.4.tgz", + "integrity": "sha512-Dnh0Iw6NO55z1beXvlsvUrfk4cd9eL2nuTmUk+rAhSVCk10PGGFbqCCTwbau9D0d2W3DITiXl4z8VCqppGkMPQ==", + "dev": true, + "requires": { + "@types/cookiejar": "2.1.0", + "@types/node": "7.0.65" + } + }, "JSONStream": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", @@ -534,12 +584,6 @@ "concat-map": "0.0.1" } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, "bson": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", @@ -587,11 +631,6 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, "bunyan": { "version": "1.8.12", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", @@ -651,16 +690,79 @@ } }, "chai-http": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz", - "integrity": "sha1-VGDYA24fGhKwtbXL1Snm3B0x60s=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.2.0.tgz", + "integrity": "sha512-5j9LC1pl9jaPanux+wDm9D/V6R2xLfpixsRQhoJHxCR0E5KaiT0aL4544pVtYXN/wTUVSDTmwye5mCXkO/8b3w==", "dev": true, "requires": { - "cookiejar": "2.0.6", - "is-ip": "1.0.0", + "@types/chai": "4.1.4", + "@types/superagent": "3.8.4", + "cookiejar": "2.1.2", + "is-ip": "2.0.0", "methods": "1.1.2", "qs": "6.5.2", - "superagent": "2.3.0" + "superagent": "3.8.3" + }, + "dependencies": { + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "is-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", + "dev": true, + "requires": { + "ip-regex": "2.1.0" + } + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.1.2", + "debug": "3.1.0", + "extend": "3.0.1", + "form-data": "2.3.2", + "formidable": "1.2.1", + "methods": "1.1.2", + "mime": "1.4.1", + "qs": "6.5.2", + "readable-stream": "2.3.6" + } + } } }, "chainsaw": { @@ -750,12 +852,6 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "color-convert": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", @@ -843,11 +939,6 @@ "typedarray": "0.0.6" } }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -873,12 +964,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "cookiejar": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", - "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", - "dev": true - }, "core-js": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", @@ -1009,12 +1094,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, "dns-prefetch-control": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", @@ -1160,20 +1239,6 @@ "es6-symbol": "3.1.1" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, "es6-promise": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", @@ -1187,19 +1252,6 @@ "es6-promise": "4.2.4" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, "es6-symbol": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", @@ -1209,18 +1261,6 @@ "es5-ext": "0.10.45" } }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1231,319 +1271,245 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.5.0.tgz", + "integrity": "sha512-m+az4vYehIJgl1Z0gb25KnFXeqQRdNreYsei1jdvkd9bB+UNQD3fsuiC2AWSQ56P+/t++kFSINZXFbfai+krOw==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.2", - "debug": "2.6.9", + "@babel/code-frame": "7.0.0", + "ajv": "6.5.3", + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "debug": "3.1.0", "doctrine": "2.1.0", - "escope": "3.6.0", - "espree": "3.5.4", + "eslint-scope": "4.0.0", + "eslint-utils": "1.3.1", + "eslint-visitor-keys": "1.0.0", + "espree": "4.0.0", "esquery": "1.0.1", - "estraverse": "4.2.0", "esutils": "2.0.2", "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.8", + "globals": "11.7.0", + "ignore": "4.0.6", "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.17.2", + "inquirer": "6.2.0", "is-resolvable": "1.1.0", "js-yaml": "3.12.0", - "json-stable-stringify": "1.0.1", + "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.10", + "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", + "pluralize": "7.0.0", + "progress": "2.0.0", + "regexpp": "2.0.0", "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", + "semver": "5.5.1", + "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "table": "4.0.3", + "text-table": "0.2.0" }, "dependencies": { + "acorn-jsx": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", + "dev": true, + "requires": { + "acorn": "5.6.2" + } + }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", "dev": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.5.1", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "ms": "2.0.0" } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "espree": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", + "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.10", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "acorn": "5.6.2", + "acorn-jsx": "4.1.1" } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "chardet": "0.7.0", + "iconv-lite": "0.4.24", + "tmp": "0.0.33" } }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", "dev": true }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "safer-buffer": "2.1.2" } }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "inquirer": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", + "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", "dev": true, "requires": { - "once": "1.4.0" + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "3.0.3", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rxjs": "6.3.2", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" } }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "regexpp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", + "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==", "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "rxjs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.2.tgz", + "integrity": "sha512-hV7criqbR0pe7EeL3O66UYVg92IR0XsA97+9y+BWTePK9SKmEI5Qd3Zj6uPnGkNzXsBywBQWTvujPl+1Kn9Zjw==", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "tslib": "1.9.3" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.3", + "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", + "ajv": "6.5.3", + "ajv-keywords": "3.2.0", + "chalk": "2.4.1", "lodash": "4.17.10", - "slice-ansi": "0.0.4", + "slice-ansi": "1.0.0", "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } } } } }, "eslint-config-loopback": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-loopback/-/eslint-config-loopback-8.0.0.tgz", - "integrity": "sha1-8UK8pHEimUoahfGcwhY1EWFrQVI=" - }, - "eslint-import-resolver-node": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", - "requires": { - "debug": "2.6.9", - "object-assign": "4.1.1", - "resolve": "1.7.1" - } - }, - "eslint-module-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", - "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-loopback/-/eslint-config-loopback-11.0.0.tgz", + "integrity": "sha512-fojQS/3L4iB9+cutT6Usk3Bu2TOxNCXZqmd42dlt7DSsM21vbRnaNMsSnevoMtnNSKeCoXOChh4wfYjpUsx5WQ==", + "dev": true, "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "eslint-plugin-mocha": "4.12.1" } }, - "eslint-plugin-import": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "eslint-plugin-mocha": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.12.1.tgz", + "integrity": "sha512-hxWtYHvLA0p/PKymRfDYh9Mxt5dYkg2Goy1vZDarTEEYfELP9ksga7kKG1NUKSQy27C8Qjc7YrSWTLUhOEOksA==", + "dev": true, "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.2.3", - "eslint-module-utils": "2.2.0", - "has": "1.0.3", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "pkg-up": "1.0.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - } + "ramda": "0.25.0" } }, "eslint-scope": { @@ -1555,6 +1521,12 @@ "estraverse": "4.2.0" } }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1605,16 +1577,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - } - }, "eventemitter2": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", @@ -1634,12 +1596,6 @@ "strip-eof": "1.0.0" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "expect-ct": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.1.tgz", @@ -1845,15 +1801,6 @@ } } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, "flat-cache": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", @@ -1917,11 +1864,6 @@ "rimraf": "2.6.2" } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -1947,21 +1889,6 @@ "lodash.padstart": "4.6.1" } }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -2025,12 +1952,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2045,14 +1966,6 @@ "har-schema": "2.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "1.1.1" - } - }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -2244,23 +2157,11 @@ "through": "2.3.8" } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - }, "ipaddr.js": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", @@ -2276,34 +2177,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, - "is-ip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz", - "integrity": "sha1-K7aVn3l8zW+f3IEnWLy8h8TFkHQ=", - "dev": true, - "requires": { - "ip-regex": "1.0.3" - } - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -2330,12 +2203,6 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -2436,15 +2303,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -2455,23 +2313,11 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -2583,11 +2429,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=" - }, "lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", @@ -2636,7 +2477,7 @@ "nodemailer": "4.6.6", "nodemailer-direct-transport": "3.3.2", "nodemailer-stub-transport": "1.1.0", - "serve-favicon": "2.4.5", + "serve-favicon": "2.5.0", "stable": "0.1.8", "strong-globalize": "4.1.1", "strong-remoting": "3.12.0", @@ -2758,11 +2599,10 @@ } }, "loopback-component-model-diagram": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/loopback-component-model-diagram/-/loopback-component-model-diagram-0.3.0.tgz", - "integrity": "sha1-sg2+GstsXMASRdpNYVbRAohdyLo=", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/loopback-component-model-diagram/-/loopback-component-model-diagram-0.4.2.tgz", + "integrity": "sha512-354GqYUrkJe2t7b9aE56nwneUu3thL7cZwsPDLSkzUT+MigUioZciS+SjOqiZ9WChq6f/P2JzPoz2nEenv11PQ==", "requires": { - "eslint-plugin-import": "2.2.0", "lodash": "4.17.10" } }, @@ -2970,7 +2810,6 @@ "integrity": "sha512-GBX/v8ixXuwWS3LoDjJWR64aF82IEbGnFZ1dpAc2pSpYf/gyDLN6IN6UvfIKt4uda9u+OKsLsOh3dxCBDmjGWA==", "requires": { "eslint": "4.19.1", - "eslint-config-loopback": "8.0.0", "loopback-datasource-juggler": "3.21.1", "strong-remoting": "3.12.0" }, @@ -3302,27 +3141,28 @@ } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", + "browser-stdout": "1.3.1", + "commander": "2.15.1", "debug": "3.1.0", - "diff": "3.3.1", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", "glob": "7.1.2", - "growl": "1.10.3", + "growl": "1.10.5", "he": "1.1.1", + "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "supports-color": "5.4.0" }, "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "debug": { @@ -3334,19 +3174,25 @@ "ms": "2.0.0" } }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -3541,6 +3387,12 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "nocache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", @@ -3692,295 +3544,6 @@ "gauge": "1.2.7" } }, - "nsp": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/nsp/-/nsp-2.8.1.tgz", - "integrity": "sha512-jvjDg2Gsw4coD/iZ5eQddsDlkvnwMCNnpG05BproSnuG+Gr1bSQMwWMcQeYje+qdDl3XznmhblMPLpZLecTORQ==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-table": "0.3.1", - "cvss": "1.0.2", - "https-proxy-agent": "1.0.0", - "joi": "6.10.1", - "nodesecurity-npm-utils": "5.0.0", - "path-is-absolute": "1.0.1", - "rc": "1.2.1", - "semver": "5.4.1", - "subcommand": "2.1.0", - "wreck": "6.3.0" - }, - "dependencies": { - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "dev": true, - "requires": { - "extend": "3.0.1", - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, - "cliclopts": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cliclopts/-/cliclopts-1.1.1.tgz", - "integrity": "sha1-aUMcfLWvcjd0sNORG0w3USQxkQ8=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "cvss": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cvss/-/cvss-1.0.2.tgz", - "integrity": "sha1-32fpK/EqeW9J6Sh5nI2zunS5/NY=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" - } - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true - }, - "isemail": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", - "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=", - "dev": true - }, - "joi": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", - "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", - "dev": true, - "requires": { - "hoek": "2.16.3", - "isemail": "1.2.0", - "moment": "2.18.1", - "topo": "1.1.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "nodesecurity-npm-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nodesecurity-npm-utils/-/nodesecurity-npm-utils-5.0.0.tgz", - "integrity": "sha1-Baow3jDKjIRcQEjpT9eOXgi1Xtk=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "subcommand": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/subcommand/-/subcommand-2.1.0.tgz", - "integrity": "sha1-XkzspaN3njNlsVEeBfhmh3MC92A=", - "dev": true, - "requires": { - "cliclopts": "1.1.1", - "debug": "2.6.9", - "minimist": "1.2.0", - "xtend": "4.0.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "topo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", - "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "wreck": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", - "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", - "dev": true, - "requires": { - "boom": "2.10.1", - "hoek": "2.16.3" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -4157,14 +3720,6 @@ "array-index": "1.0.0" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4180,11 +3735,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -4224,22 +3774,6 @@ "pinkie": "2.0.4" } }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "1.1.2" - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "requires": { - "find-up": "1.1.2" - } - }, "platform": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", @@ -4333,6 +3867,12 @@ "whistlepunk": "0.3.3" } }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", + "dev": true + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -4363,43 +3903,6 @@ "util-deprecate": "1.0.2" } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.7.1" - } - }, "referrer-policy": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", @@ -4479,14 +3982,6 @@ } } }, - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "requires": { - "path-parse": "1.0.5" - } - }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", @@ -4613,15 +4108,22 @@ } }, "serve-favicon": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", - "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", "requires": { "etag": "1.8.1", "fresh": "0.5.2", - "ms": "2.0.0", + "ms": "2.1.1", "parseurl": "1.3.2", "safe-buffer": "5.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "serve-static": { @@ -4653,17 +4155,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - } - }, "shortid": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", @@ -4795,12 +4286,6 @@ } } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4812,51 +4297,24 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "strong-error-handler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-2.3.0.tgz", - "integrity": "sha512-aBeGbfOBm2LyAtno8yXJSRNDW3vZxjIHNI6y120WirkDIPV5Ytcx9Y1IG22qo3tXi6Zo2s1OJssUM9ji8PzwXA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-3.1.0.tgz", + "integrity": "sha1-yoXnpnB6xxcBFdOIEOorFgib74U=", "requires": { "accepts": "1.3.5", - "debug": "2.6.9", + "debug": "3.1.0", "ejs": "2.6.1", "http-status": "1.2.0", "js2xmlparser": "3.0.0", - "strong-globalize": "3.3.0" + "strong-globalize": "4.1.1" }, "dependencies": { - "strong-globalize": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", - "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "accept-language": "3.0.18", - "async": "2.6.1", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.6", - "globalize": "1.3.0", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "ms": "2.0.0" } } } @@ -4907,7 +4365,6 @@ "qs": "6.5.2", "request": "2.87.0", "sse": "0.0.8", - "strong-error-handler": "2.3.0", "strong-globalize": "4.1.1", "traverse": "0.6.6", "xml2js": "0.4.19" @@ -4923,43 +4380,6 @@ } } }, - "superagent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", - "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.0.6", - "debug": "2.6.9", - "extend": "3.0.1", - "form-data": "1.0.0-rc4", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.2", - "readable-stream": "2.3.6" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "form-data": { - "version": "1.0.0-rc4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", - "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", - "dev": true, - "requires": { - "async": "1.5.2", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - } - } - }, "supertest": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.1.0.tgz", @@ -5127,6 +4547,12 @@ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -5203,6 +4629,23 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -5212,15 +4655,6 @@ "querystring": "0.2.0" } }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, "utf8-bytes": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz", diff --git a/package.json b/package.json index b5adf880..5b67488d 100644 --- a/package.json +++ b/package.json @@ -1,51 +1,53 @@ { - "name": "dacat-api", - "version": "2.8.0", - "main": "server/server.js", - "scripts": { - "lint": "eslint common/models", - "start": "node .", - "posttests": "npm run lint && nsp check", - "test": "./node_modules/mocha/bin/mocha --timeout=10000 --reporter spec --exit 2>/dev/null" - }, - "dependencies": { - "compression": "1.7.1", - "cors": "2.8.4", - "helmet": "3.9.0", - "loopback": "3.16.2", - "loopback-boot": "2.27.0", - "loopback-component-explorer": "5.2.0", - "loopback-component-model-diagram": "0.3.0", - "loopback-component-mq": "^2.2.5", - "loopback-component-passport": "3.4.1", - "loopback-component-visualizer": "1.2.1", - "loopback-connector-kafka": "^0.2.1", - "loopback-connector-mongodb": "3.3.0", - "loopback-ds-timestamp-mixin": "^3.4.1", - "moment": "^2.20.1", - "moment-timezone": "^0.5.14", - "nodemailer": "^4.3.1", - "passport-ldapauth": "2.0.0", - "passport-local": "1.0.0", - "passport-openidconnect": "0.0.2", - "serve-favicon": "2.4.5", - "strong-error-handler": "2.3.0", - "uuid": "^3.2.1" - }, - "devDependencies": { - "@mean-expert/loopback-sdk-builder": "2.1.0", - "chai": "^4.1.2", - "chai-http": "^3.0.0", - "eslint": "4.10.0", - "eslint-config-loopback": "8.0.0", - "mocha": "^4.1.0", - "nsp": "2.8.1", - "supertest": "^3.0.0" - }, - "repository": { - "type": "", - "url": "" - }, - "license": "GPL-3.0", - "description": "dacat-api" + "name": "dacat-api", + "version": "2.8.1", + "main": "server/server.js", + "engines": { + "node": ">=4" + }, + "scripts": { + "lint": "eslint common/models", + "start": "node .", + "posttests": "npm run lint && nsp check", + "test": "./node_modules/mocha/bin/mocha --timeout=10000 --reporter spec --exit 2>/dev/null" + }, + "dependencies": { + "compression": "^1.0.3", + "cors": "^2.5.2", + "helmet": "^3.10.0", + "loopback-boot": "^2.6.5", + "serve-favicon": "2.5.0", + "strong-error-handler": "3.1.0", + "loopback-component-explorer": "^6.0.0", + "loopback": "^3.19.0", + "loopback-component-model-diagram": "^0.4.2", + "loopback-component-mq": "^2.2.5", + "loopback-component-passport": "^3.4.1", + "loopback-component-visualizer": "^1.2.1", + "loopback-connector-kafka": "^0.2.1", + "loopback-connector-mongodb": "^3.3.0", + "loopback-ds-timestamp-mixin": "^3.4.1", + "moment": "^2.20.1", + "moment-timezone": "^0.5.14", + "nodemailer": "^4.3.1", + "passport-ldapauth": "^2.0.0", + "passport-local": "^1.0.0", + "passport-openidconnect": "^0.0.2", + "uuid": "^3.2.1" + }, + "devDependencies": { + "eslint": "^5.3.0", + "eslint-config-loopback": "^11.0.0", + "@mean-expert/loopback-sdk-builder": "^2.1.0", + "chai": "^4.1.2", + "chai-http": "^4.0.0", + "mocha": "^5.2.0", + "supertest": "^3.0.0" + }, + "repository": { + "type": "", + "url": "" + }, + "license": "GPL-3.0", + "description": "dacat-api" } From fa9642fbbc5a3c64ad0bb97bda64d550a3294c6a Mon Sep 17 00:00:00 2001 From: egli Date: Sun, 9 Sep 2018 18:21:09 +0200 Subject: [PATCH 051/147] Add support for datasets whose files are stored on decentral storage units --- common/models/dataset-lifecycle.json | 4 ++++ common/models/dataset.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common/models/dataset-lifecycle.json b/common/models/dataset-lifecycle.json index 7816b867..aeb2c18d 100644 --- a/common/models/dataset-lifecycle.json +++ b/common/models/dataset-lifecycle.json @@ -51,6 +51,10 @@ "type": "date", "description": "Day when dataset is supposed to become public according to data policy" }, + "isOnCentralDisk": { + "type": "boolean", + "description": "Flag which is true, if full dataset is available on central fileserver. If false data needs to be copied from decentral storage place to a cache server before the ingest. This information needs to be transferred to the archive system at archive time" + }, "isOnDisk": { "type": "boolean", "description": "Flag which is true, if full dataset is available on disk. Warning: will be obsoleted in coming versions" diff --git a/common/models/dataset.json b/common/models/dataset.json index 637fd515..5a721bb6 100644 --- a/common/models/dataset.json +++ b/common/models/dataset.json @@ -134,7 +134,7 @@ "permission": "ALLOW" }, { - "accessType": "READ", + "accessType": "*", "principalType": "ROLE", "principalId": "$authenticated", "permission": "ALLOW" From 804b6a5534fd6e28db4e6e5a03e8adef8303e87f Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 10 Sep 2018 11:20:47 +0200 Subject: [PATCH 052/147] Update ESS pid prefix --- CI/ESS/envfiles/config.ess.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CI/ESS/envfiles/config.ess.js b/CI/ESS/envfiles/config.ess.js index 73f72c5b..86201675 100644 --- a/CI/ESS/envfiles/config.ess.js +++ b/CI/ESS/envfiles/config.ess.js @@ -4,7 +4,7 @@ module.exports = { restApiRoot: '/api' + (version > 0 ? '/v' + version : ''), host: process.env.HOST || '0.0.0.0', port: process.env.PORT || 3000, - pidPrefix: '10.17199', + pidPrefix: '20.500.12269', policyPublicationShiftInYears: 3, policyRetentionShiftInYears: 10, site: 'ESS', From 79847fdb76717ea06a07311d56d603ce4059df04 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Tue, 11 Sep 2018 10:13:20 +0200 Subject: [PATCH 053/147] add data description --- common/models/published-data.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/models/published-data.json b/common/models/published-data.json index ef5d0714..76587422 100644 --- a/common/models/published-data.json +++ b/common/models/published-data.json @@ -52,6 +52,11 @@ "required": true, "description": "Abstract text for published datasets" }, + "dataDescription": { + "type": "string", + "required": true, + "description": "Link to description of how to re-use data" + }, "thumbnail": { "type": "string", "required": true, From bf2ce01727b39e0acd2fa8f3621619f370e11a43 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 12 Sep 2018 16:04:48 +0200 Subject: [PATCH 054/147] Issue #41 work in progress --- common/models/job.js | 179 ++++++++++++++++++++++++---------------- common/models/policy.js | 4 +- 2 files changed, 112 insertions(+), 71 deletions(-) diff --git a/common/models/job.js b/common/models/job.js index 5807c7d9..d56868b9 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -6,81 +6,122 @@ var nodemailer = require('nodemailer'); var config = require('../../server/config.local'); var app = require('../../server/server'); -module.exports = function (Job) { +module.exports = function(Job) { - // Attach job submission to Kafka - if ('queue' in config && config.queue === 'kafka') { - // var options = { - // connectionString: 'localhost:2181/' - // }; - var dataSource = new DataSource('kafka', options); - Job.attachTo(dataSource); - } - Job.observe('before save', (ctx, next) => { - if (ctx.instance) { - // auto fill dataOfLastMessage - var now = new Date(); - if (!ctx.instance.dateOfLastMessage) { - ctx.instance.dateOfLastMessage = now.toISOString(); - } - // make some consistency checks: - // - ensure that all wanted datasets exist already - // - TODO: for archive jobs all datasetslifecycle should be in an "archiveable" state - // TODO ensure that job is created by user who has read access to all datasets in case of retrieve JOBS - var Dataset = app.models.Dataset; - // create array of all pids - // console.log("Verifying datasets:",ctx.options) - const idList=ctx.instance.datasetList.map(x => x.pid) - Dataset.find({where: {pid: {inq: idList}}}, ctx.options, function (err, p){ - console.log("JOBS:lengths",err,p.length,idList.length,p) - if (err || (p.length != idList.length)){ - var e = new Error(); - e.statusCode = 400; - e.message = 'At least one of the datasets could not be found'; - next(e); + // Attach job submission to Kafka + if ('queue' in config && config.queue === 'kafka') { + // var options = { + // connectionString: 'localhost:2181/' + // }; + var dataSource = new DataSource('kafka', options); + Job.attachTo(dataSource); + } + Job.observe('before save', (ctx, next) => { + if (ctx.instance) { + // auto fill dataOfLastMessage + var now = new Date(); + if (!ctx.instance.dateOfLastMessage) { + ctx.instance.dateOfLastMessage = now.toISOString(); + } + + + + // make some consistency checks: + // - ensure that all wanted datasets exist already + // - TODO: for archive jobs all datasetslifecycle should be in an "archiveable" state + // TODO ensure that job is created by user who has read access to all datasets in case of retrieve JOBS + var Dataset = app.models.Dataset; + + // create array of all pids + // console.log("Verifying datasets:",ctx.options) + const idList = ctx.instance.datasetList.map(x => x.pid); + //test for missing datasets + Dataset.find({ + where: { + //inq loopback operator + pid: { + inq: idList + } + } + }, ctx.options, function(err, p) { + console.log("JOBS:lengths", err, p.length, idList.length, p) + if (err || (p.length != idList.length)) { + var e = new Error(); + e.statusCode = 400; + e.message = 'At least one of the datasets could not be found'; + next(e); + } + }); + + console.log("Here!!!!!!!!!!!!!!!"); + //test for datasets already archived + /*var Lifecycle = app.models.DatasetLifecycle; + Lifecycle.find({ + where: { + archivable: false, + datasetId: { + inq: idList + } + } + }, ctx.options, function(err, p) { + console.log("LifeCycle: ", p, idList); + if (p.length > 0) { + var e = new Error(); + e.statusCode = 400; + e.message = 'At least one of the datasets is already archived'; + next(e); + } + else { + next(); + } + });*/ + console.log("......: ", ctx.instance); + //find the relevant lifecycle entries and update their archivable property } else { - next(); + next(); } + + + }); - } else { - next(); - } - }); - Job.observe('after save', (ctx, next) => { - if (ctx.instance && ctx.isNewInstance) { - if ('queue' in config && config.queue === 'rabbitmq') { - Job.publishJob(ctx.instance, "jobqueue") - console.log('Saved Job %s#%s and published to message broker', ctx.Model.modelName, ctx.instance.id); - } - if ('smtpSettings' in config && 'smtpMessage' in config) { - let transporter = nodemailer.createTransport(config.smtpSettings); - transporter.verify(function (error, success) { - if (error) { - console.log(error); - next(); - } else { - console.log('Server is ready to take our messages'); - var message = Object.assign({}, config.smtpMessage); - message['to'] = ctx.instance.emailJobInitiator; - message['subject'] += ' Job Submitted Successfully'; - let text = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n'+JSON.stringify(ctx.instance, null, 4); - message['text'] = text; - transporter.sendMail(message, function (err, info) { - if (err) { - console.log(err); + + + + Job.observe('after save', (ctx, next) => { + if (ctx.instance && ctx.isNewInstance) { + if ('queue' in config && config.queue === 'rabbitmq') { + Job.publishJob(ctx.instance, "jobqueue") + console.log('Saved Job %s#%s and published to message broker', ctx.Model.modelName, ctx.instance.id); + } + if ('smtpSettings' in config && 'smtpMessage' in config) { + let transporter = nodemailer.createTransport(config.smtpSettings); + transporter.verify(function(error, success) { + if (error) { + console.log(error); + next(); } else { - console.log('Email sent'); + console.log('Server is ready to take our messages'); + var message = Object.assign({}, config.smtpMessage); + message['to'] = ctx.instance.emailJobInitiator; + message['subject'] += ' Job Submitted Successfully'; + let text = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n' + JSON.stringify(ctx.instance, null, 4); + message['text'] = text; + transporter.sendMail(message, function(err, info) { + if (err) { + console.log(err); + } else { + console.log('Email sent'); + } + next(); + }); } - next(); }); } - }); - } - } else { - console.log('Updated %s matching %j', ctx.Model.pluralModelName, - ctx.where); - next(); - } - }); -}; + } else { + console.log('Updated %s matching %j', ctx.Model.pluralModelName, + ctx.where); + next(); + } + }); + }; diff --git a/common/models/policy.js b/common/models/policy.js index 3ab1a585..f27a8eb3 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -27,8 +27,8 @@ module.exports = function(Policy) { } }, function(err, instance) { var email = instance.profile.email; - //console.log("email:", email); - //console.log("manager: ", ctx.currentInstance.manager); + console.log("email:", email); + console.log("manager: ", ctx.currentInstance.manager); if (!ctx.currentInstance.manager.includes(email)) { var e = new Error('Access Not Allowed - policy manager action'); e.statusCode = 401; From b0b6a0a7e4b5e5355f4c2ce43b57ff72aca8953d Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 24 Oct 2018 14:51:03 +0200 Subject: [PATCH 055/147] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 646db569..57d4f14b 100644 --- a/README.md +++ b/README.md @@ -109,8 +109,9 @@ NOTE: An example of kafka has been set in `Job.js` The data model is defined inside the common/models directory according to the rules defined by the Loopback API framework The data model is visualized in form of an -[Model UML diagram](http://localhost:3000/modeldiagram) or -[Model Visualizer](http://localhost:3000/visualize) +Model UML diagram which can be seen at /modeldiagram or + +Model Visualizer which can be seen at /visualize # Data Catalog API From c332bb9681a424efd9ee1f14e97be761e76ee204 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 24 Oct 2018 14:52:35 +0200 Subject: [PATCH 056/147] Add files via upload --- CI/ESS/scicatmodeldiagram.png | Bin 0 -> 260654 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CI/ESS/scicatmodeldiagram.png diff --git a/CI/ESS/scicatmodeldiagram.png b/CI/ESS/scicatmodeldiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..99d676de720038f4fc75d7caa28472280bc07f3a GIT binary patch literal 260654 zcmb??byU<**X{t$&>`JO3)0;<1|5RZ-QC?KAsx~+Dxq|DBV7YX4_$+FH(adu{l5F( zUF-f93(ml>&vW*9_Othi`S3(CHq0;-RsFU(8rZZG$8w^fjrY^g8EPLJtqEfo>wQ&Uk0eeVHZh0aZU z@B3c4zBp7_3aPKk&4DC*%}Ji0>MkqH{G1uv)>sti>+Iob{XW2T_D5%9?bn)$FOeU7 zV

N5<+dP40W~N8R=_eq(+(&ogYPsk67UiLtv+Z;&dq30nWa5bV+*jg4 zbRmTqyq^lBDb)c;7s}GF!0+5=ccwTW1D;?!DpSQeWsiM~BpTBC{q?W8{eO6-$MN#f zAKpJH4?%qR5yWTy@cqs+NK6TXl+DYnF@cXb)Ib}1)2|kV3`Jcx98F2TpF+EuD#{tTNe~}6h4}mcKvI%&Oi_ZhZ{MC{Q z49tTd{Ax+Rf#UQ0YCJ(jOA7@3YSDqgZ=t^${&Zt1P-KE&=1tZ)HnQCjBrg-?>}l0Q zg+F%3Olt#&nH=LhY9X|0goT#2T3y0_&8O?^gT2nz>z}zSK7)5B_$?;MDBPHV<>#0e z{z94E(S#c8WYrxFsp@um70elWT6J!%_G(tnIH(f6y8Q5H^XzYjmYjg(^Khb8Njri4B{=m{13V-&^iI)FnSP;EBQyxsU zv38%-o$AXm>6O;qgY78fCZxQnEL7~1*swi+c@Q|6UxEC~hWj%cAcY5ynZ46Qs?4S8 z!Itb^Htl5%6Wmbx?!Y>ON~LoaX{o=(w`N7u=id z*9nUYtDCBM{oq5qCFc62*(<)PPngXYS5|$3J;m(^EQH%zw7~av>>Yom?Z#wN*Le)o zDG;eQa%~45W)wujVhWYVf7Lz|79Hgtrr~;T^)1|i%wcAb^!NrhzO+e?eW`DXuob61 z&^C4E!^eeqF5OO*SvI=eYWnq6Y@iQQ_1iIT_Zxdq^THkVd~?D(cShFy@vJG7jend` zI<5uka91uDK(-sthV&k(k@jd?n1aDn3Ujr}Jwwl}81Wc@)i;r*(1KxKEv8fIjthu4S>Xw8A70u%x(ctISh%Ay<3W zK8hL3tS|riO!6a&ug@&9scK!F4o`>@pKsAC4jE9d{s|lL2v7e_cmFVtm(5EflkO2|vH{{qoB%2E4)m-r^p1K>(EZlJJOtt>%aEnUi`8@ zZkiW%uh`T$I{zevO*~%Vb$B~sGp%x!B;bQ-?msM zffV1}c4bI=76yh?kkeEuN)()A`yv>tHr?ah7$yq%$Lx9Cp8gi6F#Kk4sTx!-Q6!-S z!^?v;Bl3u|5&~iUCOmNAhxw68mmo)1iK3^~N(WlsWQn}%a8*XGZT5r9%w6QjR9PrJ zmP>Mg!mQ+K=HQLxA?2UBiCuuGJ%hWy=qq_a!T2S0p6En){n?z*Fa!P(*B#7yf95T$ z_9*y))!UZzHv0s`-ptI-l!Jd1DvWp`=&q9egUh1yz*f~JZ%5Ed8HBN<|7XvQ&3esL zx`L5B{SZq%8(j8VX8cCyYA83Hm1&h%J9qbGgBRnsGDf$bi@Uq_AWT3T_Ss%Dzr|Cm z)jGRPk71^dvP{WJGM~y2Ue*h2gp3RFZ;CD~v{nH}zdCSpe)bUaJ8>K9l)l>Mw+IRg z>%~$AFP1?8tl>FM@35-`1`LFpcr5 zn?8)lBZN~dHkZ$X3NLwrrt|StaFB9CX&~X_U(XCHGn|ajd4s&p(6Wpbj&_i;hC3GOjGac~J=*5%%lZ!6!IjMe~Fqb9l** zE%aQeY*YHM-?j%Ja2!Y{nYH<^B@XQ6LD(7Fc1SF=lID%4D8;EgmXA_B*10rDUwP4O zBaHdnrYHWk)oZH+Ud+OK1QN$X?va8;P%aB6^gc0ZB7gItY3TOJ!DNJaWod2Q>sP-X z*9f$$#r(gcxI`eRLem7Y()@ZH@fua33|N#THw=tnA=h{9; z_=twVj=|xHOFe4(jO_S}kk#haW#0_B((cI@%u<9$nO7#Qp5dQe{4)vzRsYV+jr?4! zb^JhWRZnjMd#SrV-?+nN)5~iVUf1E?^Ym1!IuMynd}yLibfH*wo2*x@DhH$S?U!|Q zISX;!a*(!@|NGU@PT~*f6)jRDJ%vVnD`Q8GJStWbCd5^s_ld&4T}^Y8Z-egHd;UCz z{>KIJv{_kJ_QC;qO6AXb>;Q()xq35ywTMLABN1z({!maQXS&9I5_(>*1D5<%Jszm- z?o;T^=fHQ##_GBPZ5={0muu=-F39o=@>HE7#*G2JoL|I0L6OcFf!SW+u=*eu@BgKkYdasE)y_uq z+a!@%j5a~hJFZ*(Tna#*hjW)(x<$#fgkgUUMD{snB*IC2;2z>vdY~wfqly5@%znx- zJj%dzx(=8?;B4_0n(G2q8z)tJ;I4S3TfV%-O9T8K@e#puh9YVl4B;2Aa?4B^5ovgmu zLw>Y|oyNB6|HMfJSA1mjh|$ z@nSc#?qIDXwfV4;Vy&}N9;W5`7THPoRZRU_*Ya^f1oI`zW)ns$3;Y7OQoEyQ`tCm= z>)Odcht2Bo@ze@fB{fW@KEgyx<&R416@2=hi3>M}P0dbEB84H93P3B%m)!-VXymb9 z;5;Jltq2OfrkB_u!O_$$UATj3Hd6~dC6SZ9{)qQWEB-i#$U1lpG6w3#0^}UeG)p5B-DC44KaMk<{RTf9M!tn0>dj$cw8jAax)xUph6wMJ+)4n=E_(N$pYGr9?23mV@N zr4)ouprvnnswGXpI_ z?3O05b?BHI)JA|^X4fNL2P)M2q{{YR3#w8fUe&WjWl!Pl@@;qZ2&5id;@Tta)?-;t zzQQS)MN>vUj9K-13__06UHKo8(pLyS(&WeH-r)y0alamvHIozRPwq6s(5)LqY;`&8 zAafQsMsn2wGUDk0)zh^swGx1*-Ij)Ce)jONK$W-UQ)2bM61 zn*@=do;E`45*{E%fFsEyCE3zJLx6hb#Cl2wh(%O$hiaI?{3Dy#>@2Il47d9jlP;ZK zx9s0^Q-Q}vol2uO=rQtre$wRr%Lom5cCsDZtM6p23(5t@8tXc}iam5XyQ8hR`AP3| zh?lHZWy8}~n`%xZlFk=4c6YR}$OnM(k%AFC+UZ_GxnV zvnmmtV?=WDfGkx~lSglnQ#8%${XBG#kf~#c7DMU{RsQ++t(4(5!6f!sX5Cx{a_4AE z6#8sd9!Bh-$=3Qxy{_GC@Bs}K(aF(rZnojf;-wd8dJ};!qw<-oV?~oj`ne7Z`W5l> z1;XJ}MCfhpZ#F1-@rJH{k!VypPtb@)zedaC)>9SuYP}kM_Z% zvalQDo1TP=(pq$0zz^@%8pIG`j@`2S2=D*-k|N>#THcQpTVWIH5lB~W&nb)sY&ODaO__!qn=6i_9G%yblDi?X#+nf zi88|VUWaF{31hWBg`We?in)gqs;YWO$2NB*x z5FoPsVdFB4O}ghj`r%8`h%Q$xnvjM#TY2IUTg^V03W;Og4&OO5KaAIAxiFB80jP6v zehx`MqGN1m&GMyJE(I`%WFG5q4Q04|mndRWcv!h$>Wg0$HGG6fjasFlWGtCf zG2M4<1~PvVKv(cCoJM8ynWE0Ojp+H>dkTKq4?CYsVs|!QQq>s=nlz(IJ|FPy$PohU zdBA^a2D;u>8;=3ZcIwU{w=XKN>D(KWAkBbsTrUKFUpt4Lrc{U^=;yKmp7RpO9*-WT zK<<6u|IABu73hD{KJ}V+YR3c6lqCzbX#vy~Cz;;+#FjY(mH>Rk$Ty-fI952XB0kNE zyv(tUU@!^Q!gZ!T36P}!tCgZJah;gX@q^*{S8 zl8aJEoq7(3P`$PyVo_P}oN*{gzBg1&<*(9>;Lsi0jH}bbFZ-&9DvogXF3cR*k?ry7 zJ=<@(o<96;R%z=)ObH@#RYEA*7Or#bTHiJW*#UadtC&~IDb@-RBHzti@p?vF{qgeV zLp!tC^9YV;8Jd`i8R3_6@a!3~c_q}pNo*wc`-_A%CkmVGRQ~uFH<3x%@JG4Dj< zuQ}YqEpB9A`|`9B6wv1gC^WT9hvWV&;>D&t0{3cvYTV>%Np$Ed;#CnXH7mH^wAAxA zbGf2s#F~jJoBgdAy_QA6jsk6jK>)a8iFsL~p84n7_RfBK+RLq#%V{by%SARtOxJV> z|75ujj<>-lstL@Eg(vNAi;gWp?o+Vz5TfKSg#Nxb7o#R0|K`!Nb}!r$Y2FA-@C6Ew zdT&n)|1>iSc3cHzQi+DoRT8yu<>sb>HDS7IHbf15UQ8qnc{zXMF;#VrN(y>xn}bK;wkwI1pwP_E2J8mcr*1ntUb!)5Yhi!BE3-Ow(W*!ksf~WDOC7Op;fF> z4f#sZytU2O+2WxFqKU-~Tx6BI}M-mgSZpfV&=FO(WGQHN%Vyhk6mBch~ z+J?#eb^Ns@0Uh32vKeLS*9F*EO)QN~w8(w*px)WBHB5t&_G#H6-mXXdM9>qX%9O&m z33BNr=y5@j%SHJ+Ewuvf4F=f(fVIn&&mjT&SD}&V! z#v#m#+!fZxq2B%v|F9F$ty|7Nx(8A1!I~G2p zYna2x8u_*%=;~f z1eG{Ms&|^MYK^Yro_vyxpV7&FVCwB@FjD8SX)m7I6mHcv)yA~kqw!O2^I9i1uwD8b zJv^%31@vdTp<*!!T#=3KvlRW|cYcbfekA%TNUaT+4p+rHB${fuwo%o3z(5Nz5pSnA zUnTi2vjYTNHP0Mw*E|~He1q+l`Y^Qh(_qB{q@}FTk`j9JDLq*RO#AL=FYH-2;o66M zr#}Y^Bdr-Oe#A<1B^*<2!X_V=~-+ z4kY3YZz2t|s@a+QR^iGD`iJFiMWYl=(z?DwTV$$JnHzu44+ii^Jwyi$lxB&rv`)`Ced z&yi)@LsOkSK1OPxdWwpFJ-gDWFto&o?ughPF2<`$7Urq_VM9vdq&0uVYWrsuLLq@W zl}5+@vkjr|CkeD=6+nOXro!9%D#^ICmo_7=3SGbVr$utPutGS6KH;5(R*!a^_l^I{ zS}4Z7WVrmRL8Fp)Bl6CERxW}K?NMS)O{>d1Pmn0n#8V&%9ku+?=Gmq4Tp?sE4%o{n zgZo-X3Vdp(^DhZ4ckF~}{VY~Y>w?>0%I90RpD!im|7lBOI32FSykxIpqP8_RrN8QY z@F6CLWz=IK*F*W$3Z#o#d3($1ip!1L;SO$E9xgu?Fk|rIbe$gC<#VnQn-Qu+t+sNc zHtxF7dc6Xze<{x_?mL!8R~x@5+u?xJT~Ki8_CL*?QE4Qg3%J(q^SCz%q^$mVhyC9_ zX^2zN^-#9NH?IOXLYpG&z0F$`-jnYb3>*@Rt6tle+Le)^Ub){COE{A}BZV`9F&g-Sj{y#WK+oIz8~w-FnuG^-d_pMbF-yr>*L*MLO$Vc5|G?Jq>+Y-spe@T zCV&dBdF75VD5*8vclR0L+Z{^Sy?exkSUbE$q7nQVJOKL=^B_%Fn0#OfvKh7jytQ=+ zf)zP@Og@MyfvxcQQRYeK!#Ys_KWX*AcmJnx|L{sK|4-lEjTsjNx#P>r`5xMT6$8a< z+;aTOqrgy8nWHh0^*J_=_exn&$Vrl?JcT5sl3s~MK=>GFjRHBvfzPyi>9Iy#$1|+j z5yAu?b8eHlhNCg!VcI1j%H9vy05TGV^Ocp->6P&-<^W^Lb zmMZ}x;M3w2yC^5fU=VzHl{11(B6-rUYXybZiejnbs_tu20KTxlQ|a03Kv(qF2M!-3ve_TMEJYvp*%hDVte)hT>nolZ&ucO-%USKhP{MK1oE-AR!wi};xqB1 z>s@c73NbY$w!9+utDGQwW0(;zg^AMPCsC<9jj~gDVY)v5EXSRwH>A3@^ZSjxh{c?I z;DWvBIcs0S*En0DHkUw3iJ_xSIRrTKKS(U`VeeDf@sV3Ww3AdiobSLNQAvbJHK`no zMaa@zANwapbDjl zntXNV21`c3NGtC2AY@c1lyGV*Yq-22ARK-KO4w{zD&YrEnhrbnA%+MWc&HMF+_*4?JqN zcuu>CXv*2502QNgnE9o`D_{3?VZZWK_?ylvhd?nY+!Js-#3%FLXnEqpB99DSc(*y? z-(;0xKXEcA6#?#5kWi$vsjmJ^v#IvLwnv}bazc5J7jk$Gi83mSCm(C6nE05iK&Ib| zRdMFte6Z(@EyN_EA{FD0zi;#mOl36hZ_7*In^NC5S7a*egs*0AW_X!3 zjBxB$W$xv&I)f)wXWD^X^uB(=L98gmm>)i+9Lq+UbH|9B&x@;>a@X#1yJ$fV`I|)i zNp}nRiixP+TO6#2oaNf@V+jpbvqr4H2D6WRk!=*8mUarexGdH~Z!i$;F*|K8b#wT0 zxKYFwfALNF=yP<93&7bsJ{#jqEMX^f$Dp_O_(i+{ELlwBW+g^;8&r0}4ktWIu4_k|YHybLfod+gU)i){aDOyM!rcim)uzKpe> zKG_uCk&$h=E+=%>; z(Gcj654Bdqk=)rR9WATFFL#fJtMnzzjoUMy{M+XsIJJ8@ zR`^5b<^!7N<>JC^;J-~um0KUFX!JV9#^sNx0#xExuiEMrY1x1=h5bl~<6_OtEMmt#5U*e}PVIq$Tb zhR7*X4)FcoR#6_Mt`m!ttpIN?Rsan-6i8pog0wEzDvc^4b8F^1eEyA(XhT6Nsq?Al z>N4Dj5d#A&Jbm*aNu`?9MK!yz_}V*soWamD*xNPD^CKj3CUDwMm2DOVak#q$&sRS- zMCR9MHhODk?W`-k(O{=LbRVGIIZF#@mU9qDp%Bvpi~BgV9g-o#fFKgxj886HI`~z| z)fr3M|C9jTSPnuMt8Stq$z> z?f&5ocvlBXur(ZncEQIy)i5N#YHa7Ye?jN5MvwNhfO?6)7|cju8LC+=8wT`g^E1Iq z+Qnih{8n*vv@NCJ)3dT6t(!FeO4&(j5WG&fy20RIlr(5o=| zUI;}ucGe`UKXM;hsB1YN_9XU7R7h0$UfW~C*LYz%-C0<7i5xg)&0 zANpYGBVtlbXw=Hd`rXBFiaLJ`QPpZ_9wk>2{)u7Pzj@4Ua3V-YUXq*7rcNz<$NY^H zYdUi$>NY)AWC>iT%%lkOeFr*ly=35g+fO`b&6rh=f58@8b+nHrR7>gxRn&mt@3s#= zoLMPQ;#Y;%`()ARbE~AVp?Pu&ySh`Iz>T1tOh^k9>Sb;hde*0 z30~Vbo9cS>y4-b&lgI3sLUdk$8gjY@SP$$OU);!2d7v#|W59{ zbGfLdnG1)pIeGRFSZX_0y{V<8g{~IitugE~N>QkKc*c5-S)?Y)XYPG4m{$Kz!28b4 zLEPl9nT;{U$$PPw6aJ~2m+lCoq?Er;4CmD?IJqbdX}Eu&o%1(2dLNF=s|sysBUjw7 z9riNgSjbqkDw_8BBFblK%Mu>FfS=uN$IZx?lR@%>v#y0hr;T?|N1CoBQC_`Tpo*^> zrSX`2-V;pM0E|}yrBBg?q9UuCvSQ%He?VVCB)Naro17~1Geu~bGw+O0G^YXFzz3@7 z1vixHS$e9PpzWfjte`&>w;OlMEF^52r6>E$9-{IkmwwhcRzx>zytszb9ToUPrFn5tU7 z$)glbwT$pt|4V(2N;lhu=U_!-Ke}3YVycji#}UQj{1S<+rEijw|IXMw{91(Rj)T8! zNgnnEW_2z~$$(yxt+1aEm)f1w!#@opn0~$^duq;qK`TgRsxBldTD`Y@8$!i>B~leB zCscO~hyQ0(BW|HNsG9!m18AON=xsMH`KI$%l*nJpu9I3K<}mN1_Rfe5(n}SG#5Onq z>@}arU>+jP|KjS_11EkxM|BR{;UG8t6=?2oY>T+9zr>^>WJocRz3Em(ze170NKTJ` zs_JaX0E~TAlo<&qB0v=8X;V$gErjmO&03gj(qI>9b!)YKJ(p!O9YLOz6t@3aG)$>V zR3Rcv;-jIn*>UhF%6wBz>l#Jhk-!Xl%89-AfdG4}PZ~cK8U9>Vc6DDtYY6`~k}=>d z^r-A$3zw|xafXfC6Wd8SA@_#T)>cnHLt^9A_27Bzdq?oS)Fqzy-IL$TvZKh@!B`@* zophJ@&5e&!qK^JbgBvaDkjG_7I;i0(->oU*ta{`4X#85(;aIzeB*~Fp6Xt9OLZ7yQ-kC!Hc|ZCs2;5`E>y zrQqdN`|-}%_gP6K+2 zuvf4>eKL14mmEzxt79_CSOX&8 zZ#Cgtb8;c&plsteP>*JfDx(EE5c4g0dy;2bucD z_R_#Yb#wfp4Rd(1BaD%P`GLONzBs@46)x{$2a(wn#GRYSd$w+SpG6HR@_m<4-%{1c zEFl`lh$LhLxZ0!?RtIoJxB+!Gah?Zt2^9hw3QfmQwnL{TUvgV%gY6oN%ew@{)j=F~ zFJV>~;&D~$&f?->_HUt~{(Ajsy%Tjz%{dS~are;TvT}`e?PwFgKnWx{Iwra$zEIr= z%jzZ)xqE^>-p7wmphqfZ@9g`}K?JzHLM!66&6___*?U~jPoK3aLuAfn(m6^bq*A*l zragfOS7-Op37KdN940)S$&x5K$Oc*7cVKqvJe?RxPl3 z=}c~LXED=H`j>o=n}G)SGUT%jo@LIM%8Loyulj*5JOBxqRvWg+k_`j9ABM1)zXbX| z`x}HuFxm2BKoiA11KlQbqD)@2%~^N)v*7DM+cQl6EX?eu@Xo532ol>mM)b=zTNSxe zFnDSfAXEa0h(Yu070Q!~<+W{1C(6klL~GcZo%t9~gnzP)ytv`osLT{|Yfy}_v^uYd zE6X0fKU*@ls^D2KBAPD#3@)e>oi6mciv^LF}6)x`n(tvub#ECI;Uk^>5a^Y=K0XEjiakehZP0oZFuZ%rc`8 z@E-MnmQs0#vI2T)=9fdR9rsGWR0lAKtRp~wg?eI@Fi&;HG3ep?ihSEm&i`=5U_rlw zMSgFQv~cN=rWvCl`pZ36#ooMR?3H16 zTJYb@GE!VX*jEV>DmjL-#x`+HH!%px3AAxp?JA=Sto@LLRKgKVu;P~G+;HO}$=cu_ z*Gghs;zwfxW@wOY7agBF`aW8;c^}aw!evceP2$jRi{P7`D}5DsIRmt~a4;^ziIrz- zg@oveyAw0e;Ssd~x$eHjvU4Z?;B@IQlH0AvbNHPeZIRvZ7PC|8X-bi<)6uRTXg#pM zGjE|tszls%c($71WEO&ufe@m?2SfnEY?KOB8tt~u*`1W|XS@06f`1&#a&$E79$)Nb zlYoES!dNRU>@N;U;hGo+luJwmp<;5J=zDa%kI=KClPT*cuu^29K(qzyJW6>=uW(3q zd)iptw!}CQ&B@{G8bGRPe$Z{<-l)x+;?z!KnmCE)+DPG@CCy(J^bxNBq89WwYuuF< zG#JdFiyfMuI#zhDtR3(p=4ujDl*+>D{Zsg( z;%eMI4-eZm=J=q)N};^8L6Vyn2~!|;l4met7+F%m#fQJ0P*yhu?jau>oi0B5=rZbZ z7{*|vd<=5{ffjHB+YUpEeLFgh}SW@zF#pOidL*s%L>aKe1bG z0*7@>xs84HNKdLDL+z7Sa!jjgSPy5sbxkmaOV^DRo{g`64g}U52A-L(P9Yr6iOJ20 zy36&4sL*u&80;(5h8Bun9HDz6p-{9ONU-Cz-GvU+LCz(WoSn6x$)yVZ&hd#bP^{r{ z)5HJ)LI(X8xFL$Z_|HUkYw#S_e(V$|vry)QDe9Q;i#2MLyhJc9(!U!L5$a8lh+r8L z{FR+f32HNY@>5-Gz=@s!%g*uv<`=g;b0XsC-VVU3&sN%MhA2v3f*Zn5BCq299uBfY zkiT%a=NB>mpq=5)6>YPD!Hk_xDch&Eu4NqYiZ%y{Pt8XRSPxd2oa9K^6$@?Ag$`1? zD2sWNt1@2xAUQ^A`eK6Kfbrc-V2`c%n6hV9MRTs~?}S%8qT7E7pC`~V&0eea7#c}8 zCKG;aMH{+XFd|d2Z^jv^?)7?)`n8bY(Y6oOo-noLno5Xq`?8pJww(afydM;2*fF{#d8@g&{QpD*#sbIBENlCEGGV|+Ue1qVt8Q`b<>vSFZ;8j!?xV8q4zfP-3J=CH zV?pYY8!I{{e#&WOCwO+lVp~U0dZ8Ph4w4jU-S7OkY8WMn!kvi8lffd^UD!B?xLYgC zOrTep#Sao}{9u#kz8|VYriQlyVZ}t|h2ED?WDvw}J6{EESWnz@p z!g>6YvC*#LqqSgObKeq7cr*Z{jMrqyEq{rg6h>Fn7PGomwUs9jW|cQzO4;J@;-qs- zB6a=Hb27xZMEKD`2kP5I&>Le{Haabkt{915pXa4*wGyid!vr@~JU1gzs&G-(UU}r} zIB(0K(&u2wK|4auw@|X@adL|2p2?i~LHJ(XwxS!atg;oT%!lW@=3R-O(Gsxph&jpq z6~h7UVrH@roasSdM;$vdu_F^#U9QzDF~^;?8`;~Bw54W4SW?_elk+F81nCx?=Tj5# zGTeiI_s8A}882%RnHvwZMG6X?g2+4E=gKePqbCH~#@i_>2<^IfsgPnXNLxSG#r8Ri zZaKFG6RiL@>rQ0;be$ruZsNF!^i7K8qJvd$A!d(jFo5xe5 z+u<#xn##k?SXwzrY)3(E_?sfn-a-RLGNgqQ0{2em*_~S!394@8%#UXYogI~-sE$<2 z>BhHVP1BcYsrV9M4rmDf(U*tLVD}XXHgUNz(qSM4pfBm$ zA=#C|Zs=VwU@yD+0eyA&NzyAwui-rMV=dmICFS zOyg7@J{+3Bw!Sp73neGG87HJt7|t2I7;3!4$Vgq^V{Yemges{J*4I6f zE#^b*WO`;?Iiz`&qC*rxbNK_L=L@#e|Gb<~@7DBi1*e~SO0G$WSbXk<`%t-d*v767 zi~>VE*7?j|A}cbU1x8Rc{-{j$NGDpSc0XauFr;ZV>yG(vtlYdkR#9Q}PQa zD3EXtWW1>owD?Ga6m#hz>6^M1_y*B`FFW#>L|9-WO~r!8poL z$2R;2TP?+qFAS(L zf3{{l_;j%7l>$SMUuwsT;k#N?a(0jA=(=cJtvWk;2|`Ek)AzA~Nl1CWe50p$xh#L^ z*~5&a#jEP55{Yz`PfTe^=(ZBb#+*ZwZH*mp)umNRd1)6@KXdKfHH1Q}{Ro!vwV4b= zCFfEe@xByOZbE3dyhJ;suR%gMGP_M7$$}6);8A0X$$P{vtV5_BKdU1FW(V=J zEd2PYxTI*tApS+#2hJIDi6uqL(hf4q^*eE!YWAy;ui8rK+F!Use7U=Qu*78 z118=6tVJc2_~bM^0fbWPG1dE?-Xn1N(P+hsuu^&;>jU#}UU+vhEpBQpAq~KfxS?yL zuGIm|jL$!KqyQNvm()Dl_+s8gZ=#Xd3f1W=d@9xHIYuCumeFu|zT5iR&^!(%vY2*z z;ncv!1lL)5!>`H0T=g}|}Txp2@?8+y0Co;&YYWR;VeaV+(4WAA%j{sPMYLoB1Jb)kB$(5N2Pz)$Cr5^1R^W(xE{`>wdwqga5Z41Koz z5YtOo^PdQ=R1MHFb0ra;Ea4eBfQdG{G$cub#`T_uG*>|qhI%3i5 z8-B!mr>ZhnG=$b5#tx@kA>#Hu9rKGj2m7(sKf!-dL>Yep9`tu%;n{j7BL7D-+yvLj z`ij*%pLLpvu96R;d3KylE zcE$GOtTXb+{bq^!X89t#)vONv$&g%FdeRGJ9hv>KD7lCWQ4H7^F8UgKgA>w z(1x%GA$EC`7AU&R2Zc^mYL$d=YkhhtcRKTOxSJL@#EIh}%LMOQD&xn{S3EC-A>d3? z&jExcmuevBWL|AzJ;&!@{!7X>C3s(!~2vgXGX+^a|6I$);0=aZEQ6(>Gpgl+F&t z-$>p^6YxBgEE~Lio_6;k6u?%;?`S4h(v??$_p;@3WXxWq~aDs1Trbvx_6C+vd(Og~{Qb%q3CY=_Zv$9Yn52(v`S zV>)hOTBHP&LMwYouaEA*?3vm)XwQbTKS3~HL?B(^H?IOVHn3*TS$oKl>0+#-1%^88Z7|{%^1NLIl|MAffYx}P+3Nz_b`r!=FT)U+o;0gY8tU9 z4C!4y8loWzkxYq-@^lB?Buwu*k|qU;hsBWX4F zjd(BWCmcgotbC`RN6zs)=E?Lx9zl-ECZ({}B+xHa77>qs-d|yN=tFXL*n1MN(e~Z# zD|QC@Lmq!CHE4_9qI%1<`>g0IIKO>-s#fHAUQ)?H=Q~@^WDOnT;@zj-CQT9R@do*t ze0}}k3Xyr9$@q+i`I*cGdm#+G>Ekt*M5w(Yb(Tc zJgzS5_~Pk%^<)rcsPMxlOCqg~u;PZI`{R-8o`kAP{BaC7<4A6dwtxIprLXs_mD+z}px^RAD+eQDyT)47j#=2JDqC!nVD&ytSE>hc z+`X}9!>TAOOt3i6l&WzHSm1@W7O|p3QLgg??wt^eIF58P32M>mgo!AU3Suh7o^mun zNrpyU0)%_e+KQDfcu2MkjMAv62}v0?eo`p1i~B7y2S>T$+tFgVSppgq45r03BD8YX z-@idA=fl)&-h_$ycQeK(qCXkv$JE#|6#P3xr{0m+Tz{6%s>>RMRSfFw{53Nki;PEu zUlbf0`!mcE80{>)TH}MSkvb*Qg)jY+55kSr^-*9>VJRfQ^-bbvkJf0TUe>MU$E_p__)#Jn~8w}JsCn@y4S`VMsYz55gv_8sfq~RCyWm< zS#1IJ*Bfw$`j);%LtU&b%h=)g6<20LYoQ{@3+0j6O@Oo1^M?=ml$(KqxYdDPYezEF zof#%hR00NsB}m4YPBGlUhgh@&e0v5iLTDRRXg2A_U72YQC4zcazu1xxb7$a(u$M3{ zZ1SSAhcM`r5yujHTk<6~^=bgoSl}xgdYLX}L(jcCAJhFVv@J9b5Ir{qr^))9$y2|y~rfI7u4TLdEtJq|IpWo z;;6Xp<)`)v74jdX)x~WjbBTpXxrE|9uvs-*eK0@#^A~`4@0Y!=bzmwd>^3D>aVS8$ zQ?g*vOLi>GxxHcsCj!wE;kzP!w_-u~Gb^Zt{YVQ~nN&wol;BC{!V$n~0;19xqgy`+ zj=|6D(dZf1Hs%>|Jx>ey677PXb#hwvwm_IAmYik=r7oWzvyKADGgHik4q?L7L@8&= z`CWRD1<+N6I0V<>ZWPm0M+@;wwJbzM#N|cgwt#dLRfE%c;Fs(GrJLRwTPOqNQ#}8I z8Vx-j_--iTY)tm&D)Yj61%rm0}CK>D~c0#M0GJDC{)XbRu?{G&xZt)X4*)b`(lLa!m|O-LMtuPlO8 z^IjD7QEymENSjP+jzM%(10p8okuyQH;b$nlEPFwesp_~-qFZ^|H0P0bXKD~btlQTg znG;uDcNM8j5;Ky-)KiH&2GJ@6R6ZE(*;rv83gh56)??QjgKYa>sgPFT7`~PIExde) z(sZ7%K8gerIrWsCxxv(caw?r;T$h%C`oS-E(+~~#nK?O4k@mGl=ZW>%o}z{x{#wKG zm;Rg2mWM-YDydD+6Aj#MRD#Z|C9BPOytEC16oRNm#8V&1mDHT2Xc0c?gjE2n&U9f0 zxl?utCMss@w&F{hJsMQUbeh^hZ0l(tbR`kkF^!YwGzunFIYa%txaUCh*g&fV6lF{I z<63iFFb>(v2f!~-${$M^F2@_Ei~b+3-ZCn#u8A6KG&sS7LvVKpZoxIUy9IZ5g1fuB zyK8W#ad&rjo6hroGizr4_w99SpIx=<)U8uTZ?u)6hwo65PqbPhOD!eQG2nv2MH1I* zE98tF5iM3`2LCU$HH0h2Rm?VfL!W%LC!`ua=8!uSM{5>*`B&;YtGdbUlM^Ex9=SUE zDqX@lOFDRY4?2!|rC!~elEBEGX(=Y6nhvR-HD zM(Eby&-Kg7omp=Pqwt=8>*()q+7kOOf^h?MN@&%jm`&}1SvrpIFzly~&y3bq?ir1JWJxWAlE7`ObgV~jv@f#&V z*~j`AoElS|FsO_GNk{WvF~WoWd6bF=i&PtG%hxMm`R~|0zMaB0e8MawbDI(O)OcSI z!*HvsWwIuq$T88{r^`dC+ig|t!4zn$BaBh)yXP?qxOah{E8>CB3kr&Es`cw1d#w)p zXIK^ytcJ>esUEV`O+H6qIbAXM97G*A81!M!RYR0oWa6HQ!_m!62L=N2?T3NCd(C6} zuTJQiYd%Lg6KvYQ_Got-+%{|PbZB)J`t9widX1&>K86q{2j>sCL6;Q>^%D2Ifg@di zXE5V}uHA;GtH4hRRZ9JO!1*nU!SViMIiK=NAEq?PA7jf|NjZ|AacN259NV763JQ8DU3vm=enpdWX1 z=~6q#+ofVp(;C_4C5Me{lSkRqA@==%mbdur4owU(H++)X z2Z2wq%^BF%S9ZEiZl;Cv@xy2rsK@{N$o|eF3o6C!!bfkT&v#HJ3*(*!+ZzruJ}!F; zJ4)y*tuQJuu%J`0PTdd_@g^U)yJO}YvRnsV+E%Dm7>rkZ0yNh*aZz)Fzgwaol&d0SPI=IyY>GMYj8Q9!J_?K zDu_yu{A379GRpO)yv$_c=GWFBEuHloDxqn~Yp~NoTB0m4eV3`pk0SInqORd9bTYn2 zn%M<6$pVuUTe!ox!__7kE!Ln$rExku0VP0Xwl1iZ3|X~0#x7>hJuTNsu&;K2Mh66| zofy1K8NU{M&Mc}WF2N~3uYBW!#i*^|ae7Wc{#%S`d5wpq%$3F5TG)}pjF{0Szt_>DlW9J;-t_VHD=du|E@sqcwQFY;ye~5qKsq}>Xs(MW#*LA5gGh- zzyW|7$Av-`aw4;f!dw5s``*kCdE5Sb_OA%Qf<&No{|E!D{Mt*$mBj z$aU$P+6ipmBR;{?Y*xW;b(SHH2<5mSY(ug@ax8CEZ1NX((kR3@EVKf4bbtfJl*U?> zPaNbq^|}Oe#lsAmV`slwTux;$EZ0A5>7lLqqz~CH)O57wHpEP<(HzB))4T!ciAGv< zVxZUBnb%y04nRz*Nn;J7;EV_bAd&vEg7Qqq)rP>ibQGxgjE0DSr09R)YMGsuYD+iTGmb$ zjVa8g?9gi_Clx_RkF@b3w`oQK7##m&u}Ctv+L93(w&AXwzbs~%;(si-1T~ezR}Rt= z{I*r1PDHptQ($|zMwr@83k`%z9Y9{zzkh4STYj$S&Y^(S02R)ka8;9Wj9o_HoUvS* zZW^4ba2Y*tKU`ZIRf*-~4S_x>IlM#4_&Dc(C3V8NWq^o%%_9M4#M&5S`>flX`kKa1 z*L}gdBSZu-?~|O%jJrW{w8pE@eP*M-OjnF`@71uY>I=RqO^vx3vTz+zb$H4VFOaAA zWpbPyJ9l3%LPq+w#?RbT58x|(>7!TwCFce0r5a!5dHt3!c;MKNFyodt^mRD7O3>Nrh+(q%B3qh14G+!gbY zf@WOx(6p*5TURQO|C98OtG4*g0@Vop7Xd$``)|XE2_JXLt4J++X8@Jx0i0kU8fkG? zkY6v57*}fum6k)W8F7}H9jrt1)^bpEwI^e*Z5DDt{eE?178}aahm@1DmXJf*T0D!u zUK^QUljeymjtp&y_%%I(@Tn%u&;MazOK4GU1zD0y5IMG8;hF`%v&!x~3X}4DXw@f&A^RDsMANWN9uIkI=u&8{g4Di^$vrqVUtBs4&L^}e= z`E~;`9cHAudny|2twI%XL%OZeyXmr2@&|~KIne31!uEiMw&}AxBt38a?{K2|r?p)P z#;9pD0O!8x0d(Qy1wv}5{kOx-w^us58>V!Kgm`MN%|A{0+kPtR z{x`}qj8y5qHelYIH}MDgd(LNIxcm0_$PxJ(d+Uw-d3AIVu}q$0zsZ-qCCH-3==A#f z6=%|BMk|NeuOsXyWKWa{2ws%}gz#o{8?f3FKO|skxd?pr`AkTwJHF$Fi*?DUv_qSg zFs&W{YQmz}NZaYP12by<0%b6L;l0n|-qGq@caJB`x2UIxIW1!dwGVj9pNcF}1O}G$ zF^l>*5OKs{mVS`(7dCUVdUqF;15NHBM)+ose73n7q%OqZ;M=+j(sPPCzGMGE*b3}$ zlu(uM*OAaNt}g1$27Q!*mv|$oQm^emUi-`8p$^;T{~2RiAyOtMramxJ>$dj33j0#1 zL)p}ib}v?ovn}FLt9cB1tb8}LdTpv^Z#OOQX*y~mHaMvkDP5iAlG<_Ur%feN26H&x z6!gSjP*1}T6R41zD!$><2WI@Ly0CefoWGnkHVqX9z(ZK2Z%gAlymF3D4;c_dJ6ji+ zg&l9%ith!59d^LiWmh-J=KJIH{c1a9O>u{``y!mH27d*k0*B{>tOk%MP20 zo%C!k8K;`B?&7`DZ}=l)`s>rLB=bSKYXtsejc2;7C}s&ajv8j8c&!ykEA&xl0x^Um zmO=aa3}uaEtw@tbSAo{Gu53449Wd?7^0BjmH|PHE?ASGQw*4mE zJkMWYzV1L;nY?4w-!B=k#J1z5VI;U}n{dTiBwOqYk+ZRO-nt7B*|qoASSHKzOXc@R z3fz4qWE@N(kcexCiAqL{UcA>G4vnJ^$&dxojLsa6VU$m_WmvGL6-)C-EO59=nN(YC zX@=ZAalztE7sn6oibka*cOt*Y7XKU>?7OQRzN~FINS~95+aLh+Wuc{chOapC)B)6z z3O{&MW3eCdlX#<^;#uk%#nvfs_e_E-3|iGEsVk+bMC&zZDIXyQ_=K2@O6F8y-Gk}$ zO+@0rOqUXLgOij`YeL~L;9=X~eokd(klEplZU;7KfAaU}%Zbjwx7$<@DOSsD8oOy|H_>c6(s#_c41U9j;wG)rF&5sygF8~(R3T_; z(=pL>o$_iFFmNX!MgN@NlH4G98dpADff+vfP9&&0XVdcKopjdDA9K=Jv6YUxQ7D%& z<HDM}4}sE%%abcGI8yHska2>{#v1Cs2DxSzs%I&atZH0p&;BlBh|;UfFq zF*&$8sNd|kl5^|?O=zX}3IVdNIGF0mA{h=}1k5$pzgVSe6HyUL0#%|qR7AMu*?mLL zl9VRw6nxg{ZI%Ev=N{zLzE8c5o&x$XkYZgDFm&bmM|8%8R%!@6a+~=6zQ4SgpD7-6Xg(2}Q{$%uH3ZD|+lzSnhb_WmZDImar-u~R=PwP_Mu`h#s<&|JV0Nd% zZy&meujWX!zb>qQt;8zmcG`~6`_j`Kdo>{{6`=4<)`{Aj5{*$yjRi!kY1Ho@v2-dLwYsHIq+f$c<+`;Aa;`74EGrM;PEs6& zHJm1B(!JAOBpM&z?uX5rXiu`?Osw^zEig4Vy2RT=09~(SdAfkB)Qe0doa=d zhU>@eoh-LPkOaF%|ondfq$It>Gy+-OKdu1oRX{5Hvk^P@pNN2th? z5~g^iDnUpzrhAl(wQ~W)S01x}qGPW$*l642BuO_VE`~19GIRc;nhbY+&!_yw7s+0< zxEmsslP^;lPg{wA5W~20)T>&rS6s(IAztAdIlq2(2Lqy!(cq3N?bp$DWNCG|AN5#H zDqlO!Q&>KrojFNt#Kw5zmN8|BKS=r0Z!A1}NXz9zSSGLN{dW-q`u+^PE;ZE{#$h<$ z&o!jcdUa{lu2hV*isq-Ly9(h#voC#3xtU{LHU2ia4hb4q`G+cgDVOE%Q5BZ3w4AT2 zuv4K12sNm#DNpduv4NVW9hR!iQs7E$pTkzzeM#dhEg-U~uxfrodO#x@_0bP}vqzU@ zE4HUbSk+Bn=kHNEDfc17(`#>YA`EG2lqadv0n|ytAd3s9N~JhNnTX+UB85t=TBsIm zmRxDt?XN_fO}Qm;ckDxhypIxbQDDj1kO2i~4fL%z6Yk_kucPlemC-iLR18(<`^}i1 zv|yw!>;%SY-ZXP{@|2s}IDxQwYTvbmk#T3duY5&ImA-CYV^Utifa!yh{aN$6yJ!1n zbB8H!3(({WP!wdn{>hF|yFCv`wu!@o_(n&1RIh1O*M2mRA_vR`3X3$*shr;w46|Nb zgN!~=(mSsSG=v+EbDUf8I&iT7uNmi{CL7d2JV(9tQs1piBjsZoSeTm9>>^a*5W!ek=c|27*rhBSj^PH)2KM!VO9j$^>(kzPRr2 zmwafFj(EByo84tJ$ET5TvLm%dR7ZO$9CN21kSM+K8`aP>DGu3dt3D2usE%=bt#S}+ z`U)vqNH)VKs!fr9`jY5d(;AIZg%9jAhCZnue)P5f_35!y%K7SUt|8-X?a!``K&^v= zT+_SR0UuYK!sJ+D)~(z*|DQQ7JE2zJKs&=LoE|-5!ERWzyF4rs@3^IeLr_%QukgB< zVt4uiyS6)Ex(2H5N7I+9>d;wN`c9uoBK1Pz|K@#I{wDpBx(azd5B_V|Q=@_T5>Qg{ zRtagv|7rsaFH4*`4?hyDO|;5QGcKP8@vvY3)dYrx>|l*z`(v7@QrAC=Nk}@&^pU+3 zlhUf25~OtMQb}A!e4B2bo4vg3E6{-236!rX4~9`kvl5$%PoG4M$F4@({KPZ6rv+JQ zDv8-|xOX%%z+U3i&d8Y!*F{nq@jXZX1vA!YX^;evNCN3`0a0DaIfe|-2sF|_VF1UB z)Syr_>FEzWjGopCeLrJKpsSn-O0&xED3@jFwT&+ztEe*oBr4n0%R6koBvZ;Z=!l}< zDYVCr>`j{(2*iPF5TmJwvcPMK{Jc-G#GGI|e`{BIJx&v$_v)`mVD8Z9nr8;0>IaDy z#!P}=0vdE41u2f-)jO8RS-?@!E4~-WUP8uq+A+k=!fMnP9YLNO8c$-*`>^}s*MSS9 zJ{VHJWpq0ZcY>;?ghHFMtxa!jki5=E_zPR*DtL#UAsg32e`^hCFF7u`5q=0ifQ=O- zLn6dmNl}^wd!sPIeRUz`k3aW8jV)cq}(dn~rsJan86mxTK zdl{mFAXnAMMQey=EKi|Gv7CmP+`deG;FxbyoXJ#u`uqyYRp`2D1znCwC`x9A8WK{4 zSH@l^UXiq$H21zyLZxxe4ef4NNC3x7QQqD;B2DIrVMQ$amdtT|$1o$LW?s>iZbVmM ztRrRi%FHXn{A;mDV#mU`7t@W?T>=S4hxHF74iIT?@(#Jm6l)tHoXO(>Uz--5da)M; zk~fT47`|5y?XirgWXbqMo~My=c*xtJBSTk_nX>vDZSahiLw2G)i!+YIsauC1p4-2T zY>`lX?jdQ7)QdOzD^9j32nV>ru&V_}o3l|Br?_PQc@+z2kmWlfEd*2c2>($K?MP<2 z)UK4FV>h_0DyfOFkN@I2a@lAuBDKr${NCs!p8fp@@;!30)oqHq$tLk-$%X3@8t@Vv z_l!bLc;qR)MLIunX)vfvG2bR1Z&g$`#grrcT9S!BzK+{C)Hl3ejs5|%`IKD4r#Nfz zS@cl`naQ~PRih27$KS+EgWwGasI=?U;wQqj>4bH%Ea|QIGOz&3&My|H3R2qLO16D!dppNG_J<_ zV7oo2yh;jFNjX^jsa=`A(J2->y)rm3p+Q7Nx(e%F{a$%hh{0;bkXEU*8gXI|Y|FHc zu18@!nZ3GkHfL1Evp3C(B5vuEva@^1ASjfjcKbR8k&YE1Gjj;fwBp{LvQ~wt?gzNN ztz%^F@KmD6(v9PFM$LbH#OkA%$(w*i2ugFFvyg$$@>wrsdhiuzN`z`A`{+`=p>$m{ z=tmY6ZR&7zQwwU6w{mvThojw?*Tiq{GY(a#)vdh!lpR)dJoZwK#$JSV2YWA^HPh*P z9v_=%sa@DDw(YB+)8NrMq5q5)T-nmOIncnYU3=??v@%sg4>&Gy6E6yQ%~_wmmrbOF zPX7bj#-L8M?y0}3mOVSCxbLqO&@q(7C%y>Lhfh+itnZ}rlT{)M* zV6h7G2AO~g61`)hOAQ@nlCm)ST-d#OO~ zji@=CU;puP{lF17g7bX6l`~6y^4oc#zC@j!H!bg{Gn6mAi{m4SJ{sI|*}RCgXCeGD zG-eS5!<`t8qr@dV$kJDOKev}LLVJ7#4*T2ehN}uR$JrKYfnF{&n)Nu zQ8s1>G-QS77+UGMU&y?|{P8bErJHXs73@H>X@lUuy_i10p(#BOpOFY)W>>h%6L zxcT`q=ku551Pl-+Op2t!{l4!8?k_;Z5>#fv6_B%a+`e8t(wI$5hKMlu@Ndft2D9DY z6Z|oYQ@l=|=}kE-6_22YVX<`jYx6J)6XD zcbqWSUuV^~m%f+bVNbF{|E9)&p}~1osHaX!%Z?eN<%?9@{(@?p`r6Q)H&o{CB#gld zJ-rV3%dH_0wsA7hyF6#NRcn&cAUkq1 zLVHZ5hW6f|YFmtzUan4PyRIAVLzHuMj26$F-n(~m)ZY4DP(+xr63~M1KeNvq9@z^5 z^HscJo|Qodt7%))kE_h>$Mz;A{sbb7kRnJ*z0Z)0zxK&s(EwdqvJ=M-*uI~A=Xr6g zb`w_Waf;>r;oN4Jwb`o?zma&w3Wg+@2OP- zL9~Kyd;!*eGLZm>qy}b7T+Sv7#!J_Tq zEwrV#jMu>zrra@o!Y906ktsb#;T#SIRu~P&^>(jO?n(kuS3z?C2PkdbOQ9xnr&wIw zW1%KLw@$7nqr3znw16#|%ZLU^LIeTN=a7^&nQ3eq;$?mUh-*rCEO6-Jp$(#P=QGFX zFMv8iX4Upsp8odZycqQ35&(JJBtp+o$~b~epb`80xy~clc%HORBhcmz-(d;pQ)OVS zxy4}ExU*UF#GF+_@FzimICqV_^-iMs+l)N^j%_wxA)|Un)R5aanSQhq{wYba=RyzAn*0-)NW9w9p(9gJxLoxs$m)A73wRDkVWDHzvCImn6LJSm;_;GrpFdgpFA+TA z2y6oke*%@9UJQ2ncwYjF9S!LtfN7r?sK@d97LO!&-@#rLb_8iTgqfOAF;p}#m0S@? zkzbXmneHmNR^!@6?Oy0qP<(NG&S`B6UzuE;iaCn;*>rBA7drE?prMA3$AiWyQJV5k zDMUV~&-EIk5uZQ(=Y2dA^{>`jnhj^)kDD?8XF4< zzL@RCY?(~Rr6NHw^JPn@Ocl2A0%*l5hSnXi8QB!@?gHC&6Q!Mf85R#0_h z^iiBSo%?e;=7(T!G}^)*-NktINWjuw-k`i-wUYOrKRh;_VG@T5|TOSwdCfuz$GR`XBj19WL-Dth}1hz9zG^yChoxRg3;7LJgDECQaep> zhgVS6I|UqyAv0K_A}S#eAK6r&vEA#byvzP$ut6j0T1^&x1QYV_uf)rp--Pf3A=kHE z3v-Hlaw`^6QA!le)d*GU6Lluq;UM5J?i{F&;77sIB1+h5D0)&Xv1#9+?kMSW1#$Pp za^9Ujqogw0eRkTK4Hmh}pjcDI{8OQzGEreV%vTeXw?cl|{p~%rl~y?@Hl|`T)<)Ah zSVU)ShzkV#;$pIiL~w+W0+6h~pZ2${Yoo%r0)P7~kLjj({|8Uy{~w+XU;iXD;qgRW zw+2d5#Qhe1C?RH+D!864`kdnY{5#oFjnU=lUwbeDiEfajuCCr27Io#94lsIy0SP!~ zyh?_h>O~Kd6z${f`A!4%{Oj;{Z~KZ_a3famZz2^cZ@5vXvFMm6m07}d#Zf}N3%NJc z)93<`psP`|Bjp8cj%(q|owWpQ2SWhuW1ME;7+8+v|Y?NbGYCx?brdM0VAG;nmYbdw_+ z#E0W7Dhn=_94%aEAXd5jV?w*XXduTMNlZ+Ti8@XV5ozHur}Y}#$S?oV;t@TuXQika zCD!sAq5G&L%sCvl4OzR#?*d6*LQAgVSiW%_*+nHy;I6?dy{Y%h1@1LLeSBA;`9K_+ zr<=fr1+0vl{3^`rW%~BWZs46$3p#`IS9?M{3alVu=t+ukG||6NnO;-vz&m_{L`8=x z9l~du0%h$UrMmwhxs20BM~nOJiq=p=;McM7Z?IQ*L*Rvv-{f+gR7P0S>i!4_S!Z2-MO(4)H}P#YfQo?xW=AO`Hg63 z`l}ks^WA}^^u%r(_0cz*(zRL~t;;tUST}E|$mtq`dfsH)ELm0(xBe8U7~~)Ws0I}| z`y;9e$H9oDR@^X78N>l|=MQd%sOX5HgjdtZFUD-LKzZR>k)(2tVx-6Mkc|DGI@(*H zlimLh9P9iCDGwe1NgDowoJw1Sm&glh(VMTpGpzLB4HHFyXrN&b*+uga9m}WWGTswB ze`pSeya}rkup0Y<*eykx+-jvQ%fv;l-C$ccfaeUCJ^e4wk)M%j^$L%MbEqQRi|-li zIj*tOFSvTfg&lU|dChM>uF5iFvEI8a*@oJHg1jpc44Ig!a4X&8W7J1}u)NxTUB2D5 zE=_w|x(=7}njd@~OuYgOSazHT`t5yTnT5Vn7Yg|^6`Wn!1i1&m5Y64ci zP8jN46t0cxDs>Nj-zQSl9AU-n@gi;)QL%1lKoyLDjf z=K#FMMY=QUW^ANm`vsz-3w^;o1Q|#Cah&mWOX_DE`Z?qXK@B1Gk#dZj&E%kGn7tQ9 z1IKmD4ETlwGtcg25dC-==PhFwdgxZ-Nu+36|%hc6xl|j?zh8f)Te%$**t5k*_7n$ z1JL9IEp%Nn$}xS-17uCeb9h$UShnt@6!b2yq%hAJ+T(@rm+e=6@2%l4?iSrnna!N* zz(Z2udA4puiYkg^upN^+xTj$NezA*eHJp+)SWbse*Un}Z>HHG>^3nTsQC5TP;zRUn zzJ0#bJeV{-CQ`W+9M^Cj(ZejmYjNzuK|+}?2SXLUeHd<-k&fK0LR=^x0<%cnxlE&? zL(TwJTwp-^zYyliB6s7<;lq_Hc_7_JF}Foy2Fmv4S&x6FqEH%(bF~J}_IogwdLHK`j4V#x`G6=kx-wC{y zQa5v^QX)YlPNO-3mqa8y`u-_m`LQ_dejp}3Tn}oOZMT!9wuu;ggQ}w%(JAo9#wBH# zvvY3)KgYFsf(dXEa8VG#AL#~5lnk&sI!>^e+*WA86kr#c|J93a)AF#9ggHd&5|$-m zT{baHsck2>%H;Du(fcoL!(}-j-p((;ErNP1>CBI~5|Yq@)f?n`P%sLU@w?Y&1AU+U z1%whyy>g^t8!H+^C!=;RQHT|b_?1hZ=`QSgjie0+O`f4B7}Lv#QMa;>Sg8r+C9#T- z;oSKriO$_AIBXGg9JaeAWTueTKayxrn|kNSP4FCaDGgD$|B`YNDMzsqREL)xqP&6& zWf^7yDnTk4niPVh`nyMROHZ^)AO2703z_yaWlg%!tq#c~Cwf(Bj<0Zh|Ch}cjeO+I(brL3q&%A{u3tD2g3;Vn5EB1w zNPytgw*B_rt%2L(JXI2tw3(00eVg96@j3YOX?0c&8){|}wKkvcPE6)8IK%Lq1w?R0$*bav;=)&r`CugQnT zZkLr`cg%cP+qTD%X}G#m3)cz#iXYVrr5J~jU^lg#Dv`jZmM%9Vwes{5M^SEkCJ&95X3vW1T{)c)uOMx3vKmg+-iNHV+=_MHwg zqH>ekwwdHz|i@X;grQ>sSvOIL>Iuv{8!y;%hM!VSYJIXPH$W>n7X zgXQEbDlxjsKs(BaL{G1M5!%Nu7i|ehV~2b61_jcwJ`;i0KQ$=hli5ci_8>L>5RN8L z2o&kjQJZN=S}c!u3$y1**$7ro)_ebfR1~X7R&zex?Q3MWJqOLm$Qo!_`iH2^hCOK1 z5pF>a??aBLD0unb9#lppAhG6HkmF`k(`K7Jv5(0psuh7jq}sB|%Lv@chH+WHeZIVr5{z?lqC16vKpHb`6b9$Nv4$9MLk$h2`Ae^=RQhY@IU_=}@ zL440|)sla#Lss%AFV>Y4oO%yLbA&7#>Wu6D^=R0ju($s)$2b9#n&M3xDj>*UGA(pg zVI$CZhrMsF{8TYn9P_&#N+dQgQXa^!*LpbtYu@hh-8}-)4}0pM_Xjx}>5l+otdo*a z(ylg-A!+c+XemRWxVROSF{_JYPwPs#>+P9qm_Pkci_hSxTtpU+mIcJ(MP41e?#Xm; z<}-&)t2GS9-5}-Bo6(J*-@Ny^GfLS1!2@2R1Loa)Q1nuFzzjF(YRyyDvmX31X@9nRNa=(*0DlSarNU z?~NSzFX&}l`_G?%?&ab!3%Dip zFwM(qLJ`@1u$#n|s1Pzi;WlB@L)f^!ShAZX|Gn~P!)gGnzq?{>MZ$RaiYnv(ZK9JU z?jUEMAFh{;y?NYi)8sa$10|e$2YPj%8H`E>$1Q?Gq2r8%h$YaiOsrGcWgZSE9wR6| z0;4lY8}@kZ7%#%+=kbt^m|j=YEa|hDu9dv;OCX#WxG9FeirWF3Or5vb zF6)?9=R7ADb37~3Emj0; z&YK=7dO2MRH$zd0K56CyzOF@cbC*y&u>7qEZ{Aeh&`j$_BpNN9FIFjlnekAX8zgH- zf1Ek-p2G1V4U5i)_7=s@X+erBfiJW=@8WUy0Ihsp8wixB;MjE&OMN7bW~ndvrUKF2 zM_L!$$0;e)$(dMwQUrurapyg7WUZlJGmK1xEU^?>khqeiaA_B=|0rE3A(5V*+Nom~ zU9LdS3fagrYwMKRlG>^en<-}uPSX8O@nBVuFnOp=54TcvJtO0zu#bRk*he0g4ynD& zfv;;H0;g!Lu1C@+!FdQ+%xRWB&w(h=?#}ZF*)X)Hym-<<;u^;4BAxn0bX)fI7t;z7 z198>?WYFWWV@N_@9tEsL=pi%%4sl`gP;zW`aU+)Ed~*SH)y=bde(u65K$LeI z()8|hb=oV=kN#!g7qr_FTLCu^+RJ;Kt!q)ef2Y9pB>z zzN5zA_k2Ef=3|g-01VS!^WjYrf@nNK55r~(!LkK=muoUd*22C9w%c|>+3RK*;)r0? zu>3mx{UvfK3HA(^S8oVmrb0nxL%-<2YgZIt$}^-iX5Ul67(`P?QG6DC*{Epl;-?T) z`v1o6hRe(?Uq9dt?IyHlr!^W!NxWzOKQ?v+Tzp>h=A~fAg08aS%J%WBf|x&LmVXk~ zThu!MloWDPM1}sMb!IjK-!I@tEZ4?^$^s9_T$DFzSjVQp&#Ih+)MpdV{Vy=>eTeR;tD)_cz>7oyBx0++bscU|xG1=}$>!wY{T>z*$*Zms4*5?&5 zc4cClnTOApNX}e~r8yTn8?ll8KPG`hzZa{`FsH*YN92B~Y*I`Jb}@26lZDHGR=gDV zcd6nNYGS+t*qlA-Z#*zA5v~XMjR9>EkKbIF@`_VUr~cp(zb~Tc6Mh_rd2T2q&?7z} zpiUOpe`npM*RkR-qP*${*oyjzMLi! zo!C!Y9KA%#gFm%s(}5zk$4MIbdflm_*lw4s-z?Cl#PV`)4X z-h&R?Qt_;2QK{+z+~MY6WyvQ$l$VHF3P{|?mo}xvIkW!JArQKk)GARVK`tFUq76evh7Y^=r-|CUz6 z(J;(DGzQ~P{cU}oU+VKyWuE6J4v~3rntsw_xJg-b&dYwsyDOsL`BD$hOjVNT-Ke=7 zR-#EPL$Z@T`=AnMw!(RXvcc%PgiEwEV94loSihkfjt%PD>>8o=QH)cL zr}qLEO<%Di6aeI;>eY#4nlv|DU5mhUqDPBmYFpX3=6DXt7E6d8a&F&88Hwdf)0ti$ z&3*!j4*=tXN)nCx$sp7P=pq}~kxJAexaHjARQG?8&f1Q{5=@m<;p0E?cuKX92woAc z#BW#_-TxQhUS$mSzm=yjvrvm77CFq?u#03_=1fle8v13@uZOs}H|1*@r(lyyc0jOm z`nIb2&!I>hSX*4x;xF&WYdF%Fd-~ni_i9=L+P7_ic6|u_`x$wksbuFlY}TZ}J%4wY z3FjH#VQK3b>svVnMA(o37V(j6q_$)TfvT9jLV=%LN4#50C8?7OR0`PSn0^}1k%7PC z9}&>tLh|q%uu6CGO8BZ?FYO3U`67X~`fS+O!V#eY%q-+u55B`Xa9RCqBWKs*0-$yJ z&M*tN{~ecnkamm8%eUU~hh`%ZCFC~yGWzQtQw1$<&+sWTjK%RqgPN@BJk$U!HaitT&{EkP296fHYL z(sqnX?1iZ{g*WeqqWRG+Pd3sG*&q!l(VniQJ3LgVAM-eNlyW!vyE6+6v6$4}o>JIlFzi5};{WzBeAQ&kQIAT7`dil}Lq=*$S3RcCO^E#R!ZU>w;LUqw{r>93 zh{*Iq{DRZW4PV!NKQusg%>{@%=7gxh4jRdy9RQBJxVEi}k;lqVxIwEGn`_rvYbU7k zGhS4^|J!-FkObJEWEd#j5RYq(n-Z7oE|La5f??$U>r(5KTZwqt}?TC$hELa-Cz&oky&j zaqF-D_-8DjYF;H;SK;5egLo!PZAR)+LHmio$Z|re2^ciOXTsFBlnmgcZ<~2-u^g5| z3kFT4Nx=PD+^xkAlt`N0m`aRWyzen`_7zW)c~X^>-LaO;mW!crwN z4yf}1(Ks<8VA48)m(nuW8F(}5m^o;|O?tT#g=<1YucARA-4|w3?L+NSY)9fpjvHCM z2#t?Rc7U1=%|bsjP_ERrbiq38Uz1rRe<@k%jKo(@wFj5@iiGoXxo*v}q8hm0Tk(o}zPQMXHqvac7 zT3oR|^$6}Jt#897&j_YZ3Hk-wUR;$3B^(sar3Y#nGwmQVHPxKHnjHB<|CbQ;NK3x* z7-{}$WBupFW2__6oV5Rt4PDEw<~jAd%}IF|kYZg%1C-rhKhZp$@GE4ih|i#?RDKwF zub{xGgwxx~SzNG+aT35Z6uXp?1B#*HnwXReEJd?IXh~eiJ`NO{-BVU)s7+?E71?0B4;byhB zGcnHbaV!gf{Me=Lcd;X%X$w2EC?>od8M@C+FZapKaThR%G$I+}{o>wZHQ0rR-@Fv{-BLxS6zk~7oR#_x5eV7d>K2v8SR+HJ*vXD|y3fPMy#7JON*glzq9&yY zSl&*U1SM-ILLWke`d+n28f^j?i^4&bgONw%n_`=30;AwB?7*o-UwkyM`}H`BS2A2= zQdG9P{rS(wtSQUncdHX}cy5@V(+XM%dW1IF&>pP4>^H@JUzM2;X>`M$8ewpe?@eLB z>Cs$EH#q!W_V6fJB>M7I!kPLrUrw5$}@22wEC)Cy-!GBE>xXV#=b(} z_;?xMv>Y@;FUQ^5?dOp7?8L0Y2M6Ck@cQxZ!6-OkR?wlV! zQ7P1%Z`fn3N!J+AlrQ7QRj!gCyp?iobwGP(6EVjlYw^b^d-jCvjG)-*JZBNfy%L!? z&h_U$2}vZ!3>|#Zd*YXnnnkK?AI+Qq=XlW*5gBih<-sHxjfgO^uJ2#nChAS24tFjs zrw63&Ct;N+_J4SQlVn+>acQ``yHQ^Ka43DIyh3LE$2%3E;Gt`+r&#VQ+z`r+-QEZB zt$^VepCOoSW=aU;#ZD3d89qi0^CmIBJlazM7i*iPntGEjxJzfF6Yt3|I_!w{npB?c zpWCrj@#rz43RY`Nsa;C3OmKDcFTBdF@2LgblQ$F?rS`qq2=M_be`G&{PG=`pj9M#& zHbXHPPLq7uK);M6AUVR&&hAOIXJ=QJNqmHt9^Yx^{awPGdLPv2EM7-Jr2;H@2Of zG;VA(Xl&ay8Z^ecd*9D<&iVh|Z|mdUV_f4JgvT2U6V1wn6Wl9_XzM729^Is!nNskj+7g@2-l3`zrZS z!77xOgeqFYRtcw}02-OWBUD3Db>53eH7?~JlS!PXF+@uT%a4nZ-^Pi(I+2>@k-d8= zhP~ZecjpB6?iR9!to{(VYVaKEDB4gHu=kRKY+aWQ*fTM%cS!%4%vrOq0h9c}c5RC6 zA)@_wEs;5&0b}H$aknRu3AJBBs*#QfA6_V}`k0rQH9N#f=1wST+%)y@04beHUrOzE@6_wWx zc0ji7Oil;BR3r6y>QO9h7pOtEG6=n;bBMBQv{RwNn66k!toY*$*b*B;xYsC&%7y1HY@gE#nKoX$qKNG8Z_OL@nirdvk(i$XRskf>kg^Ck1Uqhun9Wz72eT z-6u?4&JAC0*nBYeCQst~rAcy<6fHER9p{>~sR}7Ce<`rjunP%8ECUr-k2fDRJQZk0 zIeKVw2!Ea_v%+mzP(Eixj|x4B4+HEWgMEubz{K+SHL$Tq?iaw1IDxMJfuP0+HSE_# z>=kwoxrM6KJnl2?>@+vYyLcdJ;rUHw`vS@^tjzx_)*bB8kYUdG#_MExq`a{gO4epj zuS(7Ww`EZ3O^o^yuK$>{aN27*GD^TK?e^2FH|*p7krI6Q?156)ut@x;T)ksM2QnHt zwL5Li{8U0GhqSyUGHc;ngj@#?Ad?0HAFLF01+k(HR@;3!wWAy-q!i%@_v90T!U{g#(vseTUQ zQw3qE_+^4g#ndD~?F@bLxzy20=p{7_kRH29bqsvMv~ZFPnwdB=vKMh!{zwHUf$VT6 z%<>+dJ-Oa#T2!qxXA-KQ$E!~m({uQiw-8BAy_AObamJHL&T-L(lKeAe(RK4 zy`Ptt_x?B`Gah}Ma$nDIP>DnFJ3nxJOb0Jjs~%xE-y@+Z7sO7SIOV2YQB#Xs23Fi| z<)8?@HVp7v3Kz*x zwfT5bY@HfD;t%U=u983CDkaCZXx~BFToB!9tUc?}XZ>Y`lxvE(rY*h?B(n?jMPB`7 zBHwe{43-Poh5r*~1W%7D1w@S;Fsbnj%>9R zDpWsyXXa8S$vy_llh;e`i>o_>xnk?A1wtCQ&VWzLla@!=^v-7o#yPi(^m)sTfag9Z zz1;&H>X*&IMpaeloVE`?w~Mqbazm}V9B%xFl=fIT^)2xbRFktI#0B`c zS%*L#^HrMuhlNTKr7W~1UW5qM3^x+N;X4fg|`ip+#433Q%9+o$Ue z3N@WmAxjw?7BFGV059W#`&6l+;3upo0oJe#$@NAqz#g%@rI`|nijTr!kq?v!6#G;y z0M28-Q&T}azwvN?pCKO8t8SsVEM38#Yv3zIE*XcNIeH0TXzxqO`f1`ztnSF4`z93k zFM`#hP0rI%&VR&b{U>iVjP?AbNayyiB*=Ky2d;AmI_i{?Uq?LFIg1hW(XJsQKGOdm zfMWS9eE@l-&9q2`=ukDrBUxb1@h;fevpQo+mu;ds5m`HK(^}ldV%bq_rpEx95W!^% zl(^6qyhMztjUgv1r6I}f9&gpugpNu-?jhu*&~h#`EfyP;Bj+A&)%yIG*WGtqA@ZN{ z^HI5v^5V4l>c0@BOR+M+N03*Ui5C*Q9@Y4czZLX|xoHa8iE>Pp4U0@wfzDst1wNs~ z{g5|HWhTE)ph{tAq)^q3d?88f3Z0+Nl*w=g#6xB}U$vg;Lh?`RfvV*=D!E+K=4wu4 zs4`$jDXhf~??5&7U4b*9Dd(&E)czKW!0otrNy?ey@eOZ4OBrh+%=B zd>t%TeEHRA>+m%p?n+f=IAS@mO{_v@7*9^*`y^C^jysRAP=I4z1+52t@L&owKMpQJ zqJzM5;MZ<$RcC8Ci7IB)Z}{{X;5@F=FPEHQ;5_Tx1U$!2GR?sdD0+rRkSAeXSt0BJ zx3;!UkeI={vR^=+AIbWi*=)B!o*JEoCvc#yujAuvy#M9qJxIRIt+Ckb?zNz{%`KQq zDd5enb2ZyJY(qLM`4L)dS^1b9K2J~Dl{8Wu=MycJpc-oK3y~d6eOlM= z29G#e6oD)mL;<7%)7KheIYEBID!*Do?HH zO91hv)&Ro;-EqH3CXLQ&_5?Z4vCPAf}p^MO4 ziJ$!2Ez?Q%Rbh&!0TLBZ`+RQ}rM(yZ$ZgL6$C}KbO1+#1p!O@|@F3@I-dQ6fsx~-j zxlBz6<7XGVR6n7x-<=CmMbcxA)16M9dEAyEORXs!m<>ZC0-7dV!y@06)W^b>M6R6t zo%Lu263yjosqG%uB*vy>DBpgnYOr5PIMZmIqAvEHA$m!WgNaFR zvXJjM}@5_G?I1W5{Rsgz}5#T80+>&i-^)lq= z-9H7L&(i*ax6d0EsexOU^##AhcAqXKgB5@mqa?f^4<${UJpx*-j+4vtYzigNw5(Ut z>6m|!RN}HEjE2mF7$G#lO8&U@$-(Fn9vtVjRroFJi;dhK__}xB3ByY+YwGbz=vp~9 zGEFFm!FQZis0GF=$piFJeZd;mEpVPL@=TdeQ17Sd-9Hsj_u`olxjlCK>~~(-Cz1@$ zon*ZueNAPEY)5x3UF}T^gh1~QgPkZPdVxI29}{tbmbYTt`B`CS#z6GHu(BghVZbtY zBI)$iL_dxQxRZ95p6+?c(nsf}+iG_YOc0Ss9sP;R*Olz_3kT>#7U3NsI4gXL?>_=U z1BQ!Cx6b*a+O*yV803^dM65}!Owl2w+opg1)wU{sDi%H6KTE``m4H0U*3E(3! zSWeTufo6w0Q*R9R@LAO%L918&LD&5}Lc4wg>(1RNM8k|9%yd`$?473srvZU_57PpC z5UPMH^3j;ygvfB#0_mbVzGEx4Waa~ILRi*=v^6)1F~sp>8oy->SXQJYBpB}b{gR^` z_e4hD^$&)&QV75dV{p zA`Z)XoCQ7_yZtV*tFaO1VVJk(saK+yinw%DqXnhbvSC!TsUV<*3 zG|`wUVq}aWPhLM|JQFiqEuXnrM6AtDv$+T)3nKFKtkX1?V-bD|%#Sk3Es`pTB?B-^ zhk_)j?Ac?{p~*08JG`DrYl6mf)hs25$26&2@7`m8p&=e{FNLw(%*WiTi47J)|5%`LOr6h!++x_?R+|WxOcp zp0ijkL}qh)i>&mx2(@a4t^7go92!(f2&)ip>5vw}*`sT(@^#dqJy5QQgMpmGO1pFy zSW~9}dEA|ss2)SY&heypN~T&=%)ho1egqBTUxB&pXuc3`pxSQXyEkhNa#k!$>K;*; zL?Q}x>@{?0G6pn&`nYgx^;*00saSTwI_xJbJ=wtqlUj5vYK)wCl`^GaeF-!1mN}t) z#36+BQbSL(L%SifGJa2v+IKU$O?n!fFPG%V!v~2k*;JFz#GC284C(xg;m-uW4L_3Ncyv2gc{y&rwT4({FIR7P7U{X6c2k8@tOo{hTXQmsI11WmCOC0lOrbcNeW5*84 zJnPu73@NrPKk^YtR;0Fa`Z;vYJrSkp&up`rCjK899pi^$5bNL=CKktqP?t8{svvIG z9z5_;ld7Duy}&z60Zj(VH3tPI(n zTKX&xNzN*_py})p?ZP9u0^!zCjGahXZ^LAW%YX@|4CzZ(c^&@#b>lDRpH4Jh^!%6^~vBYD(C5JBYor1e?^r4 z)tk-xvVKrx?7rj&3dxF*I~`KRj`cPRvBppC?7WO(9CX}VXZ}b9LL*{0=KMhIVmOA? z#c^I#u~VSIo9L;T<7QWosld!WY)4BK1Y^#q_?pvnV|bz3&Wg*vb(uq5h#))ivw1P{ zDxQk$9~Kqeq1Hj9?{nOi@6?C~cXbv%ISJgBAk^P3Pui{oEZ>&i-fHlqXgxefje^SI zxLn4@-edf@1y|+>l@Eiv5D_d~3B1fp+huNKx$Dv0NT0X6u$-gsoi1*Ebd9rEeO0c< zSj)ZuBGqyZGFXr1Co*oU2R0_uP*MTztQgeZ?i7Yvm4=x*dHHWrsZe#S*f91*X6`<+ZbrtThr^S7IdXIl0BZovS!Mw z)BAQggq5fhMZ)r(ZEwtah@g?YXA%yor%?i-nS%|b-;wv&zWW1Mz&0O5=04r=(|qVH zNgGbOE@U$pBRQc8>&9sMDVc!1LcBBF+I>LD>4m14mFv@YHNc(Johk3p*5(oL8?{Fq z=YwfY$ou%M3h3TOhnc*0;&pkVmxigaLXe~F1LIvK2^n3RY!t7+#KKB7zQ7v5j^)rK za$EvEoN85&vk<8B$(awPG8lW#ioa1>tLmPBb<9sf1fBsWm?V&SXQ#-)KAHhT; z=>4IN*AId%*Um3M&cLS<$pYV(hN3TlZ4E3AeLhq1o<@v+{V5)=XRaHv=ur(6&tD-dn%G`euXi^276aE zrwQwinH(3_Jo^Kk1ja{&3O4tdVSaI(1-0)4n48?`tl->kuy76}ia4j=3bAJ^>kx3A zmKXrk0|MW$kF~KZ(Tl->-Kwwxq+L&kFvhO3F)bKv0=_qPS02-%DSW>Wc)lqpWK@=P zRkmP$s9@Naq`&D5xOA8cARL;iAh-7^dHP6N=e4Qm(J^tq*sru&O7Piz7xXXIF}<2PP}5~eJ~odFNhH)Z_9qZ;918Gtx( zPEtJ+V*<+RMK`J8n^p*^x#@b_LFThysY60@J%SC+p&oT5Opz1*U&<4o*a-ojsc;$|Hp+JfNPv9Z6@lHAGLg(Y+p z)Kw$Zg1xUHw|uRzb>l_e1{9X+03T3MBnO#&x%o;ye?T> zyO&&56Nzu&no?2b{T}iF%$8frj5~3y$r{tPH;;IG0{1J{oz%i=2;S_8~!F6>jP4DvSWN9nHXS}9a+|1pb&_4FzqrJrX{Q} zqd6T1SN4Ycqu_wo93;JyG|BXZ(LMMqIWu9AnjfC1SJy6MIzt@fKPtS?gUf;G<9etT z^?dR;*NU(@3bC&LFhh5@1WN@}6C7P{UbwlSUBMB)$dJkw|3i!*D#kP6U4^)sJsZpH5h$=G7Gsv+_B`FD z@j;n5C-fZjociU{Mdl$nVR`ZAhG0qvDP|`@0;R{m{kM%mDhB-Fue@c3>|<-0zcTng z{!~@XKP#w}FLc*`CKkI41M_1QqzhLoZn?7x7#{W7HbCVU!yD40IqvNCZ~uI>H{zmfUg5Wa9U z>JR-LDh_6cttr$gBp}BXJd0!1k?V*z_m0vU;>J>P{Vxy%lTm+4LdTvSe$G+bd51x} za!pv6mwo`qhG4rZ!C!gzZnW(ub-DjlbR|g9Z`%ULx!JH|T(&Ps3T{M6oz|$cUIcg@ zu*+6NuC-S2nB;)mSHVdIaDyHQ?Loxi+13GC8%n|mnT=?lF*9c6nS5~lqu(0XDi;t7 za!%vmQ6+jaX?C~>7R!?*j(}XJFqOs1OxN(ptnW z{Gd0IiPphX6u)*s{JFBE^B~TLxeC#!@jZZFr*UQzJ6C$63Y@}Trs!p)Y>v`{sSp|? zWRfWtN(0*lZJRx6MzF1UJkaVu+-7RaMdl`g9@bq&b%i-teRV(S=B7)>KEDwV43NV}$EV!O%J2xp`Yj_Nj=eaUjLacrX z&!2)zAo2JP9#Th4cl0^m+B-DW-Pu`Kmh07mRKO0z~x)m>viF@WM;rzNKUgj>m3I}Jmd5ACV8uw zIt@rkmJKtytN8@-UpiRCf6j?$s(s&Zp++)X7NGfg2Ip~A>Dg$yCkv{)QWQa`O_Kz*?r@!ZRI;b# &FE;g(9 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

y>#2TT? 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
KNi=1u#(DbV0PNc;b1Q7 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%0DwcdR*KKHEr#wO{k4}zq63VPy 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 b%fB7{8}#WD%9S Date: Wed, 24 Oct 2018 14:55:09 +0200 Subject: [PATCH 057/147] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 57d4f14b..7145f9d1 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ The data model is defined inside the common/models directory according to the ru The data model is visualized in form of an Model UML diagram which can be seen at /modeldiagram or +![model diagram](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/scicatmodeldiagram.png) Model Visualizer which can be seen at /visualize From 875d0349697a13c2542e31e3e91e3be33bcb3f88 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Wed, 24 Oct 2018 10:42:26 -0400 Subject: [PATCH 058/147] Point install instructions at public repo Cloning from the PSI gitlab requires authentication. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7145f9d1..1343a32c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The needed database will be created automatically when the API server starts. Fo ## Get code ``` -git clone https://gitlab.psi.ch/MELANIE/catamel.git +git clone https://github.com/SciCatProject/catamel.git cd catamel npm install ``` From f87995b05697004a4db1220d7fc4a4b5165e7b29 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 25 Oct 2018 10:01:21 +0200 Subject: [PATCH 059/147] Correct filenames, add mongo install, add config Add config.local.js --- README.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1343a32c..06f654c8 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,12 @@ You need to setup a MongoDB server. E.g. on a Redhat Linux System the following yum install mongodb-org-server ``` +On MacOS +``` +brew install mongodb +``` + + The needed database will be created automatically when the API server starts. Follow this [description](https://docs.mongodb.com/manual/tutorial/enable-authentication/) to enable authenticated access to the Mongo DB. ## Get code @@ -23,10 +29,10 @@ npm install ``` ## adjust Configuration -Add a datasources.local.json file inside server directory with connection data to your mongodb instance +Add a `datasources.json` file inside server directory with connection data to your mongodb instance ``` -server/datasources.local.json e.g. +server/datasources.json e.g. { "mongo": { "host": "mongodbprod.my.site", @@ -35,6 +41,46 @@ server/datasources.local.json e.g. } } +``` +## Add local config file +Add a file `config.local.js` inside server directory. You can add you own PID prefix (e.g. from Handle.net), site name (e.g. ESS) and facilities ('beamline1', 'beamline2', etc) +``` +var p = require('../package.json'); +var version = p.version.split('.').shift(); +module.exports = { + restApiRoot: '/api' + (version > 0 ? '/v' + version : ''), + host: process.env.HOST || '0.0.0.0', + port: process.env.PORT || 3000, + pidPrefix: '', + policyPublicationShiftInYears: 3, + policyRetentionShiftInYears: 10, + site: '', + facilities: [], + datasetStatusMessages: { + datasetCreated: "Dataset created", + datasetOndisk: "Stored on primary disk and on archive disk", + datasetOnDiskAndTape: "Stored on primary disk and on tape", + datasetOnTape: "Stored only in archive", + datasetRetrieved: "Retrieved to target disk", + datasetDeleted: "Deleted from archive and disk" + }, + datasetTransitionMessages: { + scheduleArchive: "Scheduled for archiving", + schedulePurgeFromDisk: "Scheduled for purging from primary disk", + scheduleRetrieve: "Scheduled for retrieval", + scheduleDelete: "Scheduled for removal from archive" + }, + jobMessages: { + jobSubmitted: "Submitted for immediate execution", + jobSubmittedDelayed: "Submitted for delayed execution", + jobForwarded: "Forwarded to archive system", + jobStarted: "Execution started", + jobInProgress: "Finished by %i percent", + jobSuccess: "Succesfully finished", + jobError: "Finished with errors", + jobCancel: "Cancelled" + } +}; ``` ## Email Notifications From 52e6dcd0a47022e037b6161251b0bab5c309eac4 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 25 Oct 2018 10:19:05 +0200 Subject: [PATCH 060/147] Update README.md --- README.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 06f654c8..819d4f10 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ npm install ``` ## adjust Configuration -Add a `datasources.json` file inside server directory with connection data to your mongodb instance +Add a `datasources.json` file inside the `server` directory with connection data to your mongodb instance ``` server/datasources.json e.g. @@ -42,8 +42,28 @@ server/datasources.json e.g. } ``` + +## Add providers.json +Add a file `providers.json` inside the `server` directory. + +``` +{ + "local": { + "provider": "local", + "module": "passport-local", + "usernameField": "username", + "passwordField": "password", + "authPath": "/auth/local", + "successRedirect": "/auth/account", + "failureRedirect": "/local", + "failureFlash": true + } +} +``` + + ## Add local config file -Add a file `config.local.js` inside server directory. You can add you own PID prefix (e.g. from Handle.net), site name (e.g. ESS) and facilities ('beamline1', 'beamline2', etc) +Add a file `config.local.js` inside the `server` directory. You can add your own PID prefix (e.g. from Handle.net), site name (e.g. ESS) and facilities ('beamline1', 'beamline2', etc) ``` var p = require('../package.json'); var version = p.version.split('.').shift(); From 29559dfae5b5ffac30f6031601bdbf264ef8dac5 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 25 Oct 2018 10:22:55 +0200 Subject: [PATCH 061/147] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 819d4f10..79d1386d 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,8 @@ cd catamel npm install ``` -## adjust Configuration -Add a `datasources.json` file inside the `server` directory with connection data to your mongodb instance +## Configure database source +Add a `datasources.json` file inside the `server` directory with connection data to your mongodb instance. If using a local mongodb installation, running on port 27017, e.g. you can change the `"host"` property to read `"host":"localhost:27017"` ``` server/datasources.json e.g. From 7c4ceaf487eab4e6b63f84aba071774739865b1b Mon Sep 17 00:00:00 2001 From: Hannes Petri Date: Thu, 25 Oct 2018 12:31:55 -0400 Subject: [PATCH 062/147] Validates uniqueness of pid for all dataset models --- common/models/dataset.js | 2 ++ common/models/derived-dataset.js | 2 ++ common/models/raw-dataset.js | 1 + 3 files changed, 5 insertions(+) diff --git a/common/models/dataset.js b/common/models/dataset.js index fad151ae..fecb7b80 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -13,6 +13,8 @@ module.exports = function(Dataset) { var app = require('../../server/server'); // make sure that all times are UTC + Dataset.validatesUniquenessOf('pid'); + // put Dataset.beforeRemote('replaceOrCreate', function(ctx, instance, next) { utils.updateTimesToUTC(['creationTime'], ctx.args.data); diff --git a/common/models/derived-dataset.js b/common/models/derived-dataset.js index 0e017b50..f10a3457 100644 --- a/common/models/derived-dataset.js +++ b/common/models/derived-dataset.js @@ -3,6 +3,8 @@ module.exports = function (Deriveddataset) { var utils = require('./utils'); + Deriveddataset.validatesUniquenessOf('pid'); + // filter on dataset type (raw, derived etc) Deriveddataset.observe('access', function (ctx, next) { var typeCondition = { diff --git a/common/models/raw-dataset.js b/common/models/raw-dataset.js index 80437a42..9a94a596 100644 --- a/common/models/raw-dataset.js +++ b/common/models/raw-dataset.js @@ -2,6 +2,7 @@ var utils = require('./utils'); module.exports = function(Rawdataset) { + Rawdataset.validatesUniquenessOf('pid'); // filter on dataset type (raw, derived etc) Rawdataset.observe('access', function(ctx, next) { From 4d37efd43408e1bd5c25abc0ca0e4b8de6b58bd4 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 29 Oct 2018 14:41:50 +0100 Subject: [PATCH 063/147] added emabrgoPeriod --- common/models/policy.js | 4 ++-- common/models/policy.json | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/common/models/policy.js b/common/models/policy.js index f27a8eb3..3ab1a585 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -27,8 +27,8 @@ module.exports = function(Policy) { } }, function(err, instance) { var email = instance.profile.email; - console.log("email:", email); - console.log("manager: ", ctx.currentInstance.manager); + //console.log("email:", email); + //console.log("manager: ", ctx.currentInstance.manager); if (!ctx.currentInstance.manager.includes(email)) { var e = new Error('Access Not Allowed - policy manager action'); e.statusCode = 401; diff --git a/common/models/policy.json b/common/models/policy.json index e2bc4319..6a203988 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -48,6 +48,11 @@ "retrieveEmailsToBeNotified": { "type": ["string"], "description": "Array of additional email addresses that should be notified up a retrieval job creation" + }, + "embargoPeriod": { + "type": "number", + "description": "Number of years after dataset creation before the dataset becomes public", + "default": 3 } }, "validations": [], From 3238bea162e5b27176e4dfb309f110db7e4ebeda Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 29 Oct 2018 17:04:47 +0100 Subject: [PATCH 064/147] user correct email in job notification --- common/models/job.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/common/models/job.js b/common/models/job.js index d56868b9..7956a854 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -23,8 +23,7 @@ module.exports = function(Job) { if (!ctx.instance.dateOfLastMessage) { ctx.instance.dateOfLastMessage = now.toISOString(); } - - + console.log("ctx.instance.emailJobInitiator: ", ctx.instance.emailJobInitiator); // make some consistency checks: // - ensure that all wanted datasets exist already @@ -53,7 +52,6 @@ module.exports = function(Job) { } }); - console.log("Here!!!!!!!!!!!!!!!"); //test for datasets already archived /*var Lifecycle = app.models.DatasetLifecycle; Lifecycle.find({ @@ -75,7 +73,6 @@ module.exports = function(Job) { next(); } });*/ - console.log("......: ", ctx.instance); //find the relevant lifecycle entries and update their archivable property } else { next(); @@ -90,6 +87,19 @@ module.exports = function(Job) { Job.observe('after save', (ctx, next) => { if (ctx.instance && ctx.isNewInstance) { + // replace email with that from userIdentity + var initEmail = ""; + var UserIdentity = app.models.UserIdentity; + var userId = ctx.options.accessToken.userId; + //PersistedModel Static Method call + UserIdentity.findOne({ + //json filter + where: { + userId: userId + } + }, function(err, instance) { + initEmail = instance.profile.email; + }); if ('queue' in config && config.queue === 'rabbitmq') { Job.publishJob(ctx.instance, "jobqueue") console.log('Saved Job %s#%s and published to message broker', ctx.Model.modelName, ctx.instance.id); @@ -103,7 +113,7 @@ module.exports = function(Job) { } else { console.log('Server is ready to take our messages'); var message = Object.assign({}, config.smtpMessage); - message['to'] = ctx.instance.emailJobInitiator; + message['to'] = initEmail; message['subject'] += ' Job Submitted Successfully'; let text = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n' + JSON.stringify(ctx.instance, null, 4); message['text'] = text; From 456dcc58724970be0f6b5e208d399a1377925ed8 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 29 Oct 2018 18:51:26 +0100 Subject: [PATCH 065/147] merge --- common/models/job.js | 245 ++++++++++++++++++++++--------------------- 1 file changed, 127 insertions(+), 118 deletions(-) diff --git a/common/models/job.js b/common/models/job.js index 7956a854..6284788f 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -6,132 +6,141 @@ var nodemailer = require('nodemailer'); var config = require('../../server/config.local'); var app = require('../../server/server'); -module.exports = function(Job) { +module.exports = function (Job) { - // Attach job submission to Kafka - if ('queue' in config && config.queue === 'kafka') { - // var options = { - // connectionString: 'localhost:2181/' - // }; - var dataSource = new DataSource('kafka', options); - Job.attachTo(dataSource); - } - Job.observe('before save', (ctx, next) => { - if (ctx.instance) { - // auto fill dataOfLastMessage - var now = new Date(); - if (!ctx.instance.dateOfLastMessage) { - ctx.instance.dateOfLastMessage = now.toISOString(); - } - console.log("ctx.instance.emailJobInitiator: ", ctx.instance.emailJobInitiator); - - // make some consistency checks: - // - ensure that all wanted datasets exist already - // - TODO: for archive jobs all datasetslifecycle should be in an "archiveable" state - // TODO ensure that job is created by user who has read access to all datasets in case of retrieve JOBS - var Dataset = app.models.Dataset; - - // create array of all pids - // console.log("Verifying datasets:",ctx.options) - const idList = ctx.instance.datasetList.map(x => x.pid); - //test for missing datasets - Dataset.find({ - where: { - //inq loopback operator - pid: { - inq: idList - } - } - }, ctx.options, function(err, p) { - console.log("JOBS:lengths", err, p.length, idList.length, p) - if (err || (p.length != idList.length)) { - var e = new Error(); - e.statusCode = 400; - e.message = 'At least one of the datasets could not be found'; - next(e); - } - }); - - //test for datasets already archived - /*var Lifecycle = app.models.DatasetLifecycle; - Lifecycle.find({ - where: { - archivable: false, - datasetId: { - inq: idList - } - } - }, ctx.options, function(err, p) { - console.log("LifeCycle: ", p, idList); - if (p.length > 0) { - var e = new Error(); - e.statusCode = 400; - e.message = 'At least one of the datasets is already archived'; - next(e); - } - else { - next(); - } - });*/ - //find the relevant lifecycle entries and update their archivable property + // Attach job submission to Kafka + if ('queue' in config && config.queue === 'kafka') { + // var options = { + // connectionString: 'localhost:2181/' + // }; + var dataSource = new DataSource('kafka', options); + Job.attachTo(dataSource); + } + Job.observe('before save', (ctx, next) => { + if (ctx.instance) { + // auto fill dataOfLastMessage + var now = new Date(); + if (!ctx.instance.dateOfLastMessage) { + ctx.instance.dateOfLastMessage = now.toISOString(); + } + // make some consistency checks: + // - ensure that all wanted datasets exist already + // - TODO: for archive jobs all datasetslifecycle should be in an "archiveable" state + // TODO ensure that job is created by user who has read access to all datasets in case of retrieve JOBS + var Dataset = app.models.Dataset; + // create array of all pids + // console.log("Verifying datasets:",ctx.options) + const idList=ctx.instance.datasetList.map(x => x.pid) + Dataset.find({where: {pid: {inq: idList}}}, ctx.options, function (err, p){ + console.log("JOBS:lengths",err,p.length,idList.length,p) + if (err || (p.length != idList.length)){ + var e = new Error(); + e.statusCode = 400; + e.message = 'At least one of the datasets could not be found'; + next(e); } else { - next(); + next(); } - - - }); + //test for datasets already archived + /*var Lifecycle = app.models.DatasetLifecycle; + Lifecycle.find({ + where: { + archivable: false, + datasetId: { + inq: idList + } + } + }, ctx.options, function(err, p) { + console.log("LifeCycle: ", p, idList); + if (p.length > 0) { + var e = new Error(); + e.statusCode = 400; + e.message = 'At least one of the datasets is already archived'; + next(e); + } + else { + next(); + } + });*/ + } else { + next(); + } + }); + Job.observe('after save', (ctx, next) => { + // replace email with that from userIdentity + var initEmail = ""; + var UserIdentity = app.models.UserIdentity; + var userId = ctx.options.accessToken.userId; + //PersistedModel Static Method call + UserIdentity.findOne({ + //json filter + where: { + userId: userId + } + }, function(err, instance) { + initEmail = instance.profile.email; + }); + if (ctx.instance && ctx.isNewInstance) { - - - Job.observe('after save', (ctx, next) => { - if (ctx.instance && ctx.isNewInstance) { - // replace email with that from userIdentity - var initEmail = ""; - var UserIdentity = app.models.UserIdentity; - var userId = ctx.options.accessToken.userId; - //PersistedModel Static Method call - UserIdentity.findOne({ - //json filter - where: { - userId: userId - } - }, function(err, instance) { - initEmail = instance.profile.email; - }); - if ('queue' in config && config.queue === 'rabbitmq') { - Job.publishJob(ctx.instance, "jobqueue") - console.log('Saved Job %s#%s and published to message broker', ctx.Model.modelName, ctx.instance.id); + if ('queue' in config && config.queue === 'rabbitmq') { + Job.publishJob(ctx.instance, "jobqueue") + console.log('Saved Job %s#%s and published to message broker', ctx.Model.modelName, ctx.instance.id); + } + if ('smtpSettings' in config && 'smtpMessage' in config) { + let transporter = nodemailer.createTransport(config.smtpSettings); + transporter.verify(function (error, success) { + if (error) { + console.log(error); + next(); + } else { + console.log('Server is ready to take our messages'); + var message = Object.assign({}, config.smtpMessage); + message['to'] = initEmail; + message['subject'] += ' Job Submitted Successfully'; + let text = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n'+JSON.stringify(ctx.instance, null, 4); + message['text'] = text; + transporter.sendMail(message, function (err, info) { + if (err) { + console.log(err); + } else { + console.log('Email sent'); + } + next(); + }); } - if ('smtpSettings' in config && 'smtpMessage' in config) { - let transporter = nodemailer.createTransport(config.smtpSettings); - transporter.verify(function(error, success) { - if (error) { - console.log(error); - next(); + }); + } else { + next() + } + } else { + if ('smtpSettings' in config && 'smtpMessage' in config) { + let transporter = nodemailer.createTransport(config.smtpSettings); + transporter.verify(function (error, success) { + if (error) { + console.log(error); + next(); + } else { + console.log('Server is ready to take our messages'); + var message = Object.assign({}, config.smtpMessage); + message['to'] = initEmail; + message['subject'] += ' Job Finished with status '+ ctx.instance.jobStatusMessage; + let text = 'Hello, \n\n Your Job with id is now finished. \n\n The resulting job description is.\n\n'+JSON.stringify(ctx.instance, null, 4); + message['text'] = text; + transporter.sendMail(message, function (err, info) { + if (err) { + console.log(err); } else { - console.log('Server is ready to take our messages'); - var message = Object.assign({}, config.smtpMessage); - message['to'] = initEmail; - message['subject'] += ' Job Submitted Successfully'; - let text = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n' + JSON.stringify(ctx.instance, null, 4); - message['text'] = text; - transporter.sendMail(message, function(err, info) { - if (err) { - console.log(err); - } else { - console.log('Email sent'); - } - next(); - }); + console.log('Email sent'); } + next(); }); } - } else { - console.log('Updated %s matching %j', ctx.Model.pluralModelName, - ctx.where); - next(); - } - }); - }; + }); + } else { + next() + } + } + }); +}; From 9ddc3476f7182e2ad776a3d9202104d96c889d04 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 29 Oct 2018 19:08:02 +0100 Subject: [PATCH 066/147] Update policy.json --- common/models/policy.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/common/models/policy.json b/common/models/policy.json index 6a203988..105ce8ee 100644 --- a/common/models/policy.json +++ b/common/models/policy.json @@ -17,10 +17,6 @@ "description": "Defines the level of redundancy in storage to minimize loss of data. Allowed values are low, medium, high. Low could e.g. mean one tape copy only, medium could mean two tape copies and high two geo-redundant tape copies", "default": "low" }, - "autoArchive": { - "type": "boolean", - "description": "automatically archive dataset" - }, "autoArchive": { "type": "boolean", "description": "Flag to indicate that a dataset should be automatically archived after ingest. If false then archive delay is ignored", From 97c98a76911234af060213ebfd535ba0a4467929 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 31 Oct 2018 12:26:26 +0100 Subject: [PATCH 067/147] moved email resolve into before save --- common/models/job.js | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/common/models/job.js b/common/models/job.js index 6284788f..6e3010c4 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -17,6 +17,21 @@ module.exports = function (Job) { Job.attachTo(dataSource); } Job.observe('before save', (ctx, next) => { + // replace email with that from userIdentity + var UserIdentity = app.models.UserIdentity; + var userId = ctx.options.accessToken.userId; + //PersistedModel Static Method call + UserIdentity.findOne({ + //json filter + where: { + userId: userId + } + }, function(err, instance) { + if(!!instance) + { + ctx.instance.emailJobInitiator = instance.profile.email; + } + }); if (ctx.instance) { // auto fill dataOfLastMessage var now = new Date(); @@ -69,19 +84,6 @@ module.exports = function (Job) { }); Job.observe('after save', (ctx, next) => { - // replace email with that from userIdentity - var initEmail = ""; - var UserIdentity = app.models.UserIdentity; - var userId = ctx.options.accessToken.userId; - //PersistedModel Static Method call - UserIdentity.findOne({ - //json filter - where: { - userId: userId - } - }, function(err, instance) { - initEmail = instance.profile.email; - }); if (ctx.instance && ctx.isNewInstance) { if ('queue' in config && config.queue === 'rabbitmq') { @@ -97,7 +99,7 @@ module.exports = function (Job) { } else { console.log('Server is ready to take our messages'); var message = Object.assign({}, config.smtpMessage); - message['to'] = initEmail; + message['to'] = ctx.instance.emailJobInitiator; message['subject'] += ' Job Submitted Successfully'; let text = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n'+JSON.stringify(ctx.instance, null, 4); message['text'] = text; @@ -124,7 +126,7 @@ module.exports = function (Job) { } else { console.log('Server is ready to take our messages'); var message = Object.assign({}, config.smtpMessage); - message['to'] = initEmail; + message['to'] = ctx.instance.emailJobInitiator; message['subject'] += ' Job Finished with status '+ ctx.instance.jobStatusMessage; let text = 'Hello, \n\n Your Job with id is now finished. \n\n The resulting job description is.\n\n'+JSON.stringify(ctx.instance, null, 4); message['text'] = text; From 55e2a3cf01367d132dff45b9074b5eba5328fdc8 Mon Sep 17 00:00:00 2001 From: egli Date: Sat, 3 Nov 2018 17:34:44 +0100 Subject: [PATCH 068/147] Send emails only at start and end of job, enhanced subject infos --- common/models/job.js | 50 ++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/common/models/job.js b/common/models/job.js index 6e3010c4..54dea608 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -100,7 +100,7 @@ module.exports = function (Job) { console.log('Server is ready to take our messages'); var message = Object.assign({}, config.smtpMessage); message['to'] = ctx.instance.emailJobInitiator; - message['subject'] += ' Job Submitted Successfully'; + message['subject'] += ' ' + ctx.instance.type + ' job submitted successfully'; let text = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n'+JSON.stringify(ctx.instance, null, 4); message['text'] = text; transporter.sendMail(message, function (err, info) { @@ -117,29 +117,33 @@ module.exports = function (Job) { next() } } else { - if ('smtpSettings' in config && 'smtpMessage' in config) { - let transporter = nodemailer.createTransport(config.smtpSettings); - transporter.verify(function (error, success) { - if (error) { - console.log(error); - next(); - } else { - console.log('Server is ready to take our messages'); - var message = Object.assign({}, config.smtpMessage); - message['to'] = ctx.instance.emailJobInitiator; - message['subject'] += ' Job Finished with status '+ ctx.instance.jobStatusMessage; - let text = 'Hello, \n\n Your Job with id is now finished. \n\n The resulting job description is.\n\n'+JSON.stringify(ctx.instance, null, 4); - message['text'] = text; - transporter.sendMail(message, function (err, info) { - if (err) { - console.log(err); - } else { - console.log('Email sent'); - } + if ('smtpSettings' in config && 'smtpMessage' in config) { + if (ctx.instance.jobStatusMessage.startsWith("finish")) { + let transporter = nodemailer.createTransport(config.smtpSettings); + transporter.verify(function(error, success) { + if (error) { + console.log(error); next(); - }); - } - }); + } else { + console.log('Server is ready to send message to ', ctx.instance.emailJobInitiator); + var message = Object.assign({}, config.smtpMessage); + message['to'] = ctx.instance.emailJobInitiator; + message['subject'] += ' '+ctx.instance.type + ' job from ' + ctx.instance.creationTime.toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' (UTC) finished with status ' + ctx.instance.jobStatusMessage; + let text = 'Hello, \n\n Your Job from ' + ctx.instance.creationTime + ' is now finished. \n\n The resulting job description is.\n\n' + JSON.stringify(ctx.instance, null, 4); + message['text'] = text; + transporter.sendMail(message, function(err, info) { + if (err) { + console.log(err); + } else { + console.log('Email sent'); + } + next(); + }); + } + }); + } else { + next() + } } else { next() } From 1bc52bf122b6a6d2367fd180e54617282dd6ba54 Mon Sep 17 00:00:00 2001 From: egli Date: Sun, 11 Nov 2018 15:45:40 +0100 Subject: [PATCH 069/147] Boot code for role creation now handled asynchronously, test cases protected against already existing entries in DB --- server/boot/common_utils.js | 16 ++++++----- server/boot/createRoles.js | 26 ++++++++++------- test/Datablock.js | 57 +++++++++++++++++++++++++++++++------ test/Proposal.js | 40 ++++++++++++++++++++++++-- 4 files changed, 110 insertions(+), 29 deletions(-) diff --git a/server/boot/common_utils.js b/server/boot/common_utils.js index 5b1a8b15..e04cd8cc 100644 --- a/server/boot/common_utils.js +++ b/server/boot/common_utils.js @@ -1,7 +1,7 @@ //no need for callback since it is not used -exports.connectRole = function(app, roleName, user) { +exports.connectRole = function(app, roleName, user, cb) { var Role = app.models.Role; var RoleMapping = app.models.RoleMapping; RoleMapping.settings.strictObjectIDCoercion = true; @@ -11,35 +11,37 @@ exports.connectRole = function(app, roleName, user) { name: roleName } }, function(err, role) { - if (err) throw err; + if (err) return cb(err); if (role.length == 0) { Role.create({ name: roleName }, function(err, role) { - if (err) throw err; + if (err) return cb(err); console.log('Created role:', role); - mapRole(RoleMapping, role, user); + mapRole(RoleMapping, role, user,cb); }); }else if (role.length === 1) { - mapRole(RoleMapping, role[0], user); + mapRole(RoleMapping, role[0], user,cb); } }); }; -function mapRole(RoleMapping, role, user) { +function mapRole(RoleMapping, role, user, cb) { //check mapping exists first, maybe also look at user id? RoleMapping.find({ where: { roleId: role.id } }, function(err, maps) { + if(err) return cb(err) if(maps.length === 0) { role.principals.create({ principalType: RoleMapping.USER, principalId: user.id }, function(err, principal) { - if (err) throw err; + if (err) return cb(err); console.log('Assigned user %s to role %s', user.username, role.name); + cb(null) }); } }); diff --git a/server/boot/createRoles.js b/server/boot/createRoles.js index 7c24f992..c5c99357 100644 --- a/server/boot/createRoles.js +++ b/server/boot/createRoles.js @@ -1,12 +1,14 @@ var utils = require('./common_utils'); var fs = require('fs'); -module.exports = function(app) { +module.exports = function(app,cb) { // define roles // note: role names are all lowercase , corresponding accounts camelcase // - createRole = function(account) { + + + createRole = function(account,cb) { var User = app.models.User; @@ -16,7 +18,7 @@ module.exports = function(app) { } }, function(err, users) { if (err) { - throw err; + return cb(err); } else if (users.length === 0) { // check for password file for this role path='server/'+account; @@ -32,8 +34,9 @@ module.exports = function(app) { }, function(err, user) { if (err) { console.log("User create:"+err+" "+user) + return cb(err) } else { - utils.connectRole(app, account.toLowerCase(), user); + utils.connectRole(app, account.toLowerCase(), user, cb); } }); } else { @@ -46,22 +49,23 @@ module.exports = function(app) { }, function(err, user) { if (err) { console.log("User create:"+err+" "+user) + return cb(err) } else { - utils.connectRole(app, account.toLowerCase(), user); + utils.connectRole(app, account.toLowerCase(), user, cb); } }); } } else { console.log('Found ' + account + ' user:', users[0].username); //create the role if not yet there - utils.connectRole(app, account.toLowerCase(), users[0]); + utils.connectRole(app, account.toLowerCase(), users[0], cb); } }); }; - createRole('admin'); - createRole('archiveManager'); - createRole('ingestor'); - createRole('proposalIngestor'); - createRole('userGroupIngestor') + createRole('admin',cb); + createRole('archiveManager',cb); + createRole('ingestor',cb); + createRole('proposalIngestor',cb); + createRole('userGroupIngestor',cb) }; diff --git a/test/Datablock.js b/test/Datablock.js index ad98faf7..9e77bdea 100644 --- a/test/Datablock.js +++ b/test/Datablock.js @@ -200,14 +200,17 @@ describe('Test Datablocks and OrigDatablocks and their relation to Datasets', () }, (tokenVal) => { accessTokenIngestor = tokenVal; - }); - utils.getToken(app, { - 'username': 'archiveManager', - 'password': 'aman' - }, - (tokenVal) => { - accessTokenArchiveManager = tokenVal; - done(); + utils.getToken(app, { + 'username': 'archiveManager', + 'password': 'aman' + }, + (tokenVal) => { + accessTokenArchiveManager = tokenVal; + console.log("============ Both accessToken received") + console.log("Tokens:", accessTokenIngestor, accessTokenArchiveManager) + done(); + }); + }); }); @@ -249,6 +252,42 @@ describe('Test Datablocks and OrigDatablocks and their relation to Datasets', () }); }); + // the following two function definition prepare for + // multi-delete actions to finish + async function deleteDatablock(item) { + await request(app) + .delete('/api/v2/Datablocks/' + item.id + '?access_token=' + accessTokenArchiveManager) + .set('Accept', 'application/json') + .expect(200) + } + + async function processArray(array) { + for (const item of array) { + await deleteDatablock(item) + } + // console.log("==== Finishing all deletes") + } + + it('remove potentially existing datablocks to guarantee uniqueness', function(done) { + let filter = '{"where": {"archiveId": {"inq": ["someOtherId", "' + testdataBlock.archiveId + '"]}}}' + // console.log("Filter expression before encoding:",filter) + let url = '/api/v2/Datablocks?filter=' + encodeURIComponent(filter) + '&access_token=' + accessTokenArchiveManager + // console.log("============= url of query: ", url) + request(app) + .get(url) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + // console.log(" ==================== Found existing datablocks:", res.body) + // now remove all these entries + processArray(res.body) + done() + }); + }); + it('adds a new datablock', function(done) { request(app) .post('/api/v2/Datablocks?access_token=' + accessTokenArchiveManager) @@ -295,7 +334,7 @@ describe('Test Datablocks and OrigDatablocks and their relation to Datasets', () }); it('adds a second datablock for same dataset', function(done) { - testdataBlock.archiveId = "oneCopyBig/p10029/raw/2018/01/23/20.500.11935/07e8a14c-f496-42fe-b4b4-9ff410616xxx_1_2018-01-23-03-11-34.tar", + testdataBlock.archiveId = "someOtherId", request(app) .post('/api/v2/Datablocks?access_token=' + accessTokenArchiveManager) .send(testdataBlock) diff --git a/test/Proposal.js b/test/Proposal.js index 972420c4..4bf1386e 100644 --- a/test/Proposal.js +++ b/test/Proposal.js @@ -14,7 +14,7 @@ var utils = require('./LoginUtils'); var accessToken = null, proposalId = null; -var testdataset = { +var testproposal = { "proposalId": "20170266", "email": "proposer%40uni.edu", "title": "A test proposal", @@ -35,10 +35,46 @@ describe('Simple Proposal tests', () => { }); }); + // the following two function definition prepare for + // multi-delete actions to finish + async function deleteProposal(item) { + await request(app) + .delete('/api/v2/Proposals/' + item.proposalId + '?access_token=' + accessToken) + .set('Accept', 'application/json') + .expect(200) + } + + async function processArray(array) { + for (const item of array) { + await deleteProposal(item) + } + // console.log("==== Finishing all deletes") + } + + it('remove potentially existing proposals to guarantee uniqueness', function(done) { + let filter = '{"where": {"proposalId": "' + testproposal.proposalId + '"}}' + // console.log("Filter expression before encoding:",filter) + let url = '/api/v2/Proposals?filter=' + encodeURIComponent(filter) + '&access_token=' + accessToken + // console.log("============= url of query: ", url) + request(app) + .get(url) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + //console.log(" ==================== Found existing proposals:", res.body) + // now remove all these entries + processArray(res.body) + done() + }); + }); + it('adds a new proposal', function(done) { request(app) .post('/api/v2/Proposals?access_token=' + accessToken) - .send(testdataset) + .send(testproposal) .set('Accept', 'application/json') .expect(200) .expect('Content-Type', /json/) From b8c5908b07d5e0b626c6a234e5ecf4f24f0c1d06 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 12 Nov 2018 12:58:09 +0100 Subject: [PATCH 070/147] Issue #86 generate default policy record for A groups --- common/models/dataset.js | 7 ++++++- common/models/policy.js | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index fecb7b80..becb5c2c 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -33,7 +33,7 @@ module.exports = function(Dataset) { next(); }); - // auto add pid + // auto add pid, add a policy record Dataset.observe('before save', (ctx, next) => { if (ctx.instance) { if (ctx.isNewInstance) { @@ -44,6 +44,10 @@ module.exports = function(Dataset) { } ctx.instance.version = p.version; ctx.instance.type = 'base'; + + // add a policy record now (A Groups). Check that one doesnt already exist + var Policy = app.models.Policy; + Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail); } next(); }); @@ -381,5 +385,6 @@ module.exports = function(Dataset) { }); }; + Dataset.getPolicies = function(ctx, cb) {} }; diff --git a/common/models/policy.js b/common/models/policy.js index 3ab1a585..3eb799f5 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -33,8 +33,7 @@ module.exports = function(Policy) { var e = new Error('Access Not Allowed - policy manager action'); e.statusCode = 401; next(e); - } - else next(); + } else next(); }); } else { //is an full update/insert/delete @@ -42,4 +41,22 @@ module.exports = function(Policy) { next(); } }); + + Policy.addDefault = function(ownerGroup, ownerEmail) { + // TODO: move the deault definition somewhere more sensible + var defaultPolicy = Object(); + defaultPolicy.ownerGroup = ownerGroup; //mandatory + defaultPolicy.manager = ownerEmail.split(","); //mandatory + defaultPolicy.tapeRedundancy = "low"; + defaultPolicy.autoArchive = false; + defaultPolicy.autoArchiveDelay = 7; + defaultPolicy.archiveEmailNotification = true; + defaultPolicy.retrieveEmailNotification = true; + defaultPolicy.tapeRedundancy = "low"; + defaultPolicy.embargoPeriod = 3; + //filter must be an object + var filter = JSON.parse('{"where": {"ownerGroup":"' + ownerGroup + '"}}'); + console.log("default policy: " + JSON.stringify(defaultPolicy)); + Policy.findOrCreate(filter, defaultPolicy); + }; }; From 1fe06798b1e16581e6463c4a59a0bce6198c63e7 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 12 Nov 2018 13:00:30 +0100 Subject: [PATCH 071/147] remove unwanted function def --- common/models/dataset.js | 1 - 1 file changed, 1 deletion(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index becb5c2c..fa9866f4 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -385,6 +385,5 @@ module.exports = function(Dataset) { }); }; - Dataset.getPolicies = function(ctx, cb) {} }; From 6da2e7942e37441baefdf9672ce24079deeca9a0 Mon Sep 17 00:00:00 2001 From: egli Date: Tue, 13 Nov 2018 08:47:33 +0100 Subject: [PATCH 072/147] Corrected API endpoint which is used for travis tests --- CI/ESS/envfiles/settings.sample.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CI/ESS/envfiles/settings.sample.json b/CI/ESS/envfiles/settings.sample.json index 48a24eed..6ae373b6 100644 --- a/CI/ESS/envfiles/settings.sample.json +++ b/CI/ESS/envfiles/settings.sample.json @@ -5,7 +5,7 @@ "admin": { "username": "ingestor", "password": "aman", - "login": "User/login" + "login": "api/v2/Users/login" }, "user": { "username": "admin", From 47bc22fb0e9cccd8aa153c158750c4c6e8c16965 Mon Sep 17 00:00:00 2001 From: egli Date: Tue, 13 Nov 2018 12:18:26 +0100 Subject: [PATCH 073/147] Corrected asynch behaviour of boot scripts --- server/boot/common_utils.js | 9 +- server/boot/createRoles.js | 28 +++--- test/SITES_PSI/FEATURE_NAME.js | 168 --------------------------------- test/SITES_PSI/Ownable.js | 144 ---------------------------- 4 files changed, 22 insertions(+), 327 deletions(-) delete mode 100644 test/SITES_PSI/FEATURE_NAME.js delete mode 100644 test/SITES_PSI/Ownable.js diff --git a/server/boot/common_utils.js b/server/boot/common_utils.js index e04cd8cc..805ae24d 100644 --- a/server/boot/common_utils.js +++ b/server/boot/common_utils.js @@ -17,16 +17,17 @@ exports.connectRole = function(app, roleName, user, cb) { name: roleName }, function(err, role) { if (err) return cb(err); - console.log('Created role:', role); - mapRole(RoleMapping, role, user,cb); + mapRole(RoleMapping, role, user, cb); }); }else if (role.length === 1) { mapRole(RoleMapping, role[0], user,cb); + } else { + return cb(err) } }); }; -function mapRole(RoleMapping, role, user, cb) { +function mapRole(RoleMapping, role, user,cb) { //check mapping exists first, maybe also look at user id? RoleMapping.find({ where: { @@ -43,6 +44,8 @@ function mapRole(RoleMapping, role, user, cb) { console.log('Assigned user %s to role %s', user.username, role.name); cb(null) }); + } else { + cb(null) } }); } diff --git a/server/boot/createRoles.js b/server/boot/createRoles.js index c5c99357..938ae14d 100644 --- a/server/boot/createRoles.js +++ b/server/boot/createRoles.js @@ -1,14 +1,14 @@ var utils = require('./common_utils'); var fs = require('fs'); -module.exports = function(app,cb) { +module.exports = function(app, cb) { // define roles // note: role names are all lowercase , corresponding accounts camelcase // - createRole = function(account,cb) { + createRole = function(account, cb) { var User = app.models.User; @@ -21,8 +21,8 @@ module.exports = function(app,cb) { return cb(err); } else if (users.length === 0) { // check for password file for this role - path='server/'+account; - console.log("creating account "+account); + path = 'server/' + account; + console.log("creating account " + account); if (fs.existsSync(path)) { var data = fs.readFileSync(path, 'utf8').split('\n')[0].split(" "); User.create({ @@ -33,7 +33,7 @@ module.exports = function(app,cb) { emailVerified: true }, function(err, user) { if (err) { - console.log("User create:"+err+" "+user) + console.log("User create:" + err + " " + user) return cb(err) } else { utils.connectRole(app, account.toLowerCase(), user, cb); @@ -48,7 +48,7 @@ module.exports = function(app,cb) { emailVerified: true }, function(err, user) { if (err) { - console.log("User create:"+err+" "+user) + console.log("User create:" + err + " " + user) return cb(err) } else { utils.connectRole(app, account.toLowerCase(), user, cb); @@ -63,9 +63,13 @@ module.exports = function(app,cb) { }); }; - createRole('admin',cb); - createRole('archiveManager',cb); - createRole('ingestor',cb); - createRole('proposalIngestor',cb); - createRole('userGroupIngestor',cb) -}; + createRole('admin', function() { + createRole('archiveManager', function() { + createRole('ingestor', function() { + createRole('proposalIngestor', function() { + createRole('userGroupIngestor', cb) + }) + }) + }) + }) +} diff --git a/test/SITES_PSI/FEATURE_NAME.js b/test/SITES_PSI/FEATURE_NAME.js deleted file mode 100644 index 5347bf96..00000000 --- a/test/SITES_PSI/FEATURE_NAME.js +++ /dev/null @@ -1,168 +0,0 @@ -/* jshint node:true */ -/* jshint esversion:6 */ -'use strict'; - -// process.env.NODE_ENV = 'test'; - -var chai = require('chai'); -var chaiHttp = require('chai-http'); -var request = require('supertest'); -var app = require('../../server/server'); -var should = chai.should(); -var utils = require('../LoginUtils'); - -var accessToken = null, - pid = null; - -var testraw = { - "principalInvestigator": "bertram.astor@grumble.com", - "endTime": "2011-09-14T06:31:25.000Z", - "creationLocation": "/SU/XQX/RAMJET", - "dataFormat": "Upchuck pre 2017", - "scientificMetadata": { - "beamlineParameters": { - "Monostripe": "Ru/C", - "Ring current": { - "v": 0.402246, - "u": "A" - }, - "Beam energy": { - "v": 22595, - "u": "eV" - } - }, - "detectorParameters": { - "Objective": 20, - "Scintillator": "LAG 20um", - "Exposure time": { - "v": 0.4, - "u": "s" - } - }, - "scanParameters": { - "Number of projections": 1801, - "Rot Y min position": { - "v": 0, - "u": "deg" - }, - "Inner scan flag": 0, - "File Prefix": "817b_B2_", - "Sample In": { - "v": 0, - "u": "m" - }, - "Sample folder": "/ramjet/817b_B2_", - "Number of darks": 10, - "Rot Y max position": { - "v": 180, - "u": "deg" - }, - "Angular step": { - "v": 0.1, - "u": "deg" - }, - "Number of flats": 120, - "Sample Out": { - "v": -0.005, - "u": "m" - }, - "Flat frequency": 0, - "Number of inter-flats": 0 - } -}, - "owner": "Bertram Astor", - "ownerEmail": "bertram.astor@grumble.com", - "orcidOfOwner": "unknown", - "contactEmail": "bertram.astor@grumble.com", - "sourceFolder": "/iramjet/tif/", - "size": 0, - "creationTime": "2011-09-14T06:08:25.000Z", - "type": "raw", - "description": "None", - "classification": "AV=medium,CO=low", - "license": "CC BY-SA 4.0", - "version": "2.5.0", - "doi": "not yet defined", - "isPublished": false, - "ownerGroup": "p13388", - "accessGroups": [], - "createdAt": "2017-11-01T18:02:49.825Z", - "updatedAt": "2017-11-01T18:03:04.673Z", - "proposalId": "10.540.16635/20110123" -} - - -describe('Feature that does X when Y', () => { - beforeEach((done) => { - utils.getToken(app, {'username': 'ingestor', 'password': 'aman'}, - (tokenVal) => { - accessToken = tokenVal; - done(); - }); - }); - describe('POST /api/v2/RawDatasets', function () { - it('adds a new dataset', function (done) { - request(app) - .post('/api/v2/RawDatasets?access_token=' + accessToken) - .send(testraw) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end(function (err, res) { - if (err) - return done(err); - res.body.should.have.property('owner').and.be.string; - res.body.should.have.property('pid').and.be.string; - pid = encodeURIComponent(res.body['pid']); - done(); - }); - }); - }); - - describe('get one rawdataset', function () { - it('should fetch one dataset', function (done) { - request(app) - .get('/api/v2/RawDatasets/' + pid + '?access_token=' + accessToken) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - }); - - describe('delete a RawDataset', function () { - it('should delete a rawdataset', function (done) { - request(app) - .delete('/api/v2/RawDatasets/' + pid + '?access_token=' + accessToken) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - }); - - - describe('Get All RawDatasets', function () { - it('should fetch all raw datasets', function (done) { - request(app) - .get('/api/v2/RawDatasets?filter=%7B%22limit%22%3A2%7D&access_token=' + accessToken) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - res.body.should.be.instanceof(Array); - done(); - }); - }); - }); -}); diff --git a/test/SITES_PSI/Ownable.js b/test/SITES_PSI/Ownable.js deleted file mode 100644 index d1cbeac2..00000000 --- a/test/SITES_PSI/Ownable.js +++ /dev/null @@ -1,144 +0,0 @@ -/* jshint node:true */ -/* jshint esversion:6 */ -'use strict'; - -// process.env.NODE_ENV = 'test'; -var config = require('../config/settings') -var chai = require('chai'); -var chaiHttp = require('chai-http'); -var request = require('supertest'); -var app = require('../../server/server'); -var should = chai.should(); -var utils = require('../LoginUtils'); - -var accessToken = null, - pid = null; - -var testraw = { - "principalInvestigator": "bertram.astor@grumble.com", - "endTime": "2011-09-14T06:31:25.000Z", - "creationLocation": "/SU/XQX/RAMJET", - "dataFormat": "Upchuck pre 2017", - "scientificMetadata": { - "beamlineParameters": { - "Monostripe": "Ru/C", - "Ring current": { - "v": 0.402246, - "u": "A" - }, - "Beam energy": { - "v": 22595, - "u": "eV" - } - }, - "detectorParameters": { - "Objective": 20, - "Scintillator": "LAG 20um", - "Exposure time": { - "v": 0.4, - "u": "s" - } - }, - "scanParameters": { - "Number of projections": 1801, - "Rot Y min position": { - "v": 0, - "u": "deg" - }, - "Inner scan flag": 0, - "File Prefix": "817b_B2_", - "Sample In": { - "v": 0, - "u": "m" - }, - "Sample folder": "/ramjet/817b_B2_", - "Number of darks": 10, - "Rot Y max position": { - "v": 180, - "u": "deg" - }, - "Angular step": { - "v": 0.1, - "u": "deg" - }, - "Number of flats": 120, - "Sample Out": { - "v": -0.005, - "u": "m" - }, - "Flat frequency": 0, - "Number of inter-flats": 0 - } - }, - "owner": "Bertram Astor", - "ownerEmail": "bertram.astor@grumble.com", - "orcidOfOwner": "unknown", - "contactEmail": "bertram.astor@grumble.com", - "sourceFolder": "/iramjet/tif/", - "size": 0, - "creationTime": "2011-09-14T06:08:25.000Z", - "description": "None", - "doi": "not yet defined", - "isPublished": false, - "ownerGroup": "p10021", - "accessGroups": [], - "proposalId": "10.540.16635/20110123" -} - - -describe('TestCreation', () => { - before((done) => { - utils.getTokenAD(app, { - 'username': config.users.user.username, - 'password': config.users.user.password - }, - (tokenVal) => { - accessToken = tokenVal; - done(); - }); - }); - it('adds a new raw dataset', function(done) { - request(app) - .post('/api/v2/RawDatasets?access_token=' + accessToken) - .send(testraw) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end(function(err, res) { - if (err) - return done(err); - res.body.should.have.property('owner').and.be.string; - res.body.should.have.property('type').and.equal('raw'); - res.body.should.have.property('pid').and.be.string; - pid = encodeURIComponent(res.body['pid']); - done(); - }); - }); - - - it('should fetch this raw dataset', function(done) { - request(app) - .get('/api/v2/RawDatasets/' + pid + '?access_token=' + accessToken) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); - }); - - it('should not delete this raw dataset', function(done) { - request(app) - .delete('/api/v2/RawDatasets/' + pid + '?access_token=' + accessToken) - .set('Accept', 'application/json') - .expect(401) - .expect('Content-Type', /json/) - .end((err, res) => { - res.body.should.have.property('error'); - done(); - }); - }); - -}); From 3c87584047a877f0d4626dfb187b973f27ed7cba Mon Sep 17 00:00:00 2001 From: egli Date: Tue, 13 Nov 2018 17:01:45 +0100 Subject: [PATCH 074/147] Ensure that boot process is finished before tests start --- CI/ESS/wait.sh | 4 +--- server/boot/createRoles.js | 7 +++++-- test/CheckDifferentDatasetTypes.js | 11 ++++++++++- test/Datablock.js | 7 ++++++- test/Dataset.js | 6 +++++- test/DatasetLifecycle.js | 5 ++++- test/DerivedDataset.js | 5 ++++- test/MessageHistory.js | 6 +++++- test/Policy.js | 6 ++++-- test/Proposal.js | 6 +++++- test/RawDataset.js | 5 ++++- test/ResetDataset.js | 6 +++++- test/Users.js | 8 ++++++-- test/test.js | 7 +++++-- test/testGenerator.js | 5 ++++- 15 files changed, 73 insertions(+), 21 deletions(-) diff --git a/CI/ESS/wait.sh b/CI/ESS/wait.sh index 5bcda799..cd02ee90 100755 --- a/CI/ESS/wait.sh +++ b/CI/ESS/wait.sh @@ -1,4 +1,2 @@ #!/usr/bin/env bash - -sleep 20 -npm test +npm run test diff --git a/server/boot/createRoles.js b/server/boot/createRoles.js index 938ae14d..4ec031ab 100644 --- a/server/boot/createRoles.js +++ b/server/boot/createRoles.js @@ -56,7 +56,7 @@ module.exports = function(app, cb) { }); } } else { - console.log('Found ' + account + ' user:', users[0].username); + console.log('Found ' + account + ' user:', users[0].username, new Date()); //create the role if not yet there utils.connectRole(app, account.toLowerCase(), users[0], cb); } @@ -67,7 +67,10 @@ module.exports = function(app, cb) { createRole('archiveManager', function() { createRole('ingestor', function() { createRole('proposalIngestor', function() { - createRole('userGroupIngestor', cb) + createRole('userGroupIngestor', function(){ + console.log("Last role mapped, now wait a bit ",new Date()) + setTimeout(cb,20000) + }) }) }) }) diff --git a/test/CheckDifferentDatasetTypes.js b/test/CheckDifferentDatasetTypes.js index 76e0979d..b2d42874 100644 --- a/test/CheckDifferentDatasetTypes.js +++ b/test/CheckDifferentDatasetTypes.js @@ -7,7 +7,7 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); + var should = chai.should(); var utils = require('./LoginUtils'); @@ -145,6 +145,14 @@ var derivedCountDataset = 0; var pid = null; var pidraw = null; var pidderived = null; +var app; + +// Make sure thet the boot code, which is executed via the require statement +// is finished before any test is run + +before( function(){ + app = require('../server/server') +}); describe('Check different dataset types and their inheritance', () => { before((done) => { @@ -154,6 +162,7 @@ describe('Check different dataset types and their inheritance', () => { }, (tokenVal) => { accessToken = tokenVal; + // app(done) done(); }); }); diff --git a/test/Datablock.js b/test/Datablock.js index 9e77bdea..581efb5d 100644 --- a/test/Datablock.js +++ b/test/Datablock.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -20,6 +19,7 @@ var idDatablock = null; var idOrigDatablock = null; var idDatablock2 = null; + var testraw = { "principalInvestigator": "bertram.astor@grumble.com", "endTime": "2011-09-14T06:31:25.000Z", @@ -191,6 +191,11 @@ var testorigDataBlock = { ] } +var app + +before( function(){ + app = require('../server/server') +}); describe('Test Datablocks and OrigDatablocks and their relation to Datasets', () => { before((done) => { diff --git a/test/Dataset.js b/test/Dataset.js index a7b14862..d3f4e1aa 100644 --- a/test/Dataset.js +++ b/test/Dataset.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -32,6 +31,11 @@ var testdataset = { "accessGroups": [] } +var app +before( function(){ + app = require('../server/server') +}); + describe('Simple Dataset tests', () => { before((done) => { utils.getToken(app, { diff --git a/test/DatasetLifecycle.js b/test/DatasetLifecycle.js index 686bf6bb..6c6a4330 100644 --- a/test/DatasetLifecycle.js +++ b/test/DatasetLifecycle.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -101,6 +100,10 @@ var testDatasetLifecycle = { "isExported": false } +var app +before( function(){ + app = require('../server/server') +}); describe('Test DatasetLifecycle and the relation to Datasets', () => { before((done) => { diff --git a/test/DerivedDataset.js b/test/DerivedDataset.js index d30e3d9c..610a037b 100644 --- a/test/DerivedDataset.js +++ b/test/DerivedDataset.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -41,6 +40,10 @@ var testderived = { "ownerGroup": "p34123" } +var app +before( function(){ + app = require('../server/server') +}); describe('DerivedDatasets', () => { before((done) => { diff --git a/test/MessageHistory.js b/test/MessageHistory.js index 420186b4..b8cbfad8 100644 --- a/test/MessageHistory.js +++ b/test/MessageHistory.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -140,6 +139,11 @@ var newMessage = { } } +var app +before( function(){ + app = require('../server/server') +}); + describe('Test DatasetLifecycle and the relation to Datasets', () => { before((done) => { utils.getToken(app, { diff --git a/test/Policy.js b/test/Policy.js index 38c32e42..897a25d5 100644 --- a/test/Policy.js +++ b/test/Policy.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -35,7 +34,10 @@ var testdataset = { ] } - +var app +before( function(){ + app = require('../server/server') +}); describe('Simple Policy tests', () => { before((done) => { diff --git a/test/Proposal.js b/test/Proposal.js index 4bf1386e..afbf4b48 100644 --- a/test/Proposal.js +++ b/test/Proposal.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -23,6 +22,11 @@ var testproposal = { } +var app +before( function(){ + app = require('../server/server') +}); + describe('Simple Proposal tests', () => { before((done) => { utils.getToken(app, { diff --git a/test/RawDataset.js b/test/RawDataset.js index f353aa8b..4fd7e67f 100644 --- a/test/RawDataset.js +++ b/test/RawDataset.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -85,6 +84,10 @@ var testraw = { "proposalId": "10.540.16635/20110123" } +var app +before( function(){ + app = require('../server/server') +}); describe('RawDatasets', () => { before((done) => { diff --git a/test/ResetDataset.js b/test/ResetDataset.js index c5462f1e..11a5f8e2 100644 --- a/test/ResetDataset.js +++ b/test/ResetDataset.js @@ -7,7 +7,6 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var should = chai.should(); var utils = require('./LoginUtils'); @@ -161,6 +160,11 @@ var testDatasetLifecycle = { var foundId1 = null; var foundId2 = null; +var app +before( function(){ + app = require('../server/server') +}); + describe('Create Dataset and its Datablocks DatasetLifecycle, then reset Datablocks and Datasetlifecycle status', () => { before((done) => { utils.getToken(app, { diff --git a/test/Users.js b/test/Users.js index 7eac1bb6..b9e3b5e7 100644 --- a/test/Users.js +++ b/test/Users.js @@ -7,12 +7,16 @@ var chai = require('chai'); var chaiHttp = require('chai-http'); var request = require('supertest'); -var app = require('../server/server'); var utils = require('./LoginUtils'); var should = chai.should(); var accessToken = null; +var app +before( function(){ + app = require('../server/server') +}); + describe('Login with functional accounts', () => { it('Ingestor login fails with incorrect credentials', function(done) { @@ -28,7 +32,7 @@ describe('Login with functional accounts', () => { .end((err, res) => { res.body.should.have.property('error'); done(); - }); + }); }); diff --git a/test/test.js b/test/test.js index f173edc6..b1dbec4b 100644 --- a/test/test.js +++ b/test/test.js @@ -3,9 +3,12 @@ var loopbackApiTesting = require('./testGenerator'); var tests = require('./config/tests.json'); var config = require('./config/settings.json'); var server = require('../server/server.js'); - + +// This codes initializes the "generated" mocha tests. +// Note that these tests run using a local http server on port 3000 + loopbackApiTesting.run(tests, server, config, function(err) { if (err) { console.log(err); } -}); \ No newline at end of file +}); diff --git a/test/testGenerator.js b/test/testGenerator.js index 317835e0..c0dd8188 100644 --- a/test/testGenerator.js +++ b/test/testGenerator.js @@ -4,6 +4,8 @@ var supertest = require('supertest'); var async = require('async'); +// Code to generate simple mocha tests via configuration files + module.exports = { run: function (conf, app, settings, callback) { var server; @@ -15,6 +17,7 @@ module.exports = { if (app) { before(function (done) { + console.log("Starting local webserver:",new Date()) server = app.listen(done); }); @@ -41,7 +44,7 @@ module.exports = { const withData = c.body || false; const isWithAuthentication = c.authenticate || false; - + var authenticationDescription = (isWithAuthentication) ? 'authenticated' : 'unauthenticated'; From 213a16be3e44ecf22c525aa7b1c9083359138b01 Mon Sep 17 00:00:00 2001 From: egli Date: Tue, 13 Nov 2018 17:15:46 +0100 Subject: [PATCH 075/147] Add delay again for mongo to come up --- CI/ESS/wait.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CI/ESS/wait.sh b/CI/ESS/wait.sh index cd02ee90..5bcda799 100755 --- a/CI/ESS/wait.sh +++ b/CI/ESS/wait.sh @@ -1,2 +1,4 @@ #!/usr/bin/env bash -npm run test + +sleep 20 +npm test From b243fc24e6879b8c62132c513299e6590ab9a684 Mon Sep 17 00:00:00 2001 From: egli Date: Wed, 14 Nov 2018 08:05:36 +0100 Subject: [PATCH 076/147] Add further delay for mongo to come up --- CI/ESS/wait.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CI/ESS/wait.sh b/CI/ESS/wait.sh index 5bcda799..c6c5dca2 100755 --- a/CI/ESS/wait.sh +++ b/CI/ESS/wait.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash -sleep 20 -npm test +sleep 120 +npm run test From afbe6fe9c16b95ec0af844f905c45f167930dc54 Mon Sep 17 00:00:00 2001 From: egli Date: Wed, 14 Nov 2018 17:16:40 +0100 Subject: [PATCH 077/147] Added delay to allow for boot to settle in tests, bugfix for ResetDataset --- server/boot/createRoles.js | 6 +++--- test/CheckDifferentDatasetTypes.js | 13 +++++++++---- test/ResetDataset.js | 29 ++++++++++++++++++----------- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/server/boot/createRoles.js b/server/boot/createRoles.js index 4ec031ab..aa3a45fe 100644 --- a/server/boot/createRoles.js +++ b/server/boot/createRoles.js @@ -1,7 +1,7 @@ var utils = require('./common_utils'); var fs = require('fs'); -module.exports = function(app, cb) { +module.exports = function(app, cb2) { // define roles // note: role names are all lowercase , corresponding accounts camelcase @@ -68,8 +68,8 @@ module.exports = function(app, cb) { createRole('ingestor', function() { createRole('proposalIngestor', function() { createRole('userGroupIngestor', function(){ - console.log("Last role mapped, now wait a bit ",new Date()) - setTimeout(cb,20000) + console.log("Last role mapped, finished booting ",new Date()) + cb2(null) }) }) }) diff --git a/test/CheckDifferentDatasetTypes.js b/test/CheckDifferentDatasetTypes.js index b2d42874..5fc00515 100644 --- a/test/CheckDifferentDatasetTypes.js +++ b/test/CheckDifferentDatasetTypes.js @@ -12,6 +12,7 @@ var should = chai.should(); var utils = require('./LoginUtils'); var accessToken = null; +var boot = require('loopback-boot'); // TODO // add tests for normal users (non functional accounts) @@ -149,10 +150,14 @@ var app; // Make sure thet the boot code, which is executed via the require statement // is finished before any test is run - -before( function(){ - app = require('../server/server') -}); +// since there is no callback or this available I simply have to wait here +// This wait should be added to the first test running + +before(function(done) { + app = require('../server/server'); + console.log("Waiting for 15 seconds for boot tasks to finish: ",new Date()) + setTimeout(done,15000) + }); describe('Check different dataset types and their inheritance', () => { before((done) => { diff --git a/test/ResetDataset.js b/test/ResetDataset.js index 11a5f8e2..9ca31db0 100644 --- a/test/ResetDataset.js +++ b/test/ResetDataset.js @@ -161,7 +161,7 @@ var foundId1 = null; var foundId2 = null; var app -before( function(){ +before(function() { app = require('../server/server') }); @@ -208,6 +208,7 @@ describe('Create Dataset and its Datablocks DatasetLifecycle, then reset Datablo .expect(200) .expect('Content-Type', /json/) .end((err, res) => { + console.log("Result of looking for first id:", res.body) if (err) return done(err); foundId2 = res.body[0] ? res.body[0].id : null @@ -215,8 +216,8 @@ describe('Create Dataset and its Datablocks DatasetLifecycle, then reset Datablo }); }); - if (foundId1) { - it('should delete existing Datablocks with specific archiveId', function(done) { + it('should delete existing Datablocks with specific archiveId', function(done) { + if (foundId1) { request(app) .delete('/api/v2/Datablocks/' + foundId1 + '?access_token=' + accessTokenArchiveManager) .set('Accept', 'application/json') @@ -225,14 +226,17 @@ describe('Create Dataset and its Datablocks DatasetLifecycle, then reset Datablo .end((err, res) => { if (err) return done(err); - // console.log("Deleted datablock:", res.body) + console.log("Deleted datablock:", res.body) done(); }); - }); - } + } else { + done() + } + }); + - if (foundId2) { - it('should delete existing Datablocks with 2nd specific archiveId', function(done) { + it('should delete existing Datablocks with 2nd specific archiveId', function(done) { + if (foundId2) { request(app) .delete('/api/v2/Datablocks/' + foundId2 + '?access_token=' + accessTokenArchiveManager) .set('Accept', 'application/json') @@ -241,11 +245,14 @@ describe('Create Dataset and its Datablocks DatasetLifecycle, then reset Datablo .end((err, res) => { if (err) return done(err); - // console.log("Deleted datablock:", res.body) + console.log("Deleted datablock:", res.body) done(); }); - }); - } + } else { + done() + } + }); + it('adds a new raw dataset', function(done) { request(app) From c1b984bf4e4068e92245c1f57292c563050b5462 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 08:00:57 +0100 Subject: [PATCH 078/147] Reduced wait time to be compatible with timeout settings --- test/CheckDifferentDatasetTypes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/CheckDifferentDatasetTypes.js b/test/CheckDifferentDatasetTypes.js index 5fc00515..1a3cb9c0 100644 --- a/test/CheckDifferentDatasetTypes.js +++ b/test/CheckDifferentDatasetTypes.js @@ -155,8 +155,8 @@ var app; before(function(done) { app = require('../server/server'); - console.log("Waiting for 15 seconds for boot tasks to finish: ",new Date()) - setTimeout(done,15000) + console.log("Waiting for 5 seconds for boot tasks to finish: ",new Date()) + setTimeout(done,5000) }); describe('Check different dataset types and their inheritance', () => { From 7d2bbc2b7ff7187943ca45dd0c6586bb25d55f09 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 09:07:57 +0100 Subject: [PATCH 079/147] Added auto creation of text index at boot time --- CI/ESS/wait.sh | 4 +-- server/boot/0-script.js | 75 +++++++++++++++++++++++------------------ test/Datablock.js | 2 -- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/CI/ESS/wait.sh b/CI/ESS/wait.sh index c6c5dca2..87056c40 100755 --- a/CI/ESS/wait.sh +++ b/CI/ESS/wait.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash - -sleep 120 +# wait for mongo container to come up +sleep 15 npm run test diff --git a/server/boot/0-script.js b/server/boot/0-script.js index 985fa3bd..d24721b4 100644 --- a/server/boot/0-script.js +++ b/server/boot/0-script.js @@ -1,38 +1,49 @@ module.exports = function(app) { - var dataSource = app.datasources.mongo; - console.log("Datasource host %s, database %s", dataSource.connector.settings.host, dataSource.connector.settings.database) - dataSource.isActual(function(err, actual) { - // console.log("Database actual:", actual) - // if (!actual) { - dataSource.autoupdate(function(err, result) { - if (err) { - console.log("Database Autoupdate error: %s", err) - } else { - console.log("Database Autoupdate result: %s", result) + var dataSource = app.datasources.mongo; + console.log("Datasource host %s, database %s", dataSource.connector.settings.host, dataSource.connector.settings.database) + dataSource.isActual(function(err, actual) { + // console.log("Database actual:", actual) + // if (!actual) { + dataSource.autoupdate(function(err, result) { + if (err) { + console.log("Database Autoupdate error: %s", err) + } else { + console.log("Database Autoupdate result: %s", result) - } - }); - //} - }); + } + }); + //} + }); - var loopback = require('loopback'); - var DataModel = loopback.PersistedModel; + var loopback = require('loopback'); + var DataModel = loopback.PersistedModel; - console.log("Adding ACLS for UserIdentity") + console.log("Adding ACLS for UserIdentity") - DataModel.extend('UserIdentity', null, { - acls: [{ - principalType: 'ROLE', - principalId: '$everyone', - permission: 'DENY' - }, - { - accessType: 'READ', - principalType: 'ROLE', - principalId: '$authenticated', - permission: 'ALLOW' - } - ] - }); -}; + DataModel.extend('UserIdentity', null, { + acls: [{ + principalType: 'ROLE', + principalId: '$everyone', + permission: 'DENY' + }, + { + accessType: 'READ', + principalType: 'ROLE', + principalId: '$authenticated', + permission: 'ALLOW' + } + ] + }); + dataSource.connector.connect(function(err, db) { + db.collection('Dataset').createIndex({ + "$**": "text" + }, function(err) { + if (!err) { + console.log("Text Index on dataset created succesfully") + } else { + console.log(err); + } + }); + }); +}; diff --git a/test/Datablock.js b/test/Datablock.js index 581efb5d..b8b80a5a 100644 --- a/test/Datablock.js +++ b/test/Datablock.js @@ -211,8 +211,6 @@ describe('Test Datablocks and OrigDatablocks and their relation to Datasets', () }, (tokenVal) => { accessTokenArchiveManager = tokenVal; - console.log("============ Both accessToken received") - console.log("Tokens:", accessTokenIngestor, accessTokenArchiveManager) done(); }); From 6e6c5667b01f389fa51d439017caadc8f434be1f Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 09:38:22 +0100 Subject: [PATCH 080/147] Corrected testcase for MessageHistory expecting the wrong dataset ids --- common/models/job.js | 4 ++-- test/MessageHistory.js | 15 ++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/common/models/job.js b/common/models/job.js index 54dea608..f38dd5d9 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -33,7 +33,7 @@ module.exports = function (Job) { } }); if (ctx.instance) { - // auto fill dataOfLastMessage + // auto fill dateOfLastMessage var now = new Date(); if (!ctx.instance.dateOfLastMessage) { ctx.instance.dateOfLastMessage = now.toISOString(); @@ -47,7 +47,7 @@ module.exports = function (Job) { // console.log("Verifying datasets:",ctx.options) const idList=ctx.instance.datasetList.map(x => x.pid) Dataset.find({where: {pid: {inq: idList}}}, ctx.options, function (err, p){ - console.log("JOBS:lengths",err,p.length,idList.length,p) + //console.log("JOBS:lengths",err,p.length,idList.length,p) if (err || (p.length != idList.length)){ var e = new Error(); e.statusCode = 400; diff --git a/test/MessageHistory.js b/test/MessageHistory.js index b8cbfad8..c46ff68f 100644 --- a/test/MessageHistory.js +++ b/test/MessageHistory.js @@ -116,14 +116,9 @@ var testjob = { "type": "retrieve", "jobStatusMessage": "jobForwarded", "datasetList": [{ - "pid": "20.500.11935/93128a6e-6c0c-48aa-bd3d-34b8fafc29ff", + "pid": "dummy", "files": [] - }, - { - "pid": "20.500.11935/c26ab160-3725-459c-a4fd-a8c88d0ff170", - "files": [] - }, - ], + }], "archiveReturnMessage": "will move to messageList", "MessageHistory": [] } @@ -177,8 +172,10 @@ describe('Test DatasetLifecycle and the relation to Datasets', () => { res.body.should.have.property('type').and.equal('raw'); res.body.should.have.property('pid').and.be.string; // store link to this dataset in datablocks - testDatasetLifecycle.id = res.body['pid'] - testDatasetLifecycle.datasetId = res.body['pid'] + var pidtest=res.body['pid'] + testDatasetLifecycle.id = pidtest + testDatasetLifecycle.datasetId = pidtest + testjob.datasetList[0].pid= pidtest pid = encodeURIComponent(res.body['pid']); done(); }); From 11f2926595e0acc1c022fa2380dc12d3549c53b1 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 11:01:08 +0100 Subject: [PATCH 081/147] Fill in users in ldap as part of docker-compose --- CI/ESS/envfiles/settings.sample.json | 4 +- CI/ESS/ldif_files/addAll.sh | 7 ++ CI/ESS/ldif_files/people.ldif | 69 ++++++++++++++ docker-compose.yaml | 129 ++++++++------------------- 4 files changed, 115 insertions(+), 94 deletions(-) create mode 100644 CI/ESS/ldif_files/addAll.sh create mode 100644 CI/ESS/ldif_files/people.ldif diff --git a/CI/ESS/envfiles/settings.sample.json b/CI/ESS/envfiles/settings.sample.json index 6ae373b6..1dc78e4f 100644 --- a/CI/ESS/envfiles/settings.sample.json +++ b/CI/ESS/envfiles/settings.sample.json @@ -8,8 +8,8 @@ "login": "api/v2/Users/login" }, "user": { - "username": "admin", - "password": "admin", + "username": "zach", + "password": "pass", "login": "auth/msad" } } diff --git a/CI/ESS/ldif_files/addAll.sh b/CI/ESS/ldif_files/addAll.sh new file mode 100644 index 00000000..2e67db1d --- /dev/null +++ b/CI/ESS/ldif_files/addAll.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +echo "sleep for 5, waiting for ldap" +sleep 5 +ldapsearch -v -h openldap -x -D "cn=admin,dc=example,dc=org" -w admin -b "dc=example,dc=org" -s sub +echo "adding to ldap" +ldapadd -v -h openldap -c -D "cn=admin,dc=example,dc=org" -w admin -f /ldif_files/people.ldif +echo "done adding to ldap" diff --git a/CI/ESS/ldif_files/people.ldif b/CI/ESS/ldif_files/people.ldif new file mode 100644 index 00000000..6f601daf --- /dev/null +++ b/CI/ESS/ldif_files/people.ldif @@ -0,0 +1,69 @@ +# --- OUs ------------------------------------- + +dn: ou=Groups,dc=example,dc=org +objectClass: organizationalunit +objectClass: top +ou: Groups + +dn: ou=People,dc=example,dc=org +objectClass: organizationalunit +objectClass: top +ou: People + + +# --- People ---------------------------------- + +dn: cn=marpontes,ou=People,dc=example,dc=org +objectClass: person +objectClass: inetOrgPerson +objectClass: organizationalPerson +objectClass: top +cn: marpontes +userpassword: pass +givenname: Marcello +sn: Pontes +mail: marcello@oncase.com.br +uid: 1001 + +dn: cn=zach,ou=People,dc=example,dc=org +objectClass: person +objectClass: inetOrgPerson +objectClass: organizationalPerson +objectClass: top +cn: zach +userpassword: pass +givenname: Zachary +sn: Zeus +mail: zach@oncase.com.br +uid: 1002 + +dn: cn=leonardo,ou=People,dc=example,dc=org +objectClass: person +objectClass: inetOrgPerson +objectClass: organizationalPerson +objectClass: top +cn: leonardo +userpassword: pass +givenname: Leonardo +sn: Luiz +mail: zach@oncase.com.br +uid: 1003 + + +# --- Groups ---------------------------------- + +dn: cn=Administrator,ou=Groups,dc=example,dc=org +objectClass: groupofuniquenames +objectClass: top +ou: Groups +cn: Administrator +uniquemember: cn=marpontes, ou=People, dc=example,dc=org + +dn: cn=Developers,ou=Groups,dc=example,dc=org +objectClass: groupofuniquenames +objectClass: top +ou: Groups +cn: Administrator +uniquemember: cn=marpontes, ou=People, dc=example,dc=org +uniquemember: cn=zach, ou=People, dc=example,dc=org +uniquemember: cn=leonardo, ou=People, dc=example,dc=org diff --git a/docker-compose.yaml b/docker-compose.yaml index c70d57bd..d6f5d6f6 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -2,111 +2,56 @@ version: "3" services: mongodb: image: 'bitnami/mongodb:latest' - labels: - kompose.service.type: nodeport ports: - "27017:27017" volumes: - 'mongodb_data:/bitnami' - - catamel: - build: + build: context: . - dockerfile: CI/ESS/Dockerfile.test + dockerfile: CI/ESS/Dockerfile.unittests image: garethcmurphy/catamel ports: - '3000:3000' - - '3001:3001' - depends_on: + depends_on: - mongodb + - openldap-seed links: - mongodb - openldap - + - openldap-seed openldap: - image: osixia/openldap:1.2.0 - container_name: openldap - environment: - LDAP_LOG_LEVEL: "256" - LDAP_ORGANISATION: "Example Inc." - LDAP_DOMAIN: "example.org" - LDAP_BASE_DN: "" - LDAP_ADMIN_PASSWORD: "admin" - LDAP_CONFIG_PASSWORD: "config" - LDAP_READONLY_USER: "true" - LDAP_READONLY_USER_USERNAME: "readonly" - LDAP_READONLY_USER_PASSWORD: "readonly" - LDAP_RFC2307BIS_SCHEMA: "false" - LDAP_BACKEND: "mdb" - LDAP_TLS: "true" - LDAP_TLS_CRT_FILENAME: "ldap.crt" - LDAP_TLS_KEY_FILENAME: "ldap.key" - LDAP_TLS_CA_CRT_FILENAME: "ca.crt" - LDAP_TLS_ENFORCE: "false" - LDAP_TLS_CIPHER_SUITE: "SECURE256:-VERS-SSL3.0" - LDAP_TLS_PROTOCOL_MIN: "3.1" - LDAP_TLS_VERIFY_CLIENT: "demand" - LDAP_REPLICATION: "false" - #LDAP_REPLICATION_CONFIG_SYNCPROV: "binddn="cn=admin,cn=config" bindmethod=simple credentials=$LDAP_CONFIG_PASSWORD searchbase="cn=config" type=refreshAndPersist retry="60 +" timeout=1 starttls=critical" - #LDAP_REPLICATION_DB_SYNCPROV: "binddn="cn=admin,$LDAP_BASE_DN" bindmethod=simple credentials=$LDAP_ADMIN_PASSWORD searchbase="$LDAP_BASE_DN" type=refreshAndPersist interval=00:00:00:10 retry="60 +" timeout=1 starttls=critical" - #LDAP_REPLICATION_HOSTS: "#PYTHON2BASH:['ldap://ldap.example.org','ldap://ldap2.example.org']" - KEEP_EXISTING_CONFIG: "false" - LDAP_REMOVE_CONFIG_AFTER_SETUP: "true" - LDAP_SSL_HELPER_PREFIX: "ldap" - tty: true - stdin_open: true - volumes: - - /var/lib/ldap - - /etc/ldap/slapd.d - - /container/service/slapd/assets/certs/ - ports: + image: osixia/openldap + container_name: openldap + hostname: openldap + environment: + LDAP_ORGANISATION: "LDAP Catamel Auth" + LDAP_SSL_HELPER_PREFIX: "ldap" + LDAP_TLS_VERIFY_CLIENT: "never" + LDAP_LOG_LEVEL: 256 + LDAP_ADMIN_PASSWORD: "admin" + ports: - "389:389" - - "636:636" - domainname: "example.org" # important: same as hostname - hostname: "example.org" -# -# zookeeper: -# image: wurstmeister/zookeeper -# ports: -# - "2181:2181" -# -# kafka: -# image: wurstmeister/kafka -# depends_on: -# - zookeeper -# ports: -# - "9092:9092" -# environment: -# KAFKA_ADVERTISED_HOST_NAME: "kafka" -# KAFKA_ADVERTISED_PORT: "9092" -# KAFKA_CREATE_TOPICS: "test:1:1" -# KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 -# consumer: -# image: wurstmeister/kafka -# depends_on: -# - kafka -# command: [ "sh", "-c", "sleep 10 && $$KAFKA_HOME/bin/kafka-console-consumer.sh --topic=test --zookeeper=zookeeper:2181" ] -# producer: -# image: wurstmeister/kafka -# depends_on: -# - kafka -# command: [ "sh", "-c", "sleep 15 && echo 'hello kafka' | $$KAFKA_HOME/bin/kafka-console-producer.sh --topic=test --broker-list=kafka:9092" ] -# -# nodered: -# build: nodered -# ports: -# - "1880:1880" -# -# myshell: -# build: -# context: myshell -# image: garethcmurphy/myshell -# depends_on: -# - mongodb -# - local-rabbit-rabbitmq.dev - - + openldap-seed: + image: osixia/openldap + volumes: + - ./CI/ESS/ldif_files:/ldif_files + links: + - openldap + entrypoint: sh -c '/ldif_files/addAll.sh' + openldap-admin: + image: osixia/phpldapadmin + container_name: openldap-admin + hostname: openldap-admin + environment: + PHPLDAPADMIN_HTTPS=false: + PHPLDAPADMIN_LDAP_HOSTS: "openldap" + ports: + - "8080:80" + links: + - "openldap:openldap" + depends_on: + - openldap volumes: - mongodb_data: - driver: local + mongodb_data: + driver: local From 6354637fda21c15c35b5ce5685f6bb338c7583d1 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 11:09:54 +0100 Subject: [PATCH 082/147] Added missing Dockerfile --- CI/ESS/Dockerfile.unittests | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 CI/ESS/Dockerfile.unittests diff --git a/CI/ESS/Dockerfile.unittests b/CI/ESS/Dockerfile.unittests new file mode 100644 index 00000000..f2c28b65 --- /dev/null +++ b/CI/ESS/Dockerfile.unittests @@ -0,0 +1,38 @@ +# gives a docker image below 200 MB +FROM node:9 + +ENV http_proxy "http://192.168.1.1:8123" +ENV https_proxy $http_proxy +ENV no_proxy "localhost, 127.0.0.1" +RUN npm config set proxy $http_proxy +RUN npm config set https-proxy $http_proxy +RUN npm config set registry http://registry.npmjs.org/ +RUN npm config set strict-ssl false + + +RUN apt-get update && apt-get install -y --no-install-recommends mongodb-clients vim ldap-utils + +ENV PORT 3000 +EXPOSE 3000 + +WORKDIR /usr/src/app +COPY package.json /usr/src/app/ +# Install our packages +RUN npm install + + +# Copy the rest of our application, node_modules is ignored via .dockerignore +COPY . /usr/src/app +COPY CI/ESS/envfiles/config.ess.js /usr/src/app/server/config.local.js +COPY CI/ESS/envfiles/middleware.json /usr/src/app/server/ +RUN touch /usr/src/app/test/config/providers.json +COPY CI/ESS/envfiles/providers.unittests.json /usr/src/app/server/providers.json +COPY CI/ESS/envfiles/datasources.json /usr/src/app/server/ +COPY CI/ESS/envfiles/component-config.json /usr/src/app/server/ +RUN touch /usr/src/app/test/config/settings.json +COPY CI/ESS/envfiles/settings.sample.json /usr/src/app/test/config/settings.json +COPY CI/ESS/wait.sh /usr/src/app/ +# no longer needed COPY CI/ESS/createIndex.js /usr/src/app/ + +# Start the app +CMD ["./wait.sh"] From 4c9885ea66b9bf70dc64757ec95f8878d8735220 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 11:40:20 +0100 Subject: [PATCH 083/147] Use non-proxy Dockerfile for travis tests --- CI/ESS/Dockerfile.test | 6 ++++-- docker-compose.yaml | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CI/ESS/Dockerfile.test b/CI/ESS/Dockerfile.test index ca7f93a3..43128df0 100644 --- a/CI/ESS/Dockerfile.test +++ b/CI/ESS/Dockerfile.test @@ -1,19 +1,21 @@ FROM node:9 +RUN apt-get update && apt-get install -y --no-install-recommends mongodb-clients ldap-utils vim + ENV PORT 3000 EXPOSE 3000 WORKDIR /usr/src/app COPY package.json /usr/src/app/ # Install our packages -RUN npm install +RUN npm install # Copy the rest of our application, node_modules is ignored via .dockerignore COPY . /usr/src/app COPY CI/ESS/envfiles/config.ess.js /usr/src/app/server/config.local.js COPY CI/ESS/envfiles/middleware.json /usr/src/app/server/ -COPY CI/ESS/envfiles/providers.json /usr/src/app/server/ +COPY CI/ESS/envfiles/providers.unittests.json /usr/src/app/server/providers.json COPY CI/ESS/envfiles/datasources.json /usr/src/app/server/ COPY CI/ESS/envfiles/component-config.json /usr/src/app/server/ COPY CI/ESS/envfiles/settings.sample.json /usr/src/app/test/config/settings.json diff --git a/docker-compose.yaml b/docker-compose.yaml index d6f5d6f6..a2889432 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -9,7 +9,7 @@ services: catamel: build: context: . - dockerfile: CI/ESS/Dockerfile.unittests + dockerfile: CI/ESS/Dockerfile.test image: garethcmurphy/catamel ports: - '3000:3000' @@ -30,7 +30,7 @@ services: LDAP_TLS_VERIFY_CLIENT: "never" LDAP_LOG_LEVEL: 256 LDAP_ADMIN_PASSWORD: "admin" - ports: + ports:CI/ESS/envfiles/settings.sample.json - "389:389" openldap-seed: image: osixia/openldap From 6a3107e8cf0ab0d2d3e00f5a1062faf6d13bf817 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 11:44:52 +0100 Subject: [PATCH 084/147] Typo in yaml file --- CI/ESS/envfiles/providers.unittests.json | 34 ++++++++++++++++++++++++ docker-compose.yaml | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 CI/ESS/envfiles/providers.unittests.json diff --git a/CI/ESS/envfiles/providers.unittests.json b/CI/ESS/envfiles/providers.unittests.json new file mode 100644 index 00000000..1e206710 --- /dev/null +++ b/CI/ESS/envfiles/providers.unittests.json @@ -0,0 +1,34 @@ +{ + "local": { + "provider": "local", + "module": "passport-local", + "usernameField": "username", + "passwordField": "password", + "authPath": "/auth/local", + "successRedirect": "/auth/account", + "failureRedirect": "/local", + "failureFlash": true + }, + "ldap": { + "provider": "ldap", + "authScheme": "ldap", + "module": "passport-ldapauth", + "authPath": "/auth/msad", + "successRedirect": "/auth/account", + "failureRedirect": "/msad", + "session": true, + "json": true, + "failureFlash": true, + "profileAttributesFromLDAP": { + "displayName": "displayName", + "email": "mail" + }, + "server": { + "url": "ldap://openldap:389", + "bindDn": "cn=admin,dc=example,dc=org", + "bindCredentials": "admin", + "searchBase": "dc=example,dc=org", + "searchFilter": "(cn={{username}})" + } + } +} diff --git a/docker-compose.yaml b/docker-compose.yaml index a2889432..a71a537d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -30,7 +30,7 @@ services: LDAP_TLS_VERIFY_CLIENT: "never" LDAP_LOG_LEVEL: 256 LDAP_ADMIN_PASSWORD: "admin" - ports:CI/ESS/envfiles/settings.sample.json + ports: - "389:389" openldap-seed: image: osixia/openldap From 8e8631397dfbca06803fd54ab58944d5cbab3de9 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 11:59:16 +0100 Subject: [PATCH 085/147] Make addAll.sh script executable --- CI/ESS/ldif_files/addAll.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 CI/ESS/ldif_files/addAll.sh diff --git a/CI/ESS/ldif_files/addAll.sh b/CI/ESS/ldif_files/addAll.sh old mode 100644 new mode 100755 From e2dc9cb72a4d86451b0b912fe26cbd84938d36d0 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 13:11:01 +0100 Subject: [PATCH 086/147] Adjusted travis configuration to new ldap init --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8464880b..92793833 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,9 +35,11 @@ before_install: # Setup your application stack. You may need to tweak these commands if you # doing out-of-the-ordinary docker-compose builds. - docker-compose build - - docker-compose up --abort-on-container-exit # You will want this for logging. If one of your containers does not build for # whatever reason it's best to report that now before your tests start # otherwise it can be really tricky to debug why tests are failing sometimes. - docker ps + +script: + - docker-compose run catamel ./wait.sh --verbose From b311744cdaa6bcb3d39a9d4a4aa98085da35fa8d Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 13:42:58 +0100 Subject: [PATCH 087/147] Removed wait for mongo to become ready --- CI/ESS/wait.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CI/ESS/wait.sh b/CI/ESS/wait.sh index 87056c40..cb5d0671 100755 --- a/CI/ESS/wait.sh +++ b/CI/ESS/wait.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash # wait for mongo container to come up -sleep 15 +# sleep 15 npm run test From 74b4b575c415e693db9697e1524e507d070c0fa2 Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 13:52:53 +0100 Subject: [PATCH 088/147] Allow for larger values of timeout --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aad3c08c..faeb7b91 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint": "eslint common/models", "start": "node .", "posttests": "npm run lint && nsp check", - "test": "./node_modules/mocha/bin/mocha --timeout=10000 --reporter spec --exit 2>/dev/null" + "test": "./node_modules/mocha/bin/mocha --timeout=30000 --reporter spec --exit 2>/dev/null" }, "dependencies": { "compression": "^1.0.3", From 512806a27ced758cc0623d9ba19536d008dbd8ff Mon Sep 17 00:00:00 2001 From: egli Date: Thu, 15 Nov 2018 13:58:26 +0100 Subject: [PATCH 089/147] Mongo still needs more time to come up... --- CI/ESS/wait.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CI/ESS/wait.sh b/CI/ESS/wait.sh index cb5d0671..87056c40 100755 --- a/CI/ESS/wait.sh +++ b/CI/ESS/wait.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash # wait for mongo container to come up -# sleep 15 +sleep 15 npm run test From cd750e694b485a7f91df1ff2d3397c0ed30298e5 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 15 Nov 2018 14:30:52 +0100 Subject: [PATCH 090/147] Add travis badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 79d1386d..aa4ed93e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # SciCat Data Catalog Backend - +[![Build Status](https://travis-ci.org/SciCatProject/catamel.svg?branch=develop)](https://travis-ci.org/SciCatProject/catamel) [![Greenkeeper badge](https://badges.greenkeeper.io/SciCatProject/catamel.svg)](https://greenkeeper.io/) The data catalog backend is based on [NoSQL database MongoDB](https://www.mongodb.com/), [the Node based web application framework Express](http://expressjs.com/) and [the API framework Loopback](http://loopback.io/) technology stack (the "MEL" part of the "MELANIE" technology stack). It provides a REST based API which allows to store information about datasets and to allow to answer queries about the stored meta data for these datasets From 19ab27e7320b5468f8808ad1a772a7284356c0ed Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 15 Nov 2018 21:28:18 +0100 Subject: [PATCH 091/147] add latest packages --- package-lock.json | 3023 +++++++++++++++++---------------------------- package.json | 34 +- 2 files changed, 1180 insertions(+), 1877 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1a1de21..78af0daa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", "dev": true, "requires": { - "@babel/highlight": "7.0.0" + "@babel/highlight": "^7.0.0" } }, "@babel/highlight": { @@ -19,17 +19,9 @@ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", "dev": true, "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@kyleshockey/object-assign-deep": { @@ -44,15 +36,15 @@ "dev": true, "requires": { "chalk": "1.1.3", - "ejs": "1.0.0", + "ejs": "1.0", "extfs": "0.0.7", "mkdirp": "0.5.1", "optimist": "0.6.1", - "rimraf": "2.6.2", - "rxjs": "5.5.11", - "semver": "5.5.0", - "underscore": "1.9.1", - "underscore.inflections": "0.2.1" + "rimraf": "^2.6.1", + "rxjs": "^5.5.9", + "semver": "^5.4.1", + "underscore": "^1.8.3", + "underscore.inflections": "^0.2.1" }, "dependencies": { "chalk": { @@ -61,11 +53,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "ejs": { @@ -80,7 +72,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "underscore": { @@ -96,8 +88,8 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", "requires": { - "@types/connect": "3.4.32", - "@types/node": "7.0.65" + "@types/connect": "*", + "@types/node": "*" } }, "@types/chai": { @@ -111,7 +103,7 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", "requires": { - "@types/node": "7.0.65" + "@types/node": "*" } }, "@types/cookiejar": { @@ -130,9 +122,9 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz", "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==", "requires": { - "@types/body-parser": "1.17.0", - "@types/express-serve-static-core": "4.16.0", - "@types/serve-static": "1.13.2" + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" } }, "@types/express-serve-static-core": { @@ -140,9 +132,9 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", "requires": { - "@types/events": "1.2.0", - "@types/node": "7.0.65", - "@types/range-parser": "1.2.2" + "@types/events": "*", + "@types/node": "*", + "@types/range-parser": "*" } }, "@types/ldapjs": { @@ -150,8 +142,8 @@ "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.3.tgz", "integrity": "sha512-FSj24s1WsFEfOy8taIKp2DokSZfFkjWYZb88AS5eDj3WTocZ+4DnHjhzrXEs048WQ5mfOLJXMOAnc0kSnHh5Lw==", "requires": { - "@types/events": "1.2.0", - "@types/node": "7.0.65" + "@types/events": "*", + "@types/node": "*" } }, "@types/mime": { @@ -165,11 +157,11 @@ "integrity": "sha512-iUdyWWikcQnGvIZnYh5ZxnxeREykndA9+iGdo068NGNutibWknDjmmNMq/8cnS1eaTCcgqJsPsFppw3XJWNlUg==" }, "@types/passport": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-0.3.5.tgz", - "integrity": "sha512-J7mdY1nnhjdbkXT84S3WsyrTtDf2KqUJ9JW3Y9vxA5GuXlejIuvwHw9A2TdNklAqPG2Q0TWqlsA2a2GIeV1jYA==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-0.4.7.tgz", + "integrity": "sha512-EePlxNYx5tf3n0yjdPXX0/zDOv0UCwjMyQo4UkWGlhHteNDItAj7TfDdLttSThVMKQz3uCW7lsGzMuml0f8g9Q==", "requires": { - "@types/express": "4.16.0" + "@types/express": "*" } }, "@types/range-parser": { @@ -182,8 +174,8 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", "requires": { - "@types/express-serve-static-core": "4.16.0", - "@types/mime": "2.0.0" + "@types/express-serve-static-core": "*", + "@types/mime": "*" } }, "@types/superagent": { @@ -192,31 +184,26 @@ "integrity": "sha512-Dnh0Iw6NO55z1beXvlsvUrfk4cd9eL2nuTmUk+rAhSVCk10PGGFbqCCTwbau9D0d2W3DITiXl4z8VCqppGkMPQ==", "dev": true, "requires": { - "@types/cookiejar": "2.1.0", - "@types/node": "7.0.65" + "@types/cookiejar": "*", + "@types/node": "*" } }, "JSONStream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", - "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "accept-language": { "version": "3.0.18", "resolved": "https://registry.npmjs.org/accept-language/-/accept-language-3.0.18.tgz", "integrity": "sha1-9QJfF79lpGaoRYOMz5jNuHfYM4Q=", "requires": { - "bcp47": "1.1.2", - "stable": "0.1.8" + "bcp47": "^1.1.2", + "stable": "^0.1.6" } }, "accepts": { @@ -224,52 +211,39 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, "acorn": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", - "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "dev": true }, "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - } - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", + "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", + "dev": true }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" - }, "amqp-stats": { "version": "https://github.com/fullcube/node-amqp-stats/tarball/fe86722fd278067969f03addde57ed53f0910cd8", "integrity": "sha512-Pejhw8qdugieqO9XPBLshn6yQP9Y+CehOX1ZmBBvGywfZb7LeV8cRMWBud0CVd1likYqd72tgTy8Ky/S7k6jZA==", "requires": { - "qs": "6.5.2", - "request": "2.87.0" + "qs": "^6.3.0", + "request": "^2.76.0" } }, "amqplib": { @@ -277,11 +251,11 @@ "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", "requires": { - "bitsyntax": "0.0.4", - "bluebird": "3.5.1", + "bitsyntax": "~0.0.4", + "bluebird": "^3.4.6", "buffer-more-ints": "0.0.2", - "readable-stream": "1.1.14", - "safe-buffer": "5.1.1" + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "^5.0.1" }, "dependencies": { "isarray": { @@ -294,10 +268,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -307,41 +281,30 @@ } } }, - "ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" - }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "are-we-there-yet": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", - "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "array-flatten": { @@ -349,33 +312,6 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-index": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", - "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", - "requires": { - "debug": "2.6.9", - "es6-symbol": "3.1.1" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -397,7 +333,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.10" } }, "asynckit": { @@ -415,45 +351,13 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.7", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "backoff": { @@ -461,7 +365,7 @@ "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", "requires": { - "precond": "0.2.3" + "precond": "0.2" } }, "balanced-match": { @@ -485,7 +389,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "bcryptjs": { @@ -493,20 +397,6 @@ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "requires": { - "buffers": "0.1.1", - "chainsaw": "0.1.0" - } - }, - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" - }, "bitsyntax": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", @@ -516,20 +406,12 @@ } }, "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "requires": { - "readable-stream": "2.3.6", - "safe-buffer": "5.1.1" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.1.2.tgz", + "integrity": "sha512-DvC0x+PxmSJNx8wXoFV15pC2+GOJ3ohb4F1REq3X32a2Z3nEBpR1Guu740M7ouYAImFj4BXDNilLNZbygtG9lQ==", "requires": { - "inherits": "2.0.3" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, "bluebird": { @@ -548,15 +430,15 @@ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.2", + "http-errors": "~1.6.3", "iconv-lite": "0.4.23", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.2", "raw-body": "2.3.3", - "type-is": "1.6.16" + "type-is": "~1.6.16" } }, "bops": { @@ -580,14 +462,14 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "bson": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", - "integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", + "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==" }, "btoa": { "version": "1.1.2", @@ -599,47 +481,24 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.12" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" - }, "buffer-more-ints": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=" }, - "buffermaker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffermaker/-/buffermaker-1.2.0.tgz", - "integrity": "sha1-u3MlLsCIK3Y56bVWuCnav8LK4bo=", - "requires": { - "long": "1.1.2" - } - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - }, "bunyan": { "version": "1.8.12", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", "requires": { - "dtrace-provider": "0.8.7", - "moment": "2.22.2", - "mv": "2.1.1", - "safe-json-stringify": "1.2.0" + "dtrace-provider": "~0.8", + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" } }, "bytes": { @@ -651,14 +510,16 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true }, "camelize": { "version": "1.0.0", @@ -676,17 +537,17 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, "chai-http": { @@ -695,13 +556,13 @@ "integrity": "sha512-5j9LC1pl9jaPanux+wDm9D/V6R2xLfpixsRQhoJHxCR0E5KaiT0aL4544pVtYXN/wTUVSDTmwye5mCXkO/8b3w==", "dev": true, "requires": { - "@types/chai": "4.1.4", - "@types/superagent": "3.8.4", - "cookiejar": "2.1.2", - "is-ip": "2.0.0", - "methods": "1.1.2", - "qs": "6.5.2", - "superagent": "3.8.3" + "@types/chai": "4", + "@types/superagent": "^3.8.3", + "cookiejar": "^2.1.1", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.5.1", + "superagent": "^3.7.0" }, "dependencies": { "cookiejar": { @@ -725,9 +586,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "ip-regex": { @@ -742,7 +603,7 @@ "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", "dev": true, "requires": { - "ip-regex": "2.1.0" + "ip-regex": "^2.0.0" } }, "superagent": { @@ -751,67 +612,56 @@ "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.2", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.2", - "readable-stream": "2.3.6" + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" } } } }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "requires": { - "traverse": "0.3.9" - }, - "dependencies": { - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - } - } - }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { - "color-convert": "1.9.2" + "color-convert": "^1.9.0" } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } }, "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "charenc": { "version": "0.0.2", @@ -827,7 +677,8 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true }, "cldrjs": { "version": "0.4.8", @@ -838,14 +689,16 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, "co": { "version": "4.6.0", @@ -853,17 +706,19 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { - "color-name": "1.1.1" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "colors": { "version": "1.0.3", @@ -875,7 +730,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -895,32 +750,39 @@ "dev": true }, "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", "requires": { - "mime-db": "1.34.0" + "mime-db": ">= 1.36.0 < 2" }, "dependencies": { "mime-db": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", - "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=" + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" } } }, "compression": { - "version": "1.7.2", - "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", - "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "2.0.14", + "compressible": "~2.0.14", "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.2" + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, "concat-map": { @@ -928,17 +790,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -964,6 +815,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, "core-js": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", @@ -975,12 +832,12 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", - "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" + "object-assign": "^4", + "vary": "^1" } }, "cross-fetch": { @@ -997,9 +854,9 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypt": { @@ -1007,20 +864,12 @@ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.45" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "dasherize": { @@ -1042,7 +891,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.8" + "type-detect": "^4.0.0" } }, "deep-equal": { @@ -1058,32 +907,14 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1103,8 +934,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "dom-serializer": { @@ -1112,8 +944,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -1133,7 +965,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -1141,8 +973,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "dont-sniff-mimetype": { @@ -1156,15 +988,7 @@ "integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=", "optional": true, "requires": { - "nan": "2.10.0" - }, - "dependencies": { - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "optional": true - } + "nan": "^2.10.0" } }, "duplex": { @@ -1183,7 +1007,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -1211,7 +1035,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.23" + "iconv-lite": "~0.4.13" } }, "entities": { @@ -1219,46 +1043,17 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-symbol": "3.1.1" - } - }, "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" }, "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "4.2.4" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" + "es6-promise": "^4.0.3" } }, "escape-html": { @@ -1272,135 +1067,83 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.5.0.tgz", - "integrity": "sha512-m+az4vYehIJgl1Z0gb25KnFXeqQRdNreYsei1jdvkd9bB+UNQD3fsuiC2AWSQ56P+/t++kFSINZXFbfai+krOw==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.9.0.tgz", + "integrity": "sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0", - "ajv": "6.5.3", - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "4.0.0", - "eslint-utils": "1.3.1", - "eslint-visitor-keys": "1.0.0", - "espree": "4.0.0", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.7.0", - "ignore": "4.0.6", - "imurmurhash": "0.1.4", - "inquirer": "6.2.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "regexpp": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.5.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.3", - "text-table": "0.2.0" + "@babel/code-frame": "^7.0.0", + "ajv": "^6.5.3", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "imurmurhash": "^0.1.4", + "inquirer": "^6.1.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.12.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.0.2", + "text-table": "^0.2.0" }, "dependencies": { - "acorn-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", - "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", - "dev": true, - "requires": { - "acorn": "5.6.2" - } - }, "ajv": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", - "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.5.1", - "shebang-command": "1.2.0", - "which": "1.3.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", "dev": true, "requires": { - "ms": "2.0.0" - } - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "espree": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", - "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", - "dev": true, - "requires": { - "acorn": "5.6.2", - "acorn-jsx": "4.1.1" - } - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "requires": { - "chardet": "0.7.0", - "iconv-lite": "0.4.24", - "tmp": "0.0.33" + "ms": "^2.1.1" } }, "fast-deep-equal": { @@ -1409,98 +1152,33 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, - "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "3.0.3", - "figures": "2.0.0", - "lodash": "4.17.10", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "6.3.2", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "regexpp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", - "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==", + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "rxjs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.2.tgz", - "integrity": "sha512-hV7criqbR0pe7EeL3O66UYVg92IR0XsA97+9y+BWTePK9SKmEI5Qd3Zj6uPnGkNzXsBywBQWTvujPl+1Kn9Zjw==", - "dev": true, - "requires": { - "tslib": "1.9.3" - } - }, "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true - }, - "table": { - "version": "4.0.3", - "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "requires": { - "ajv": "6.5.3", - "ajv-keywords": "3.2.0", - "chalk": "2.4.1", - "lodash": "4.17.10", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" - } } } }, "eslint-config-loopback": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-loopback/-/eslint-config-loopback-11.0.0.tgz", - "integrity": "sha512-fojQS/3L4iB9+cutT6Usk3Bu2TOxNCXZqmd42dlt7DSsM21vbRnaNMsSnevoMtnNSKeCoXOChh4wfYjpUsx5WQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-loopback/-/eslint-config-loopback-12.0.0.tgz", + "integrity": "sha512-Pxz7ecK+/4ufJIMMtQ+XimQUP8qpM9IdVvIg78N17w6/PMBoFEeX1ef+ylb3c4BrAGcTzm+gb8VFtFW2JXoWKA==", "dev": true, "requires": { - "eslint-plugin-mocha": "4.12.1" + "eslint-plugin-mocha": "^4.11.0" } }, "eslint-plugin-mocha": { @@ -1509,16 +1187,17 @@ "integrity": "sha512-hxWtYHvLA0p/PKymRfDYh9Mxt5dYkg2Goy1vZDarTEEYfELP9ksga7kKG1NUKSQy27C8Qjc7YrSWTLUhOEOksA==", "dev": true, "requires": { - "ramda": "0.25.0" + "ramda": "^0.25.0" } }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-utils": { @@ -1530,15 +1209,18 @@ "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, "requires": { - "acorn": "5.6.2", - "acorn-jsx": "3.0.1" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -1550,16 +1232,18 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -1570,7 +1254,8 @@ "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "etag": { "version": "1.8.1", @@ -1587,13 +1272,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expect-ct": { @@ -1602,102 +1287,46 @@ "integrity": "sha512-ngXzTfoRGG7fYens3/RMb6yYoVLvLMfmsSllP/mZPxNHgFq41TmPSLF/nLY7fwoclI2vElvAmILFWGUYqdjfCg==" }, "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", - "body-parser": "1.18.2", + "body-parser": "1.18.3", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.16" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - } - } + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "statuses": { "version": "1.4.0", @@ -1712,13 +1341,25 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "extfs": { @@ -1727,7 +1368,7 @@ "integrity": "sha1-owgQ5HRZCg280NL0V63IkAnFwKs=", "dev": true, "requires": { - "underscore": "1.7.0" + "underscore": ">= 1.4 < 2" } }, "extsprintf": { @@ -1750,7 +1391,7 @@ "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.0.6.tgz", "integrity": "sha1-hv/4+GYjkaqBlyKGTWMuYD5u5gU=", "requires": { - "deep-equal": "1.0.1" + "deep-equal": "^1.0.1" } }, "fast-json-stable-stringify": { @@ -1761,23 +1402,31 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "feature-policy": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.2.0.tgz", + "integrity": "sha512-2hGrlv6efG4hscYVZeaYjpzpT6I2OZgYqE2yDUzeAcKj2D1SH0AsEzqJNXzdoglEddcIXQQYop3lD97XpG75Jw==" }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "finalhandler": { @@ -1786,12 +1435,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" }, "dependencies": { "statuses": { @@ -1802,14 +1451,15 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" } }, "forever-agent": { @@ -1822,9 +1472,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", "requires": { - "async": "2.6.1", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "async": "^2.0.1", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.11" } }, "formidable": { @@ -1853,40 +1503,18 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "g11n-pipeline": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/g11n-pipeline/-/g11n-pipeline-2.0.6.tgz", "integrity": "sha512-ykVjThha+dGKAR/F31kCUxMn7vu1JrmUkDxMs+h7TvjGbQoNx29hsw618GQKm9eT4Qo6E+8zJAnt0BT3gMtggQ==", "requires": { - "swagger-client": "3.8.6" - } - }, - "gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", - "requires": { - "ansi": "0.3.1", - "has-unicode": "2.0.1", - "lodash.pad": "4.5.1", - "lodash.padend": "4.6.1", - "lodash.padstart": "4.6.1" + "swagger-client": "^3.8.3" } }, "get-func-name": { @@ -1905,7 +1533,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -1913,12 +1541,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "globalize": { @@ -1926,31 +1554,20 @@ "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.3.0.tgz", "integrity": "sha1-xWUkuKz9LOONDJfd/c6zj2RLM5I=", "requires": { - "cldrjs": "0.4.8" + "cldrjs": "^0.4.6" } }, "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==" - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true }, "har-schema": { "version": "2.0.0", @@ -1962,27 +1579,24 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "he": { "version": "1.1.1", @@ -1991,15 +1605,17 @@ "dev": true }, "helmet": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.12.1.tgz", - "integrity": "sha512-/CsAcbPIHgiGde395IkHUZyRLW126RJ6AtxFy6Y6bxhd44Qq8cZ5BBFZ0xNUSbcgX57j32Emh3OhWz/0XgAB5Q==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.15.0.tgz", + "integrity": "sha512-j9JjtAnWJj09lqe/PEICrhuDaX30TeokXJ9tW6ZPhVH0+LMoihDeJ58CdWeTGzM66p6EiIODmgAaWfdeIWI4Gg==", "requires": { "dns-prefetch-control": "0.1.0", "dont-sniff-mimetype": "1.0.0", "expect-ct": "0.1.1", + "feature-policy": "0.2.0", "frameguard": "3.0.0", - "helmet-csp": "2.7.0", + "helmet-crossdomain": "0.3.0", + "helmet-csp": "2.7.1", "hide-powered-by": "1.0.0", "hpkp": "2.0.0", "hsts": "2.1.0", @@ -2009,15 +1625,19 @@ "x-xss-protection": "1.1.0" } }, + "helmet-crossdomain": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz", + "integrity": "sha512-YiXhj0E35nC4Na5EPE4mTfoXMf9JTGpN4OtB4aLqShKuH9d2HNaJX5MQoglO6STVka0uMsHyG5lCut5Kzsy7Lg==" + }, "helmet-csp": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.7.0.tgz", - "integrity": "sha512-IGIAkWnxjRbgMXFA2/kmDqSIrIaSfZ6vhMHlSHw7jm7Gm9nVVXqwJ2B1YEpYrJsLrqY+w2Bbimk7snux9+sZAw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.7.1.tgz", + "integrity": "sha512-sCHwywg4daQ2mY0YYwXSZRsgcCeerUwxMwNixGA7aMLkVmPTYBl7gJoZDHOZyXkqPrtuDT3s2B1A+RLI7WxSdQ==", "requires": { "camelize": "1.0.0", "content-security-policy-builder": "2.0.0", "dasherize": "2.0.0", - "lodash.reduce": "4.6.0", "platform": "1.3.5" } }, @@ -2041,12 +1661,12 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.2", - "domutils": "1.7.0", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, "http-errors": { @@ -2054,10 +1674,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" } }, "http-signature": { @@ -2065,23 +1685,23 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "http-status": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.2.0.tgz", - "integrity": "sha512-cSX+i/g4Kj5lkfOqS9w0SrxQF4hX7gsfikBtSDm5PFrAy+8fjRKk9+JRCG5cEZ40b6q6GOJk3P0QyDB5JpE0Ig==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.3.1.tgz", + "integrity": "sha512-PcI9NUm6EUOhHlaxYABCqDQQWS7IgoBZ/PmPkhuzj+oR01ffjv3EJfKnnWJZcUhILtUh6/NdJi1Zs/mIr6v8DA==" }, "httpntlm": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", "requires": { - "httpreq": "0.4.24", - "underscore": "1.7.0" + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" } }, "httpreq": { @@ -2094,7 +1714,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { @@ -2108,14 +1728,16 @@ "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "inflection": { "version": "1.12.0", @@ -2127,8 +1749,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2137,24 +1759,35 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", + "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } } }, "invert-kv": { @@ -2163,9 +1796,9 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, "is-buffer": { "version": "1.1.6", @@ -2175,38 +1808,20 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "requires": { - "is-path-inside": "1.0.1" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "1.0.2" - } + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true }, "is-stream": { "version": "1.1.0", @@ -2238,7 +1853,7 @@ "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-0.0.1.tgz", "integrity": "sha1-Am9ifgMrDNhBPsyHVZKLlKRosGI=", "requires": { - "form-data": "1.0.1" + "form-data": "^1.0.0-rc3" } }, "isstream": { @@ -2247,31 +1862,40 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "jayson": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-2.0.6.tgz", - "integrity": "sha512-ZIzF3DZ3ig9rNeOLUzGUbpxjOMqrfUX9a2H+3cmQHIGdBk8nZMEmHVZNXwxNYchgx6UnB/CFV+miFEfOjmMBmA==", - "requires": { - "JSONStream": "1.3.3", - "commander": "2.15.1", - "es6-promisify": "5.0.0", - "eyes": "0.1.8", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.10", - "uuid": "3.2.1" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-2.1.0.tgz", + "integrity": "sha512-WQhCph4BgSDbRUPdZYqGMojKMxjzPqCCKmWYMsRWX/Bvh1oP+Irs2upeEJy8flU3ZAZzm68TjuL1X8u9Rt4wWQ==", + "requires": { + "@types/node": "^10.3.5", + "JSONStream": "^1.3.1", + "commander": "^2.12.2", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.10", + "uuid": "^3.2.1" + }, + "dependencies": { + "@types/node": { + "version": "10.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.8.tgz", + "integrity": "sha512-INamyRZG4rW3lDCUmwVd5Xho/bXvQm/v1yP8V0UN1RuInU7RoWoaO570b+yLX4Ia/0szsx1wa8VzcsVlsvbWLA==" + } } }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "js2xmlparser": { @@ -2279,7 +1903,7 @@ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", "requires": { - "xmlcreate": "1.0.2" + "xmlcreate": "^1.0.1" } }, "jsbn": { @@ -2306,7 +1930,8 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -2329,46 +1954,12 @@ "verror": "1.10.0" } }, - "kafka-node": { - "version": "0.2.30", - "resolved": "https://registry.npmjs.org/kafka-node/-/kafka-node-0.2.30.tgz", - "integrity": "sha1-rDJRny9in/7GLuZoY5U8sZ9WyPo=", - "requires": { - "async": "1.5.2", - "binary": "0.3.0", - "buffer-crc32": "0.2.13", - "buffermaker": "1.2.0", - "debug": "2.6.9", - "lodash": "3.10.1", - "node-uuid": "1.4.8", - "node-zookeeper-client": "0.2.2", - "retry": "0.6.1", - "snappy": "4.1.2" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - } - } - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "ldap-filter": { @@ -2391,11 +1982,11 @@ "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.0.2.tgz", "integrity": "sha512-YoPHsyfV6L/4SO5EMi/Jk1xUMaY+ANlR4Yp+WIsqGkWOLPKkuzRYB4s/IsdKBeb3sdwVCw+q/YN9eoa1dXmQdA==", "requires": { - "@types/ldapjs": "1.0.3", - "@types/node": "7.0.65", - "bcryptjs": "2.4.3", - "ldapjs": "1.0.2", - "lru-cache": "4.1.3" + "@types/ldapjs": "^1.0.0", + "@types/node": "^7.0.21", + "bcryptjs": "^2.4.0", + "ldapjs": "^1.0.1", + "lru-cache": "^4.0.2" } }, "ldapjs": { @@ -2404,24 +1995,25 @@ "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", "requires": { "asn1": "0.2.3", - "assert-plus": "1.0.0", - "backoff": "2.5.0", - "bunyan": "1.8.12", - "dashdash": "1.14.1", - "dtrace-provider": "0.8.7", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "bunyan": "^1.8.3", + "dashdash": "^1.14.0", + "dtrace-provider": "~0.8", "ldap-filter": "0.2.2", - "once": "1.4.0", - "vasync": "1.6.4", - "verror": "1.10.0" + "once": "^1.4.0", + "vasync": "^1.6.4", + "verror": "^1.8.1" } }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "lodash": { @@ -2429,60 +2021,35 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, - "lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" - }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" - }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "long": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/long/-/long-1.1.2.tgz", - "integrity": "sha1-6u9ZUcp1UdlpJrgtokLbnWso+1M=" - }, "loopback": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/loopback/-/loopback-3.20.0.tgz", - "integrity": "sha512-fiXt6T5tIAqmGNO1AtuE7PVM1wDqCOhjPPEyLDHkhFG1PJJ0K2YrGrwFTWTRi1BcuxjFF7z+BcL9pQzQmwot6g==", - "requires": { - "async": "2.6.1", - "bcryptjs": "2.4.3", - "bluebird": "3.5.1", - "body-parser": "1.18.3", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/loopback/-/loopback-3.24.0.tgz", + "integrity": "sha512-eb5ls+OpEL+hKAllqlAf4pRkrG+yjCjFeYC6+qpqbmtTPGSRfgNi3+n1WPXIPd7JHgD7L4y6HXKv+2sZTy2qDQ==", + "requires": { + "async": "^2.0.1", + "bcryptjs": "^2.1.0", + "bluebird": "^3.1.1", + "body-parser": "^1.12.0", "canonical-json": "0.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "ejs": "2.6.1", - "express": "4.16.3", - "inflection": "1.12.0", - "isemail": "2.2.1", - "loopback-connector-remote": "3.3.1", - "loopback-datasource-juggler": "3.21.1", - "loopback-filters": "1.0.0", - "loopback-phase": "3.2.0", - "nodemailer": "4.6.6", - "nodemailer-direct-transport": "3.3.2", - "nodemailer-stub-transport": "1.1.0", - "serve-favicon": "2.5.0", - "stable": "0.1.8", - "strong-globalize": "4.1.1", - "strong-remoting": "3.12.0", + "debug": "^2.1.2", + "depd": "^1.0.0", + "ejs": "^2.3.1", + "express": "^4.14.0", + "inflection": "^1.6.0", + "isemail": "^2.2.1", + "loopback-connector-remote": "^3.0.0", + "loopback-datasource-juggler": "^3.28.0", + "loopback-filters": "^1.0.0", + "loopback-phase": "^3.0.0", + "nodemailer": "^4.0.1", + "nodemailer-direct-transport": "^3.3.2", + "nodemailer-stub-transport": "^1.1.0", + "serve-favicon": "^2.2.0", + "stable": "^0.1.5", + "strong-globalize": "^4.1.1", + "strong-remoting": "^3.11.0", "uid2": "0.0.3", - "underscore.string": "3.3.4" + "underscore.string": "^3.0.3" } }, "loopback-boot": { @@ -2490,13 +2057,13 @@ "resolved": "https://registry.npmjs.org/loopback-boot/-/loopback-boot-2.27.1.tgz", "integrity": "sha512-8w1EYcQCPwUrs5iplJv0iHMzmvfBRDRxsO40ladB8TL4Jat6jXfOaE0zAm1/9gh9pMCstHh01Nr52GpfCIHGZA==", "requires": { - "async": "0.9.2", + "async": "~0.9.0", "commondir": "0.0.1", - "debug": "2.6.9", - "lodash": "4.17.10", - "semver": "4.3.6", - "strong-globalize": "2.10.0", - "toposort": "0.2.12" + "debug": "^2.0.0", + "lodash": "^4.17.5", + "semver": "^4.1.0", + "strong-globalize": "^2.6.2", + "toposort": "^0.2.10" }, "dependencies": { "async": { @@ -2514,22 +2081,22 @@ "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-2.10.0.tgz", "integrity": "sha512-g2nNtA6YKBDXhIe6TC/b0lInge8WxcAlFss9OKNGiUHUlOkhIdBHn9AGMLVbKyfI9T8ijEBATcwFIPayWUpOdQ==", "requires": { - "async": "1.5.2", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.6", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" + "async": "^1.5.2", + "debug": "^3.1.0", + "esprima": "^4.0.0", + "estraverse": "^4.2.0", + "g11n-pipeline": "^2.0.1", + "htmlparser2": "^3.9.0", + "lodash": "^4.15.0", + "md5": "^2.0.0", + "mkdirp": "^0.5.1", + "mktmpdir": "^0.1.1", + "optional": "^0.1.3", + "os-locale": "^2.1.0", + "posix-getopt": "^1.2.0", + "word-count": "^0.2.1", + "xtend": "^4.0.1", + "yamljs": "^0.3.0" }, "dependencies": { "async": { @@ -2550,51 +2117,29 @@ } }, "loopback-component-explorer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/loopback-component-explorer/-/loopback-component-explorer-6.0.1.tgz", - "integrity": "sha512-1PGhwqDr5NON9OmLY3y4TUcwvENk2QPMiUcsYEW/HQdw8FBlSfBXAXZBCWpVinvrxRyQbWTk5rVqWS9CPbKmTQ==", - "requires": { - "debug": "2.6.9", - "lodash": "4.17.10", - "loopback-swagger": "5.5.0", - "strong-globalize": "3.3.0", - "swagger-ui": "2.2.10" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/loopback-component-explorer/-/loopback-component-explorer-6.3.1.tgz", + "integrity": "sha512-BQRbZaHPJmflq67VjAavfM/NpRI1p8B4NJtTwf+olwjq51dnPuTAhOOF5kgy6LTo+2PFCi/mK5dIoApHHMXRRw==", + "requires": { + "debug": "^3.1.0", + "lodash": "^4.17.5", + "loopback-swagger": "^5.0.0", + "strong-globalize": "^4.1.1", + "swagger-ui": "^2.2.5" }, "dependencies": { - "strong-globalize": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", - "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "accept-language": "3.0.18", - "async": "2.6.1", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.6", - "globalize": "1.3.0", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -2603,7 +2148,7 @@ "resolved": "https://registry.npmjs.org/loopback-component-model-diagram/-/loopback-component-model-diagram-0.4.2.tgz", "integrity": "sha512-354GqYUrkJe2t7b9aE56nwneUu3thL7cZwsPDLSkzUT+MigUioZciS+SjOqiZ9WChq6f/P2JzPoz2nEenv11PQ==", "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.10" } }, "loopback-component-mq": { @@ -2639,52 +2184,16 @@ } }, "loopback-component-passport": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/loopback-component-passport/-/loopback-component-passport-3.8.1.tgz", - "integrity": "sha1-qKw969A2pGAU7o7zIe4QWgEfpsE=", - "requires": { - "passport": "0.4.0", - "strong-globalize": "2.10.0", - "underscore": "1.9.1", - "uuid": "3.2.1" + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/loopback-component-passport/-/loopback-component-passport-3.10.0.tgz", + "integrity": "sha1-rJ1tPt2HdCFuAeTzYbe77mvlHoQ=", + "requires": { + "passport": "^0.4.0", + "strong-globalize": "^4.1.1", + "underscore": "^1.9.1", + "uuid": "^3.2.1" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "strong-globalize": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-2.10.0.tgz", - "integrity": "sha512-g2nNtA6YKBDXhIe6TC/b0lInge8WxcAlFss9OKNGiUHUlOkhIdBHn9AGMLVbKyfI9T8ijEBATcwFIPayWUpOdQ==", - "requires": { - "async": "1.5.2", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.6", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - } - }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", @@ -2697,230 +2206,106 @@ "resolved": "https://registry.npmjs.org/loopback-component-visualizer/-/loopback-component-visualizer-1.2.1.tgz", "integrity": "sha1-45hAfSeKkic6bYI7KNhlJDy5ew0=", "requires": { - "lodash": "4.17.10" + "lodash": "^4.12.0" } }, "loopback-connector": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-4.4.0.tgz", - "integrity": "sha1-FRNlMolredjcKAvifWV/rQAMEgk=", - "requires": { - "async": "2.6.1", - "bluebird": "3.5.1", - "debug": "3.1.0", - "msgpack5": "3.6.0", - "strong-globalize": "3.3.0", - "uuid": "3.2.1" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-4.5.1.tgz", + "integrity": "sha512-tgpOUIW7gPUHlp6yH0u8RSjl4zBmmRZCFy4dWrriniz8IadF5bSo06LOVTOJRtrsbuW8163d0o8W1dNKG7XDfA==", + "requires": { + "async": "^2.1.5", + "bluebird": "^3.4.6", + "debug": "^3.1.0", + "msgpack5": "^4.2.0", + "strong-globalize": "^4.1.1", + "uuid": "^3.0.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "strong-globalize": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", - "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", - "requires": { - "accept-language": "3.0.18", - "async": "2.6.1", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.6", - "globalize": "1.3.0", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - } + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, - "loopback-connector-kafka": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/loopback-connector-kafka/-/loopback-connector-kafka-0.2.1.tgz", - "integrity": "sha1-oRn7iqBmJzGMRlvsgX+nPbo43sE=", - "requires": { - "kafka-node": "0.2.30" - } - }, "loopback-connector-mongodb": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/loopback-connector-mongodb/-/loopback-connector-mongodb-3.4.4.tgz", - "integrity": "sha1-8EEpc3ytRfd+BKN7ppsmwnsjw18=", - "requires": { - "async": "2.6.1", - "bson": "1.0.9", - "debug": "3.1.0", - "loopback-connector": "4.4.0", - "mongodb": "3.0.10", - "strong-globalize": "3.3.0" + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/loopback-connector-mongodb/-/loopback-connector-mongodb-3.9.2.tgz", + "integrity": "sha512-M5XGqvvchfoXjJUAcO8hRpLiAyZ0Uef4/yu4cXnpk4SGXrSgu01wNo3pYmnXESzs6l6I1fXRwkQppOn+rfaFuQ==", + "requires": { + "async": "^2.6.1", + "bson": "^1.0.6", + "debug": "^3.1.0", + "loopback-connector": "^4.5.0", + "mongodb": "^3.1.4", + "strong-globalize": "^4.1.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "strong-globalize": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", - "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", - "requires": { - "accept-language": "3.0.18", - "async": "2.6.1", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.6", - "globalize": "1.3.0", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - } + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "loopback-connector-remote": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loopback-connector-remote/-/loopback-connector-remote-3.3.1.tgz", - "integrity": "sha512-GBX/v8ixXuwWS3LoDjJWR64aF82IEbGnFZ1dpAc2pSpYf/gyDLN6IN6UvfIKt4uda9u+OKsLsOh3dxCBDmjGWA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/loopback-connector-remote/-/loopback-connector-remote-3.4.0.tgz", + "integrity": "sha512-NVGqeg8w22SW8PpRpGg8rX28lrpkCSc+dLXNhRK30c4V+ydRKgVfpAaRoJATTEqR00HNlykLR+AD21Oe/fMJcA==", "requires": { - "eslint": "4.19.1", - "loopback-datasource-juggler": "3.21.1", - "strong-remoting": "3.12.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "concat-stream": "1.6.2", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.4", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.5.0", - "ignore": "3.3.8", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "regexpp": "1.1.0", - "require-uncached": "1.0.3", - "semver": "5.5.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" - } - } + "loopback-datasource-juggler": "^3.0.0", + "strong-remoting": "^3.0.0" } }, "loopback-datasource-juggler": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-3.21.1.tgz", - "integrity": "sha512-8wIVdQjt86CCZykHUVn69yvdQIpRqZel4Mfk41F0qnkEPMi7x2/IdS11Y7q6fnn4wKy5sdBMVOwpPX7LTaA/zQ==", - "requires": { - "async": "2.6.1", - "bluebird": "3.5.1", - "debug": "3.1.0", - "depd": "1.1.2", - "inflection": "1.12.0", - "lodash": "4.17.10", - "loopback-connector": "4.4.0", - "minimatch": "3.0.4", - "qs": "6.5.2", - "shortid": "2.2.8", - "strong-globalize": "3.3.0", - "traverse": "0.6.6", - "uuid": "3.2.1" + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-3.28.0.tgz", + "integrity": "sha512-0bo0Jv/pnYHu1J1oeKiHn0Dol5cxeOAyTbXGiQG/b51D17F485A8/jDkaoXPp4TQf+MohY3lrnzeS6I3XvErJQ==", + "requires": { + "async": "^2.6.0", + "bluebird": "^3.1.1", + "debug": "^3.1.0", + "depd": "^1.0.0", + "inflection": "^1.6.0", + "lodash": "^4.17.4", + "loopback-connector": "^4.4.0", + "minimatch": "^3.0.3", + "qs": "^6.5.0", + "shortid": "^2.2.6", + "strong-globalize": "^4.1.1", + "traverse": "^0.6.6", + "uuid": "^3.0.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "strong-globalize": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", - "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", - "requires": { - "accept-language": "3.0.18", - "async": "2.6.1", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.6", - "globalize": "1.3.0", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - } + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -2934,7 +2319,7 @@ "resolved": "https://registry.npmjs.org/loopback-ds-timestamp-mixin/-/loopback-ds-timestamp-mixin-3.4.1.tgz", "integrity": "sha1-qw8N8AmzRvB573GkHEgxANLqayc=", "requires": { - "debug": "2.6.9" + "debug": "^2.6.1" } }, "loopback-filters": { @@ -2942,85 +2327,73 @@ "resolved": "https://registry.npmjs.org/loopback-filters/-/loopback-filters-1.0.0.tgz", "integrity": "sha512-uFQQLfj4T27CM6dzlWMH6aF1lf/Qj97VmXMlVnNWcG+Pd8R8ZbU4i/shArYXArXfis+ICD80YadrPbf9DYRbOA==", "requires": { - "debug": "3.1.0" + "debug": "^3.1.0" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "loopback-phase": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loopback-phase/-/loopback-phase-3.2.0.tgz", - "integrity": "sha512-hqN72kDWuuZkT0jYtTpp6giNmkvbe6zAmIGeqA/5dIXNAzdSzNsUjvzzSOeTax82QJ+VkvNyMad4dmd3KbI+fQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/loopback-phase/-/loopback-phase-3.3.0.tgz", + "integrity": "sha512-0NAMtZ2P7VHtW2vgADmDFzFCeniCJwL4I3AdAxX5Ds8IFDQNbnRFnBQSvg+F50HcB7ZkKmR5gtOxtr7bXbqaAQ==", "requires": { - "async": "2.6.1", - "debug": "3.1.0", - "strong-globalize": "4.1.1" + "async": "^2.6.1", + "debug": "^3.1.0", + "strong-globalize": "^4.1.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "loopback-swagger": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/loopback-swagger/-/loopback-swagger-5.5.0.tgz", - "integrity": "sha512-KSjZNl57+GfjpWBiPtilHJgOqu1HEHPzHQrLKnaa3hKf0qM6UuRrijwTIfu5YoXcZkSuZxGMlFgTikofPvQynQ==", - "requires": { - "async": "2.6.1", - "debug": "2.6.9", - "ejs": "2.6.1", - "lodash": "4.17.10", - "strong-globalize": "3.3.0" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/loopback-swagger/-/loopback-swagger-5.7.1.tgz", + "integrity": "sha512-jjGFP/dI/VVkuhRJjbysnmos1Jd1ILRY+PvbyfcKapCuZNt1rrPjlX1htP4sTsuGK/SUZuH6fsZiBG7Ppyi2FQ==", + "requires": { + "async": "^2.1.4", + "debug": "^3.1.0", + "ejs": "^2.5.5", + "lodash": "^4.17.2", + "strong-globalize": "^4.1.1" }, "dependencies": { - "strong-globalize": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-3.3.0.tgz", - "integrity": "sha512-WrCZPABG/c4e55aH9S1mIW4054YL492cFwJFoF1WZZsJQ39gBYgGjdccTYI5Kj6uTlXH5hjepCQfwE5gCHJnKQ==", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "accept-language": "3.0.18", - "async": "2.6.1", - "debug": "3.1.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "g11n-pipeline": "2.0.6", - "globalize": "1.3.0", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "mktmpdir": "0.1.1", - "optional": "0.1.4", - "os-locale": "2.1.0", - "posix-getopt": "1.2.0", - "word-count": "0.2.2", - "xtend": "4.0.1", - "yamljs": "0.3.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -3029,8 +2402,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "machina": { @@ -3038,7 +2411,7 @@ "resolved": "https://registry.npmjs.org/machina/-/machina-2.0.2.tgz", "integrity": "sha512-9U9g4eQjQ2JARX7h/051r65EQEfFfpPxoSjVmUMJG6gnfjVjM+rjwVLoq7Z9NovjYm7AR3oTWWPtHVlgeSZzYw==", "requires": { - "lodash": "3.10.1" + "lodash": "3.x" }, "dependencies": { "lodash": { @@ -3053,9 +2426,9 @@ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.6" + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" } }, "media-typer": { @@ -3068,9 +2441,15 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, + "memory-pager": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz", + "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==", + "optional": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -3096,7 +2475,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -3109,7 +2488,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3130,7 +2509,7 @@ "resolved": "https://registry.npmjs.org/mktmpdir/-/mktmpdir-0.1.1.tgz", "integrity": "sha1-OKyCCVDXjvoLnN38A/99XFp4bbk=", "requires": { - "rimraf": "2.2.8" + "rimraf": "~2.2.8" }, "dependencies": { "rimraf": { @@ -3192,7 +2571,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -3203,28 +2582,45 @@ "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" }, "moment-timezone": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.17.tgz", - "integrity": "sha512-Y/JpVEWIOA9Gho4vO15MTnW1FCmHi3ypprrkUaxsZ1TKg3uqC8q/qMBjTddkHoiwwZN3qvZSr4zJP7x9V3LpXA==", + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.23.tgz", + "integrity": "sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==", "requires": { - "moment": "2.22.2" + "moment": ">= 2.9.0" } }, "mongodb": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.10.tgz", - "integrity": "sha512-jy9s4FgcM4rl8sHNETYHGeWcuRh9AlwQCUuMiTj041t/HD02HwyFgmm2VZdd9/mA9YNHaUJLqj0tzBx2QFivtg==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.9.tgz", + "integrity": "sha512-f+Og32wK/ovzVlC1S6Ft7yjVTvNsAOs6pBpDrPd2/3wPO9ijNsQrTNntuECjOSxGZpPVl0aRqgHzF1e9e+KvnQ==", "requires": { - "mongodb-core": "3.0.9" + "mongodb-core": "3.1.8", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, "mongodb-core": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.9.tgz", - "integrity": "sha512-buOWjdLLBlEqjHDeHYSXqXx173wHMVp7bafhdHxSjxWdB9V6Ri4myTqxjYZwL/eGFZxvd8oRQSuhwuIDbaaB+g==", - "requires": { - "bson": "1.0.9", - "require_optional": "1.0.1" + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.8.tgz", + "integrity": "sha512-reWCqIRNehyuLaqaz5JMOmh3Xd8JIjNX34o8mnewXLK2Fyt/Ky6BZbU+X0OPzy8qbX+JZrOtnuay7ASCieTYZw==", + "requires": { + "bson": "^1.1.0", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, "monologue.js": { @@ -3232,7 +2628,7 @@ "resolved": "https://registry.npmjs.org/monologue.js/-/monologue.js-0.3.5.tgz", "integrity": "sha1-IM5RQ9ZegqOh91rakUfFJIeRSWk=", "requires": { - "lodash": "3.10.1", + "lodash": "3.x", "riveter": "0.2.0" }, "dependencies": { @@ -3253,7 +2649,7 @@ "resolved": "https://registry.npmjs.org/msgpack-js/-/msgpack-js-0.3.0.tgz", "integrity": "sha1-Aw7AjFlW+cp9F9QKVy1Tlv7BCSM=", "requires": { - "bops": "0.0.7" + "bops": "~0.0.6" }, "dependencies": { "base64-js": { @@ -3290,33 +2686,41 @@ } }, "msgpack5": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/msgpack5/-/msgpack5-3.6.0.tgz", - "integrity": "sha512-6HuCZHA57WtNUzrKIvjJ8OMxigzveJ6D5i13y6TsgGu3X3zxABpuBvChpppOoGdB9SyWZcmqUs1fwUV/PpSQ7Q==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/msgpack5/-/msgpack5-4.2.1.tgz", + "integrity": "sha512-Xo7nE9ZfBVonQi1rSopNAqPdts/QHyuSEUwIEzAkB+V2FtmkkLUbP6MyVqVVQxsZYI65FpvW3Bb8Z9ZWEjbgHQ==", "requires": { - "bl": "1.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "safe-buffer": "5.1.1" + "bl": "^2.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.3.6", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true }, "mux-demux": { "version": "3.7.9", "resolved": "https://registry.npmjs.org/mux-demux/-/mux-demux-3.7.9.tgz", "integrity": "sha1-NTZ3GP02AcgLzi63YlMVdtekrO8=", "requires": { - "duplex": "1.0.0", - "json-buffer": "2.0.11", - "msgpack-stream": "0.0.13", + "duplex": "~1.0.0", + "json-buffer": "~2.0.4", + "msgpack-stream": "~0.0.10", "stream-combiner": "0.0.2", - "stream-serializer": "1.1.2", - "through": "2.3.8", - "xtend": "1.0.3" + "stream-serializer": "~1.1.1", + "through": "~2.3.1", + "xtend": "~1.0.3" }, "dependencies": { "xtend": { @@ -3332,9 +2736,9 @@ "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", "optional": true, "requires": { - "mkdirp": "0.5.1", - "ncp": "2.0.0", - "rimraf": "2.4.5" + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" }, "dependencies": { "glob": { @@ -3343,11 +2747,11 @@ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "optional": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "rimraf": { @@ -3356,20 +2760,27 @@ "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", "optional": true, "requires": { - "glob": "6.0.4" + "glob": "^6.0.1" } } } }, "nan": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", - "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=" + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "optional": true + }, + "nanoid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.0.0.tgz", + "integrity": "sha512-SG2qscLE3iM4C0CNzGrsAojJHSVHMS1J8NnvJ31P1lH8P0hGHOiafmniNJz6w6q7vuoDlV7RdySlJgtqkFEVtQ==" }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, "ncp": { "version": "2.0.0", @@ -3382,11 +2793,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -3403,93 +2809,14 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "node-gyp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.2.1.tgz", - "integrity": "sha1-9d1WmXClCEZMw8Fdfp6NLehjjdU=", - "requires": { - "fstream": "1.0.11", - "glob": "4.5.3", - "graceful-fs": "4.1.11", - "minimatch": "1.0.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "1.2.1", - "osenv": "0.1.5", - "path-array": "1.0.1", - "request": "2.87.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "2.2.1", - "which": "1.3.1" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" - }, - "dependencies": { - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "requires": { - "brace-expansion": "1.1.11" - } - } - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", - "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - } - } - }, - "node-zookeeper-client": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/node-zookeeper-client/-/node-zookeeper-client-0.2.2.tgz", - "integrity": "sha1-CXvaAZme749gLOBotjJgAGnb9oU=", - "requires": { - "async": "0.2.10", - "underscore": "1.4.4" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" - } + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "nodemailer": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.6.tgz", - "integrity": "sha512-sIcM/Do0XBJmu7ruENLoR+4TCk0B4C1ftqRjWrVeoez9Dt23SmL9bXKqswVqyxuT/RdK8TKWciZvxHykerXCRw==" + "version": "4.6.8", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.8.tgz", + "integrity": "sha512-A3s7EM/426OBIZbLHXq2KkgvmKbn2Xga4m4G+ZUA4IaZvG8PcZXrFh+2E4VaS2o+emhuUVRnzKN2YmpkXQ9qwA==" }, "nodemailer-direct-transport": { "version": "3.3.2", @@ -3518,30 +2845,12 @@ "resolved": "https://registry.npmjs.org/nodemailer-stub-transport/-/nodemailer-stub-transport-1.1.0.tgz", "integrity": "sha1-EUIdLWa07m9AU1T5FMH0ZB6ySw0=" }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1.1.1" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" - } - }, - "npmlog": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", - "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", - "requires": { - "ansi": "0.3.1", - "are-we-there-yet": "1.0.6", - "gauge": "1.2.7" + "path-key": "^2.0.0" } }, "oauth": { @@ -3577,15 +2886,16 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "optimist": { @@ -3594,8 +2904,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { @@ -3615,13 +2925,14 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "options": { @@ -3629,34 +2940,21 @@ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-finally": { "version": "1.0.0", @@ -3673,19 +2971,19 @@ "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", "requires": { - "passport-strategy": "1.0.0", + "passport-strategy": "1.x.x", "pause": "0.0.1" } }, "passport-ldapauth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.0.0.tgz", - "integrity": "sha1-Qt/wBEFxhdCk2fd2o+7Y1HMf1ok=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.1.0.tgz", + "integrity": "sha512-znZdKW4f1bn4F8MRMzHog8fauSZictsC4GlOTs7ks4pL6HSSFuIZdxr/pnYkRJG+dmdLOqzOBXeFXZJIg4CFQg==", "requires": { - "@types/node": "7.0.65", - "@types/passport": "0.3.5", - "ldapauth-fork": "4.0.2", - "passport-strategy": "1.0.0" + "@types/node": "^7.0.23", + "@types/passport": "^0.4.6", + "ldapauth-fork": "^4.0.1", + "passport-strategy": "^1.0.0" } }, "passport-local": { @@ -3693,7 +2991,7 @@ "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", "requires": { - "passport-strategy": "1.0.0" + "passport-strategy": "1.x.x" } }, "passport-openidconnect": { @@ -3701,10 +2999,10 @@ "resolved": "https://registry.npmjs.org/passport-openidconnect/-/passport-openidconnect-0.0.2.tgz", "integrity": "sha1-5Ij4vbOGyan9OckdWrjIgBVugVM=", "requires": { - "oauth": "0.9.15", - "passport-strategy": "1.0.0", - "request": "2.87.0", - "webfinger": "0.4.2" + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "request": "^2.75.0", + "webfinger": "0.4.x" } }, "passport-strategy": { @@ -3712,14 +3010,6 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" }, - "path-array": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", - "integrity": "sha1-fi8PNfB6IBUSK4aLfqwOssT+wnE=", - "requires": { - "array-index": "1.0.0" - } - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3728,7 +3018,8 @@ "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "path-key": { "version": "2.0.1", @@ -3756,24 +3047,6 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - } - }, "platform": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", @@ -3782,7 +3055,8 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true }, "posix-getopt": { "version": "1.2.0", @@ -3794,7 +3068,7 @@ "resolved": "https://registry.npmjs.org/postal/-/postal-2.0.5.tgz", "integrity": "sha1-f58DWUOiTaqZY6xaU7XQzwffJLk=", "requires": { - "lodash": "4.17.10" + "lodash": "^4.12.0" } }, "precond": { @@ -3805,7 +3079,8 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true }, "process-nextick-args": { "version": "2.0.0", @@ -3813,17 +3088,18 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "dev": true }, "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.6.0" + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" } }, "pseudomap": { @@ -3855,16 +3131,16 @@ "version": "https://github.com/fullcube/rabbot/tarball/bbd6343777f8f341d592711e8e2bf23fe2ad76f5", "integrity": "sha512-FB6koa2jnLbzVutyokovM/OuvVApUwnNwIC+JJjEXDF7cGUIjaG52VThZGaPwKBVUysf2rbOk0exATqgvYFEZQ==", "requires": { - "amqplib": "0.5.2", - "bluebird": "3.5.1", - "bluebird-defer": "1.0.0", - "debug": "2.6.9", - "lodash": "4.17.10", - "machina": "2.0.2", - "monologue.js": "0.3.5", - "postal": "2.0.5", - "uuid": "3.2.1", - "whistlepunk": "0.3.3" + "amqplib": "~0.5.1", + "bluebird": "^3.5.0", + "bluebird-defer": "^1.0.0", + "debug": "^2.2.0", + "lodash": "^4.15.0", + "machina": "^2.0.0", + "monologue.js": "^0.3.5", + "postal": "^2.0.5", + "uuid": "^3.0.0", + "whistlepunk": "^0.3.2" } }, "ramda": { @@ -3894,13 +3170,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "referrer-policy": { @@ -3914,35 +3190,36 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true }, "request": { "version": "2.87.0", "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.1", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" }, "dependencies": { "form-data": { @@ -3950,9 +3227,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } } } @@ -3961,9 +3238,10 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "require_optional": { @@ -3971,8 +3249,8 @@ "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", "requires": { - "resolve-from": "2.0.0", - "semver": "5.5.0" + "resolve-from": "^2.0.0", + "semver": "^5.1.0" }, "dependencies": { "resolve-from": { @@ -3985,28 +3263,26 @@ "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, - "retry": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz", - "integrity": "sha1-/ckO7ZQ/3hG4k1VLjMY9DombqRg=" - }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "riveter": { @@ -4014,7 +3290,7 @@ "resolved": "https://registry.npmjs.org/riveter/-/riveter-0.2.0.tgz", "integrity": "sha1-H3yOhlxFURX95ZS+JLAHLr3IvuQ=", "requires": { - "lodash": "2.4.2" + "lodash": "^2.4.1" }, "dependencies": { "lodash": { @@ -4028,21 +3304,9 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "requires": { - "rx-lite": "4.0.8" + "is-promise": "^2.1.0" } }, "rxjs": { @@ -4070,6 +3334,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "saslprep": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", + "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -4086,18 +3359,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { "statuses": { @@ -4112,10 +3385,10 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", "requires": { - "etag": "1.8.1", + "etag": "~1.8.1", "fresh": "0.5.2", "ms": "2.1.1", - "parseurl": "1.3.2", + "parseurl": "~1.3.2", "safe-buffer": "5.1.1" }, "dependencies": { @@ -4131,9 +3404,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -4147,7 +3420,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -4156,14 +3429,12 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shortid": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", - "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + "version": "2.2.14", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.14.tgz", + "integrity": "sha512-4UnZgr9gDdA1kaKj/38IiudfC3KHKhDc1zi/HSxd9FQDR0VLwH3/y79tZJLsVYPsJgIjeHjqIWaWVRJUj9qZOQ==", + "requires": { + "nanoid": "^2.0.0" + } }, "signal-exit": { "version": "3.0.2", @@ -4174,8 +3445,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" } }, "smtp-connection": { @@ -4187,14 +3459,13 @@ "nodemailer-shared": "1.1.0" } }, - "snappy": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/snappy/-/snappy-4.1.2.tgz", - "integrity": "sha1-jN2cAIK5sF8VfsVv2RLBd0QBQps=", + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, "requires": { - "bindings": "1.2.1", - "nan": "2.2.0", - "node-gyp": "3.2.1" + "memory-pager": "^1.0.2" } }, "sprintf-js": { @@ -4215,15 +3486,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "stable": { @@ -4246,7 +3517,7 @@ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.2.tgz", "integrity": "sha1-3+DnRnV0JWXnbGBWeI6lwjvZfbQ=", "requires": { - "duplexer": "0.0.4" + "duplexer": "~0.0.3" } }, "stream-serializer": { @@ -4258,9 +3529,10 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string_decoder": { @@ -4268,21 +3540,23 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true } } }, @@ -4294,28 +3568,35 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "strong-error-handler": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-3.1.0.tgz", - "integrity": "sha1-yoXnpnB6xxcBFdOIEOorFgib74U=", - "requires": { - "accepts": "1.3.5", - "debug": "3.1.0", - "ejs": "2.6.1", - "http-status": "1.2.0", - "js2xmlparser": "3.0.0", - "strong-globalize": "4.1.1" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-3.2.0.tgz", + "integrity": "sha512-WBU5itMkVPoEPf1W3ptb0AjtPvRWabDzVO4Lcy8MbJQUbo8vdWngLAcNQptQovdFoMGLgQAgJzZkelm6FRADuQ==", + "requires": { + "@types/express": "^4.16.0", + "accepts": "^1.3.3", + "debug": "^3.1.0", + "ejs": "^2.6.1", + "http-status": "^1.1.2", + "js2xmlparser": "^3.0.0", + "strong-globalize": "^4.1.0" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -4324,14 +3605,14 @@ "resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-4.1.1.tgz", "integrity": "sha512-WeuQM1oXEiFppxgqYn4bU5L7J6MjE5LPfmCtCrrs8DnGNLlXoRX0n3ZgTqw/CaG6Hcj4LPB/egBGOk3Dew7j0g==", "requires": { - "accept-language": "3.0.18", - "debug": "3.1.0", - "globalize": "1.3.0", - "lodash": "4.17.10", - "md5": "2.2.1", - "mkdirp": "0.5.1", - "os-locale": "2.1.0", - "yamljs": "0.3.0" + "accept-language": "^3.0.18", + "debug": "^3.1.0", + "globalize": "^1.3.0", + "lodash": "^4.17.4", + "md5": "^2.2.1", + "mkdirp": "^0.5.1", + "os-locale": "^2.0.0", + "yamljs": "^0.3.0" }, "dependencies": { "debug": { @@ -4345,124 +3626,131 @@ } }, "strong-remoting": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/strong-remoting/-/strong-remoting-3.12.0.tgz", - "integrity": "sha512-GNH0Uz+sChRDhZe8KSSQ4DlLf385bLUmNGpTVqhZrYuuQV7TTYYYPx0aJ1sRXluJyxgmV95WlkW6yxkAft/ijg==", - "requires": { - "async": "2.6.1", - "body-parser": "1.18.3", - "debug": "3.1.0", - "depd": "1.1.2", - "escape-string-regexp": "1.0.5", - "eventemitter2": "5.0.1", - "express": "4.16.3", - "inflection": "1.12.0", - "jayson": "2.0.6", - "js2xmlparser": "3.0.0", - "loopback-datatype-geopoint": "1.0.0", - "loopback-phase": "3.2.0", - "mux-demux": "3.7.9", - "qs": "6.5.2", - "request": "2.87.0", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/strong-remoting/-/strong-remoting-3.13.1.tgz", + "integrity": "sha512-RW3PuYpNsjdyBx4KqpCQBEJqmwNjJ1xwjBoodQzP7eDuyCsbxzvlkNfqviEYWe0xdKeewG6u818V0OPHN0jsvQ==", + "requires": { + "async": "^2.0.1", + "body-parser": "^1.12.4", + "debug": "^3.1.0", + "depd": "^1.1.0", + "escape-string-regexp": "^1.0.5", + "eventemitter2": "^5.0.1", + "express": "4.x", + "inflection": "^1.7.1", + "jayson": "^2.0.5", + "js2xmlparser": "^3.0.0", + "loopback-datatype-geopoint": "^1.0.0", + "loopback-phase": "^3.1.0", + "mux-demux": "^3.7.9", + "qs": "^6.2.1", + "request": "^2.83.0", "sse": "0.0.8", - "strong-globalize": "4.1.1", - "traverse": "0.6.6", - "xml2js": "0.4.19" + "strong-error-handler": "^3.0.0", + "strong-globalize": "^4.1.0", + "traverse": "^0.6.6", + "xml2js": "^0.4.8" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, - "supertest": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.1.0.tgz", - "integrity": "sha512-O44AMnmJqx294uJQjfUmEyYOg7d9mylNFsMw/Wkz4evKd1njyPrtCN+U6ZIC7sKtfEVQhfTqFFijlXx8KP/Czw==", + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", "dev": true, "requires": { - "methods": "1.1.2", - "superagent": "3.8.2" + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" }, "dependencies": { - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "superagent": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", - "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.2", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.2", - "readable-stream": "2.3.6" - } + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, + "supertest": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.3.0.tgz", + "integrity": "sha512-dMQSzYdaZRSANH5LL8kX3UpgK9G1LRh/jnggs/TI0W2Sz7rkMx9Y48uia3K9NgcaWEV28tYkBnXE4tiFC77ygQ==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^3.8.3" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "swagger-client": { "version": "3.8.6", "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.8.6.tgz", "integrity": "sha1-TxiDhEkYwNEjgC1bThBp/jRCUlQ=", "requires": { - "@kyleshockey/object-assign-deep": "0.4.2", - "babel-runtime": "6.26.0", + "@kyleshockey/object-assign-deep": "^0.4.0", + "babel-runtime": "^6.23.0", "btoa": "1.1.2", - "buffer": "5.1.0", - "cookie": "0.3.1", + "buffer": "^5.1.0", + "cookie": "^0.3.1", "cross-fetch": "0.0.8", - "deep-extend": "0.5.1", - "encode-3986": "1.0.0", - "fast-json-patch": "2.0.6", + "deep-extend": "^0.5.1", + "encode-3986": "^1.0.0", + "fast-json-patch": "^2.0.6", "isomorphic-form-data": "0.0.1", - "js-yaml": "3.12.0", - "lodash": "4.17.10", - "qs": "6.5.2", - "querystring-browser": "1.0.4", - "url": "0.11.0", + "js-yaml": "^3.8.1", + "lodash": "^4.16.2", + "qs": "^6.3.0", + "querystring-browser": "^1.0.4", + "url": "^0.11.0", "utf8-bytes": "0.0.1", - "utfstring": "2.0.0" + "utfstring": "^2.0.0" } }, "swagger-ui": { @@ -4477,32 +3765,48 @@ "dev": true }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", + "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "dev": true, "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.4.1", - "lodash": "4.17.10", + "ajv": "^6.5.3", + "lodash": "^4.17.10", "slice-ansi": "1.0.0", - "string-width": "2.1.1" - } - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "string-width": "^2.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "through": { "version": "2.3.8", @@ -4513,8 +3817,9 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-utf8": { @@ -4532,7 +3837,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" }, "dependencies": { "punycode": { @@ -4558,7 +3863,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -4571,8 +3876,9 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -4587,14 +3893,9 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "~2.1.18" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, "uid2": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", @@ -4611,8 +3912,8 @@ "integrity": "sha1-EBvTWeAq8pOqWhBidI6WPiCHZ/E=", "dev": true, "requires": { - "underscore": "1.7.0", - "underscore.string": "3.3.4" + "underscore": ">=1.0", + "underscore.string": ">=2.0.0" } }, "underscore.string": { @@ -4620,8 +3921,8 @@ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", "requires": { - "sprintf-js": "1.0.3", - "util-deprecate": "1.0.2" + "sprintf-js": "^1.0.3", + "util-deprecate": "^1.0.2" } }, "unpipe": { @@ -4635,7 +3936,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { @@ -4676,9 +3977,9 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "vary": { "version": "1.1.2", @@ -4713,9 +4014,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "webfinger": { @@ -4723,8 +4024,8 @@ "resolved": "https://registry.npmjs.org/webfinger/-/webfinger-0.4.2.tgz", "integrity": "sha1-NHem2XeZRhiWA5/P/GULc0aO520=", "requires": { - "step": "0.0.6", - "xml2js": "0.1.14" + "step": "0.0.x", + "xml2js": "0.1.x" }, "dependencies": { "xml2js": { @@ -4732,7 +4033,7 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.1.14.tgz", "integrity": "sha1-UnTmf1pkxfkpdM2FE54DMq3GuQw=", "requires": { - "sax": "1.2.4" + "sax": ">=0.1.1" } } } @@ -4752,7 +4053,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "whistlepunk": { @@ -4762,11 +4063,11 @@ "requires": { "colors": "1.0.3", "debug": "2.2.0", - "lodash": "3.10.1", - "machina": "1.1.2", + "lodash": "3.x", + "machina": "1.x", "moment": "2.10.2", - "postal": "1.0.11", - "when": "3.7.8" + "postal": "1.x", + "when": "3.x" }, "dependencies": { "debug": { @@ -4787,7 +4088,7 @@ "resolved": "https://registry.npmjs.org/machina/-/machina-1.1.2.tgz", "integrity": "sha1-GMq+pfqet8AyQI6zCf6yr3qDckc=", "requires": { - "lodash": "3.10.1" + "lodash": "3.x" } }, "moment": { @@ -4805,7 +4106,7 @@ "resolved": "https://registry.npmjs.org/postal/-/postal-1.0.11.tgz", "integrity": "sha1-ejf/YCaGJthFzAM25X2QokU2l50=", "requires": { - "lodash": "4.17.10" + "lodash": "4.x" }, "dependencies": { "lodash": { @@ -4825,7 +4126,8 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wrappy": { "version": "1.0.2", @@ -4836,8 +4138,9 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "x-xss-protection": { @@ -4850,8 +4153,8 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.7" + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" } }, "xmlbuilder": { @@ -4879,8 +4182,8 @@ "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", "requires": { - "argparse": "1.0.10", - "glob": "7.1.2" + "argparse": "^1.0.7", + "glob": "^7.0.5" } } } diff --git a/package.json b/package.json index faeb7b91..5ff8e91e 100644 --- a/package.json +++ b/package.json @@ -12,37 +12,37 @@ "test": "./node_modules/mocha/bin/mocha --timeout=30000 --reporter spec --exit 2>/dev/null" }, "dependencies": { - "compression": "^1.0.3", - "cors": "^2.5.2", - "helmet": "^3.10.0", + "compression": "^1.7.3", + "cors": "^2.8.5", + "helmet": "^3.15.0", + "loopback": "^3.24.0", "loopback-boot": "^2.6.5", - "serve-favicon": "2.5.0", - "strong-error-handler": "3.2.0", - "loopback-component-explorer": "^6.0.0", - "loopback": "^3.19.0", + "loopback-component-explorer": "^6.3.1", "loopback-component-model-diagram": "^0.4.2", "loopback-component-mq": "^2.2.5", - "loopback-component-passport": "^3.4.1", + "loopback-component-passport": "^3.10.0", "loopback-component-visualizer": "^1.2.1", "loopback-connector-kafka": "^0.2.1", - "loopback-connector-mongodb": "^3.3.0", + "loopback-connector-mongodb": "^3.9.2", "loopback-ds-timestamp-mixin": "^3.4.1", "moment": "^2.20.1", - "moment-timezone": "^0.5.14", - "nodemailer": "^4.3.1", - "passport-ldapauth": "^2.0.0", + "moment-timezone": "^0.5.23", + "nodemailer": "^4.6.8", + "passport-ldapauth": "^2.1.0", "passport-local": "^1.0.0", "passport-openidconnect": "^0.0.2", - "uuid": "^3.2.1" + "serve-favicon": "2.5.0", + "strong-error-handler": "3.2.0", + "uuid": "^3.3.2" }, "devDependencies": { - "eslint": "^5.3.0", - "eslint-config-loopback": "^12.0.0", "@mean-expert/loopback-sdk-builder": "^2.1.0", - "chai": "^4.1.2", + "chai": "^4.2.0", "chai-http": "^4.0.0", + "eslint": "^5.9.0", + "eslint-config-loopback": "^12.0.0", "mocha": "^5.2.0", - "supertest": "^3.0.0" + "supertest": "^3.3.0" }, "repository": { "type": "", From 8f144d5e82c1c6e28df91a193fe20bb945fe7697 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 21 Nov 2018 13:56:11 +0100 Subject: [PATCH 092/147] add default robots.txt --- server/robots.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 server/robots.txt diff --git a/server/robots.txt b/server/robots.txt new file mode 100644 index 00000000..eb053628 --- /dev/null +++ b/server/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: From 7674208c3ac71f993df1d0bfe2934c301fcfe573 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 21 Nov 2018 17:22:22 +0100 Subject: [PATCH 093/147] Issue #100 handle undefined ownerEmail --- common/models/policy.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/common/models/policy.js b/common/models/policy.js index 3eb799f5..a86644ef 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -45,8 +45,15 @@ module.exports = function(Policy) { Policy.addDefault = function(ownerGroup, ownerEmail) { // TODO: move the deault definition somewhere more sensible var defaultPolicy = Object(); - defaultPolicy.ownerGroup = ownerGroup; //mandatory - defaultPolicy.manager = ownerEmail.split(","); //mandatory + defaultPolicy.ownerGroup = ownerGroup; + if (config && !ownerEmail) + { + defaultPolicy.ownerEmail = config.defaultManager; + } + else + { + defaultPolicy.manager = ownerEmail.split(","); + } defaultPolicy.tapeRedundancy = "low"; defaultPolicy.autoArchive = false; defaultPolicy.autoArchiveDelay = 7; From 698deafe3d5ea041b253705c175b70017a5cbb0a Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Thu, 22 Nov 2018 11:33:12 +0100 Subject: [PATCH 094/147] add caption --- common/models/dataset-attachment.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/common/models/dataset-attachment.json b/common/models/dataset-attachment.json index 1d3bd2ee..345ce496 100644 --- a/common/models/dataset-attachment.json +++ b/common/models/dataset-attachment.json @@ -9,7 +9,7 @@ "collection": "DatasetAttachment" } }, - "description": "Small less than 16 MB attchments for datasets, envisaged for png/jpeg previews", + "description": "Small less than 16 MB attachments for datasets, envisaged for png/jpeg previews", "properties": { "thumbnail": { "type": "string", @@ -17,6 +17,11 @@ "description": "Contains a thumbnail preview in base64 encoded png format for a given dataset", "default": "retrieve" }, + "caption": { + "type": "string", + "description": "Contains a thumbnail preview in base64 encoded png format for a given dataset", + "default": "retrieve" + }, "creationTime": { "type": "date", "index": true, From 8702d2bf117a4b36ffcdf4f088114c949c41ea37 Mon Sep 17 00:00:00 2001 From: Hannes Petri Date: Thu, 22 Nov 2018 16:49:34 +0100 Subject: [PATCH 095/147] Made loopback-connector-kafka an optional dependency --- package-lock.json | 424 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 4 +- 2 files changed, 422 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78af0daa..2254f54d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -197,6 +197,12 @@ "through": ">=2.2.7 <3" } }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, "accept-language": { "version": "3.0.18", "resolved": "https://registry.npmjs.org/accept-language/-/accept-language-3.0.18.tgz", @@ -281,6 +287,11 @@ } } }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -299,6 +310,16 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "are-we-there-yet": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", + "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -312,6 +333,16 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-index": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", + "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", + "optional": true, + "requires": { + "debug": "^2.2.0", + "es6-symbol": "^3.0.2" + } + }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -397,6 +428,22 @@ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "optional": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, "bitsyntax": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", @@ -414,6 +461,15 @@ "safe-buffer": "^5.1.1" } }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", @@ -485,11 +541,32 @@ "ieee754": "^1.1.4" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "optional": true + }, "buffer-more-ints": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=" }, + "buffermaker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffermaker/-/buffermaker-1.2.0.tgz", + "integrity": "sha1-u3MlLsCIK3Y56bVWuCnav8LK4bo=", + "optional": true, + "requires": { + "long": "1.1.2" + } + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "optional": true + }, "bunyan": { "version": "1.8.12", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", @@ -626,6 +703,23 @@ } } }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "optional": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + }, + "dependencies": { + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "optional": true + } + } + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -864,6 +958,14 @@ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "^0.10.9" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -915,6 +1017,12 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1043,6 +1151,26 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, + "es5-ext": { + "version": "0.10.46", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", + "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", @@ -1056,6 +1184,15 @@ "es6-promise": "^4.0.3" } }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1503,6 +1640,17 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -1517,6 +1665,19 @@ "swagger-client": "^3.8.3" } }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "optional": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -1566,8 +1727,7 @@ "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "har-schema": { "version": "2.0.0", @@ -1598,6 +1758,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -1954,6 +2120,38 @@ "verror": "1.10.0" } }, + "kafka-node": { + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/kafka-node/-/kafka-node-0.2.30.tgz", + "integrity": "sha1-rDJRny9in/7GLuZoY5U8sZ9WyPo=", + "optional": true, + "requires": { + "async": ">0.9 <2.0", + "binary": "~0.3.0", + "buffer-crc32": "~0.2.5", + "buffermaker": "~1.2.0", + "debug": "^2.1.3", + "lodash": ">3.0 <4.0", + "node-uuid": "~1.4.3", + "node-zookeeper-client": "~0.2.2", + "retry": "~0.6.1", + "snappy": "^4.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "optional": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "optional": true + } + } + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -2021,6 +2219,30 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "optional": true + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "optional": true + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "optional": true + }, + "long": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/long/-/long-1.1.2.tgz", + "integrity": "sha1-6u9ZUcp1UdlpJrgtokLbnWso+1M=", + "optional": true + }, "loopback": { "version": "3.24.0", "resolved": "https://registry.npmjs.org/loopback/-/loopback-3.24.0.tgz", @@ -2237,6 +2459,15 @@ } } }, + "loopback-connector-kafka": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/loopback-connector-kafka/-/loopback-connector-kafka-0.2.1.tgz", + "integrity": "sha1-oRn7iqBmJzGMRlvsgX+nPbo43sE=", + "optional": true, + "requires": { + "kafka-node": "~0.2.1" + } + }, "loopback-connector-mongodb": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/loopback-connector-mongodb/-/loopback-connector-mongodb-3.9.2.tgz", @@ -2793,6 +3024,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -2813,6 +3049,99 @@ "is-stream": "^1.0.1" } }, + "node-gyp": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.2.1.tgz", + "integrity": "sha1-9d1WmXClCEZMw8Fdfp6NLehjjdU=", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "glob": "3 || 4", + "graceful-fs": "^4.1.2", + "minimatch": "1", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1", + "osenv": "0", + "path-array": "^1.0.0", + "request": "2", + "rimraf": "2", + "semver": "2.x || 3.x || 4 || 5", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + } + } + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "optional": true + }, + "minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", + "optional": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "optional": true + }, + "node-zookeeper-client": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/node-zookeeper-client/-/node-zookeeper-client-0.2.2.tgz", + "integrity": "sha1-CXvaAZme749gLOBotjJgAGnb9oU=", + "optional": true, + "requires": { + "async": "~0.2.7", + "underscore": "~1.4.4" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "optional": true + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "optional": true + } + } + }, "nodemailer": { "version": "4.6.8", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.8.tgz", @@ -2845,6 +3174,15 @@ "resolved": "https://registry.npmjs.org/nodemailer-stub-transport/-/nodemailer-stub-transport-1.1.0.tgz", "integrity": "sha1-EUIdLWa07m9AU1T5FMH0ZB6ySw0=" }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -2853,6 +3191,17 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "optional": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, "oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -2940,6 +3289,12 @@ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "optional": true + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -2953,8 +3308,17 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } }, "p-finally": { "version": "1.0.0", @@ -3010,6 +3374,15 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" }, + "path-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", + "integrity": "sha1-fi8PNfB6IBUSK4aLfqwOssT+wnE=", + "optional": true, + "requires": { + "array-index": "^1.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3276,11 +3649,16 @@ "signal-exit": "^3.0.2" } }, + "retry": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz", + "integrity": "sha1-/ckO7ZQ/3hG4k1VLjMY9DombqRg=", + "optional": true + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -3436,6 +3814,12 @@ "nanoid": "^2.0.0" } }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "optional": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -3459,6 +3843,25 @@ "nodemailer-shared": "1.1.0" } }, + "snappy": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/snappy/-/snappy-4.1.2.tgz", + "integrity": "sha1-jN2cAIK5sF8VfsVv2RLBd0QBQps=", + "optional": true, + "requires": { + "bindings": "1.2.1", + "nan": "2.2.0", + "node-gyp": "3.2.1" + }, + "dependencies": { + "nan": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -3802,6 +4205,17 @@ } } }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", diff --git a/package.json b/package.json index 5ff8e91e..9b703f08 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ "loopback-component-mq": "^2.2.5", "loopback-component-passport": "^3.10.0", "loopback-component-visualizer": "^1.2.1", - "loopback-connector-kafka": "^0.2.1", "loopback-connector-mongodb": "^3.9.2", "loopback-ds-timestamp-mixin": "^3.4.1", "moment": "^2.20.1", @@ -35,6 +34,9 @@ "strong-error-handler": "3.2.0", "uuid": "^3.3.2" }, + "optionalDependencies": { + "loopback-connector-kafka": "^0.2.1" + }, "devDependencies": { "@mean-expert/loopback-sdk-builder": "^2.1.0", "chai": "^4.2.0", From 19437fdbcdcc08a1644e4366e239451c4037642b Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 26 Nov 2018 14:22:28 +0100 Subject: [PATCH 096/147] Remove automatically setting type to base --- common/models/dataset.js | 1 - 1 file changed, 1 deletion(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index fa9866f4..8b52a1ab 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -43,7 +43,6 @@ module.exports = function(Dataset) { console.log(' unmodified pid:', ctx.instance.pid); } ctx.instance.version = p.version; - ctx.instance.type = 'base'; // add a policy record now (A Groups). Check that one doesnt already exist var Policy = app.models.Policy; From 25fd1e758ae64e3f5b926f46b46328628b23ce0c Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 26 Nov 2018 14:53:00 +0100 Subject: [PATCH 097/147] Update Dataset.js --- test/Dataset.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Dataset.js b/test/Dataset.js index d3f4e1aa..be26927d 100644 --- a/test/Dataset.js +++ b/test/Dataset.js @@ -24,6 +24,7 @@ var testdataset = { "Cryo", "Calibration" ], "description": "None", + "type": "raw", "license": "CC BY-SA 4.0", "doi": "not yet defined", "isPublished": false, @@ -59,7 +60,7 @@ describe('Simple Dataset tests', () => { if (err) return done(err); res.body.should.have.property('version').and.be.string; - res.body.should.have.property('type').and.equal('base'); + res.body.should.have.property('type').and.equal('raw'); res.body.should.have.property('pid').and.be.string; pid = encodeURIComponent(res.body['pid']); done(); From ae4cf127f1f7586d1a97d67e36021af475378b3c Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 26 Nov 2018 14:55:51 +0100 Subject: [PATCH 098/147] Update tests.json --- test/config/tests.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/config/tests.json b/test/config/tests.json index c45a01e0..de3e1fe1 100644 --- a/test/config/tests.json +++ b/test/config/tests.json @@ -34,6 +34,7 @@ "Cryo", "Calibration" ], "description": "None", + "type": "raw", "license": "CC BY-SA 4.0", "doi": "not yet defined", "isPublished": false, @@ -42,7 +43,7 @@ }, "response": [ "res.body.should.have.property('version').and.be.string;", - "res.body.should.have.property('type').and.equal('base');", + "res.body.should.have.property('type').and.equal('raw');", "res.body.should.have.property('pid').and.be.string;" ] }, From 0a5404b43f556801a6268446c3a40843bae4f1da Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Mon, 26 Nov 2018 15:16:34 +0100 Subject: [PATCH 099/147] Update tests.json --- test/config/tests.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/config/tests.json b/test/config/tests.json index de3e1fe1..373286ab 100644 --- a/test/config/tests.json +++ b/test/config/tests.json @@ -63,6 +63,7 @@ "Cryo", "Calibration" ], "description": "None", + "type": "raw", "license": "CC BY-SA 4.0", "doi": "not yet defined", "isPublished": false, @@ -71,7 +72,7 @@ }, "response": [ "res.body.should.have.property('version').and.be.string;", - "res.body.should.have.property('type').and.equal('base');", + "res.body.should.have.property('type').and.equal('raw');", "res.body.should.have.property('pid').and.be.string;" ] }, From 4300a42171891962013c5151d671fe0258a8c1e0 Mon Sep 17 00:00:00 2001 From: egli Date: Tue, 27 Nov 2018 09:47:32 +0100 Subject: [PATCH 100/147] Archivable,Retrievable etc flags now also available directly inside Dataset --- common/models/dataset-lifecycle.js | 43 ++++++++++++++++++++++++++-- common/models/dataset-lifecycle.json | 8 ++++-- common/models/dataset.json | 12 ++++++++ test/DatasetLifecycle.js | 19 ++++++++++-- 4 files changed, 76 insertions(+), 6 deletions(-) diff --git a/common/models/dataset-lifecycle.js b/common/models/dataset-lifecycle.js index 0ec52c71..c6fc1da4 100644 --- a/common/models/dataset-lifecycle.js +++ b/common/models/dataset-lifecycle.js @@ -48,6 +48,45 @@ module.exports = function(Datasetlifecycle) { utils.addOwnerGroup(ctx, next) }) + // transfer status flags to linked dataset + Datasetlifecycle.observe('after save', (ctx, next) => { + var Dataset = app.models.Dataset + var instance = ctx.instance + if (!instance) { + instance = ctx.currentInstance + } + if (instance && (instance.datasetId !== undefined)) { + const datasetId = decodeURIComponent(instance.datasetId) + Dataset.findById(datasetId, null, ctx.options).then(datasetInstance => { + if (datasetInstance) { + // important to pass options here, otherwise context gets lost + datasetInstance.updateAttributes({ + archivable: instance.archivable, + retrievable: instance.retrievable, + publishable: instance.publishable + }, ctx.options, + function(err, datasetInstance) { + if (err) { + var error = new Error(); + error.statusCode = 403; + error.message = err; + next(error) + } else { + next() + } + }) + } else { + var error = new Error(); + error.statusCode = 404; + error.message = "DatasetLifecycle after save: No dataset found with pid " + datasetId + next(error) + } + }) + } else { + next() + } + }) + Datasetlifecycle.isValid = function(instance, next) { var ds = new Datasetlifecycle(instance) ds.isValid(function(valid) { @@ -87,12 +126,12 @@ module.exports = function(Datasetlifecycle) { } else { Dataset.findById(id, options, function(err, instance) { if (err) { - console.log("==== error finding dataset:",err) + console.log("==== error finding dataset:", err) next(err); } else { instance.updateAttributes({ packedSize: 0, - }, options, function(err,inst){ + }, options, function(err, inst) { next(); }); } diff --git a/common/models/dataset-lifecycle.json b/common/models/dataset-lifecycle.json index aeb2c18d..bcd29b82 100644 --- a/common/models/dataset-lifecycle.json +++ b/common/models/dataset-lifecycle.json @@ -33,11 +33,15 @@ }, "archivable": { "type": "boolean", - "description": "Flag which is true, if dataset is available to be archived and no archive job for this dataset exists yet" + "description": "Flag which is true, if dataset is available to be archived and no archive job for this dataset exists yet. Will be copied to Dataset for now and may become obsolete here eventually." }, "retrievable": { "type": "boolean", - "description": "Flag which is true, if dataset is stored on archive system and is ready to be retrieved" + "description": "Flag which is true, if dataset is stored on archive system and is ready to be retrieved. Will be copied to Dataset for now and may become obsolete here eventually." + }, + "publishable": { + "type": "boolean", + "description": "Flag which is true, if dataset can be published. Usually requires a longterm storage option on tape or similar. Will be copied to Dataset for now and may become obsolete here eventually." }, "dateOfDiskPurging": { "type": "date", diff --git a/common/models/dataset.json b/common/models/dataset.json index 5a721bb6..6622aa9f 100644 --- a/common/models/dataset.json +++ b/common/models/dataset.json @@ -102,6 +102,18 @@ "isPublished": { "type": "boolean", "description": "Flag is true when data are made publically available" + }, + "archivable":{ + "type": "boolean", + "description": "Copy of archivable flag from DatasetLifecycle" + }, + "retrievable":{ + "type": "boolean", + "description": "Copy of retrievable flag from DatasetLifecycle" + }, + "publishable":{ + "type": "boolean", + "description": "Copy of publishable flag from DatasetLifecycle" } }, "validations": [], diff --git a/test/DatasetLifecycle.js b/test/DatasetLifecycle.js index 6c6a4330..4c6d75b3 100644 --- a/test/DatasetLifecycle.js +++ b/test/DatasetLifecycle.js @@ -97,7 +97,10 @@ var testDatasetLifecycle = { "isOnTape": false, "archiveStatusMessage": "datasetCreated", "retrieveStatusMessage": "", - "isExported": false + "isExported": false, + "archivable":true, + "retrievable":true, + "publishable":false } var app @@ -156,7 +159,19 @@ describe('Test DatasetLifecycle and the relation to Datasets', () => { if (err) return done(err); idDatasetLifecycle = encodeURIComponent(res.body['id']); - done(); + request(app) + .get('/api/v2/Datasets/'+pid + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + res.body.should.have.property('archivable').and.equal(true); + res.body.should.have.property('retrievable').and.equal(true); + res.body.should.have.property('publishable').and.equal(false); + done(); + }); }); }); From bc5090c0c82a1cb7c516d4d3bc39a912258adbbe Mon Sep 17 00:00:00 2001 From: egli Date: Wed, 28 Nov 2018 09:10:38 +0100 Subject: [PATCH 101/147] Added datasetName field and updated swagger.json --- client/api/swagger.json | 2 +- common/models/dataset.json | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/api/swagger.json b/client/api/swagger.json index c3d16bbe..1c259a45 100644 --- a/client/api/swagger.json +++ b/client/api/swagger.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"version":"2.6.3","title":"dacat-api"},"basePath":"/api/v2","paths":{"/Users/{id}/accessTokens/{fk}":{"get":{"tags":["User"],"summary":"Find a related item by id for accessTokens.","operationId":"User.prototype.__findById__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for accessTokens","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessToken"}}},"deprecated":false},"delete":{"tags":["User"],"summary":"Delete a related item by id for accessTokens.","operationId":"User.prototype.__destroyById__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for accessTokens","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["User"],"summary":"Update a related item by id for accessTokens.","operationId":"User.prototype.__updateById__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for accessTokens","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/AccessToken"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessToken"}}},"deprecated":false}},"/Users/{id}/accessTokens":{"get":{"tags":["User"],"summary":"Queries accessTokens of User.","operationId":"User.prototype.__get__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/AccessToken"}}}},"deprecated":false},"post":{"tags":["User"],"summary":"Creates a new instance in accessTokens of this model.","operationId":"User.prototype.__create__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/AccessToken"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessToken"}}},"deprecated":false},"delete":{"tags":["User"],"summary":"Deletes all accessTokens of this model.","operationId":"User.prototype.__delete__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/{id}/accessTokens/count":{"get":{"tags":["User"],"summary":"Counts accessTokens of User.","operationId":"User.prototype.__count__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Users":{"post":{"tags":["User"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"User.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"patch":{"tags":["User"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"User.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"put":{"tags":["User"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"User.replaceOrCreate__put_Users","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"get":{"tags":["User"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"User.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/User"}}}},"deprecated":false}},"/Users/replaceOrCreate":{"post":{"tags":["User"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"User.replaceOrCreate__post_Users_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/upsertWithWhere":{"post":{"tags":["User"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"User.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/{id}/exists":{"get":{"tags":["User"],"summary":"Check whether a model instance exists in the data source.","operationId":"User.exists__get_Users_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Users/{id}":{"head":{"tags":["User"],"summary":"Check whether a model instance exists in the data source.","operationId":"User.exists__head_Users_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["User"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"User.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"put":{"tags":["User"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"User.replaceById__put_Users_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"delete":{"tags":["User"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"User.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["User"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"User.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/{id}/replace":{"post":{"tags":["User"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"User.replaceById__post_Users_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/findOne":{"get":{"tags":["User"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"User.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/update":{"post":{"tags":["User"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"User.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Users/count":{"get":{"tags":["User"],"summary":"Count instances of the model matched by where from the data source.","operationId":"User.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Users/change-stream":{"post":{"tags":["User"],"summary":"Create a change stream.","operationId":"User.createChangeStream__post_Users_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["User"],"summary":"Create a change stream.","operationId":"User.createChangeStream__get_Users_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Users/login":{"post":{"tags":["User"],"summary":"Login a user with username/email and password.","operationId":"User.login","parameters":[{"name":"credentials","in":"body","required":true,"schema":{"type":"object"}},{"name":"include","in":"query","description":"Related objects to include in the response. See the description of return value for more details.","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"description":"The response body contains properties of the AccessToken created on login.\nDepending on the value of `include` parameter, the body may contain additional properties:\n\n - `user` - `U+007BUserU+007D` - Data of the currently logged in user. (`include=user`)\n\n","type":"object"}}},"deprecated":false}},"/Users/logout":{"post":{"tags":["User"],"summary":"Logout a user with access token.","operationId":"User.logout","parameters":[],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/{id}/verify":{"post":{"tags":["User"],"summary":"Trigger user's identity verification with configured verifyOptions","operationId":"User.prototype.verify","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/confirm":{"get":{"tags":["User"],"summary":"Confirm a user registration with identity verification token.","operationId":"User.confirm","parameters":[{"name":"uid","in":"query","required":true,"type":"string"},{"name":"token","in":"query","required":true,"type":"string"},{"name":"redirect","in":"query","required":false,"type":"string"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/reset":{"post":{"tags":["User"],"summary":"Reset password for a user with email.","operationId":"User.resetPassword","parameters":[{"name":"options","in":"body","required":true,"schema":{"type":"object"}}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/change-password":{"post":{"tags":["User"],"summary":"Change a user's password.","operationId":"User.changePassword","parameters":[{"name":"oldPassword","in":"formData","required":true,"type":"string"},{"name":"newPassword","in":"formData","required":true,"type":"string"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/reset-password":{"post":{"tags":["User"],"summary":"Reset user's password via a password-reset token.","operationId":"User.setPassword","parameters":[{"name":"newPassword","in":"formData","required":true,"type":"string"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/datasetlifecycle":{"get":{"tags":["Dataset"],"summary":"Fetches hasOne relation datasetlifecycle.","operationId":"Dataset.prototype.__get__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"post":{"tags":["Dataset"],"summary":"Creates a new instance in datasetlifecycle of this model.","operationId":"Dataset.prototype.__create__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Update datasetlifecycle of this model.","operationId":"Dataset.prototype.__update__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Deletes datasetlifecycle of this model.","operationId":"Dataset.prototype.__destroy__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/datablocks/{fk}":{"get":{"tags":["Dataset"],"summary":"Find a related item by id for datablocks.","operationId":"Dataset.prototype.__findById__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Delete a related item by id for datablocks.","operationId":"Dataset.prototype.__destroyById__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Update a related item by id for datablocks.","operationId":"Dataset.prototype.__updateById__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datasets/{id}/datasetattachments/{fk}":{"get":{"tags":["Dataset"],"summary":"Find a related item by id for datasetattachments.","operationId":"Dataset.prototype.__findById__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Delete a related item by id for datasetattachments.","operationId":"Dataset.prototype.__destroyById__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Update a related item by id for datasetattachments.","operationId":"Dataset.prototype.__updateById__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/Datasets/{id}/origdatablocks/{fk}":{"get":{"tags":["Dataset"],"summary":"Find a related item by id for origdatablocks.","operationId":"Dataset.prototype.__findById__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Delete a related item by id for origdatablocks.","operationId":"Dataset.prototype.__destroyById__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Update a related item by id for origdatablocks.","operationId":"Dataset.prototype.__updateById__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/Datasets/{id}/datablocks":{"get":{"tags":["Dataset"],"summary":"Queries datablocks of Dataset.","operationId":"Dataset.prototype.__get__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Datablock"}}}},"deprecated":false},"post":{"tags":["Dataset"],"summary":"Creates a new instance in datablocks of this model.","operationId":"Dataset.prototype.__create__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Deletes all datablocks of this model.","operationId":"Dataset.prototype.__delete__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/datablocks/count":{"get":{"tags":["Dataset"],"summary":"Counts datablocks of Dataset.","operationId":"Dataset.prototype.__count__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets/{id}/datasetattachments":{"get":{"tags":["Dataset"],"summary":"Queries datasetattachments of Dataset.","operationId":"Dataset.prototype.__get__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetAttachment"}}}},"deprecated":false},"post":{"tags":["Dataset"],"summary":"Creates a new instance in datasetattachments of this model.","operationId":"Dataset.prototype.__create__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Deletes all datasetattachments of this model.","operationId":"Dataset.prototype.__delete__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/datasetattachments/count":{"get":{"tags":["Dataset"],"summary":"Counts datasetattachments of Dataset.","operationId":"Dataset.prototype.__count__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets/{id}/origdatablocks":{"get":{"tags":["Dataset"],"summary":"Queries origdatablocks of Dataset.","operationId":"Dataset.prototype.__get__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/OrigDatablock"}}}},"deprecated":false},"post":{"tags":["Dataset"],"summary":"Creates a new instance in origdatablocks of this model.","operationId":"Dataset.prototype.__create__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Deletes all origdatablocks of this model.","operationId":"Dataset.prototype.__delete__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/origdatablocks/count":{"get":{"tags":["Dataset"],"summary":"Counts origdatablocks of Dataset.","operationId":"Dataset.prototype.__count__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets":{"post":{"tags":["Dataset"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Dataset.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"patch":{"tags":["Dataset"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Dataset.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Dataset.replaceOrCreate__put_Datasets","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"get":{"tags":["Dataset"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Dataset.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Dataset"}}}},"deprecated":false}},"/Datasets/replaceOrCreate":{"post":{"tags":["Dataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Dataset.replaceOrCreate__post_Datasets_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/upsertWithWhere":{"post":{"tags":["Dataset"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Dataset.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/{id}/exists":{"get":{"tags":["Dataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"Dataset.exists__get_Datasets_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Datasets/{id}":{"head":{"tags":["Dataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"Dataset.exists__head_Datasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Dataset"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Dataset.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Dataset.replaceById__put_Datasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Dataset.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Dataset"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Dataset.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/{id}/replace":{"post":{"tags":["Dataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Dataset.replaceById__post_Datasets_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/findOne":{"get":{"tags":["Dataset"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Dataset.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/update":{"post":{"tags":["Dataset"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Dataset.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets/count":{"get":{"tags":["Dataset"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Dataset.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets/change-stream":{"post":{"tags":["Dataset"],"summary":"Create a change stream.","operationId":"Dataset.createChangeStream__post_Datasets_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Dataset"],"summary":"Create a change stream.","operationId":"Dataset.createChangeStream__get_Datasets_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Datasets/isValid":{"post":{"tags":["Dataset"],"summary":"Check if data is valid according to a schema","operationId":"Dataset.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Datasets/resetArchiveStatus":{"post":{"tags":["Dataset"],"summary":"Delete datablocks of dataset and reset status message","operationId":"Dataset.reset","parameters":[{"name":"datasetId","in":"formData","required":false,"type":"string"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"result":{"type":"string"}}}}},"deprecated":false}},"/Datasets/facet":{"post":{"tags":["Dataset"],"summary":"Search for numbers associated with dataset properties. I.e. How many datasets in Group A. Default returns: Creation Location, Owner Groups and Creation Time","operationId":"Dataset.facet","parameters":[{"name":"fields","in":"formData","description":"Define the fields to search by, these will be mapped to the Dataset object and ensure the fields exist. There is also support for a `text` search to look for keywords. Can be undefined.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"formData","description":"This should be an array of objects with the structure: {name: key in mongo (without $ prefix), type: date|text|etc, preConditions: object to include in the query (i.e. unwind)}","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"results":{"type":"object"}}}}},"deprecated":false}},"/RawDatasets/{id}/sample":{"get":{"tags":["RawDataset"],"summary":"Fetches belongsTo relation sample.","operationId":"RawDataset.prototype.__get__sample","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/RawDatasets/{id}/proposal":{"get":{"tags":["RawDataset"],"summary":"Fetches belongsTo relation proposal.","operationId":"RawDataset.prototype.__get__proposal","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/RawDatasets/{id}/datasetlifecycle":{"get":{"tags":["RawDataset"],"summary":"Fetches hasOne relation datasetlifecycle.","operationId":"RawDataset.prototype.__get__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"post":{"tags":["RawDataset"],"summary":"Creates a new instance in datasetlifecycle of this model.","operationId":"RawDataset.prototype.__create__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Update datasetlifecycle of this model.","operationId":"RawDataset.prototype.__update__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Deletes datasetlifecycle of this model.","operationId":"RawDataset.prototype.__destroy__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/RawDatasets/{id}/datablocks/{fk}":{"get":{"tags":["RawDataset"],"summary":"Find a related item by id for datablocks.","operationId":"RawDataset.prototype.__findById__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Delete a related item by id for datablocks.","operationId":"RawDataset.prototype.__destroyById__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Update a related item by id for datablocks.","operationId":"RawDataset.prototype.__updateById__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/RawDatasets/{id}/datasetattachments/{fk}":{"get":{"tags":["RawDataset"],"summary":"Find a related item by id for datasetattachments.","operationId":"RawDataset.prototype.__findById__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Delete a related item by id for datasetattachments.","operationId":"RawDataset.prototype.__destroyById__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Update a related item by id for datasetattachments.","operationId":"RawDataset.prototype.__updateById__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/RawDatasets/{id}/origdatablocks/{fk}":{"get":{"tags":["RawDataset"],"summary":"Find a related item by id for origdatablocks.","operationId":"RawDataset.prototype.__findById__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Delete a related item by id for origdatablocks.","operationId":"RawDataset.prototype.__destroyById__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Update a related item by id for origdatablocks.","operationId":"RawDataset.prototype.__updateById__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/RawDatasets/{id}/datablocks":{"get":{"tags":["RawDataset"],"summary":"Queries datablocks of RawDataset.","operationId":"RawDataset.prototype.__get__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Datablock"}}}},"deprecated":false},"post":{"tags":["RawDataset"],"summary":"Creates a new instance in datablocks of this model.","operationId":"RawDataset.prototype.__create__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Deletes all datablocks of this model.","operationId":"RawDataset.prototype.__delete__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/RawDatasets/{id}/datablocks/count":{"get":{"tags":["RawDataset"],"summary":"Counts datablocks of RawDataset.","operationId":"RawDataset.prototype.__count__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets/{id}/datasetattachments":{"get":{"tags":["RawDataset"],"summary":"Queries datasetattachments of RawDataset.","operationId":"RawDataset.prototype.__get__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetAttachment"}}}},"deprecated":false},"post":{"tags":["RawDataset"],"summary":"Creates a new instance in datasetattachments of this model.","operationId":"RawDataset.prototype.__create__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Deletes all datasetattachments of this model.","operationId":"RawDataset.prototype.__delete__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/RawDatasets/{id}/datasetattachments/count":{"get":{"tags":["RawDataset"],"summary":"Counts datasetattachments of RawDataset.","operationId":"RawDataset.prototype.__count__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets/{id}/origdatablocks":{"get":{"tags":["RawDataset"],"summary":"Queries origdatablocks of RawDataset.","operationId":"RawDataset.prototype.__get__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/OrigDatablock"}}}},"deprecated":false},"post":{"tags":["RawDataset"],"summary":"Creates a new instance in origdatablocks of this model.","operationId":"RawDataset.prototype.__create__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Deletes all origdatablocks of this model.","operationId":"RawDataset.prototype.__delete__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/RawDatasets/{id}/origdatablocks/count":{"get":{"tags":["RawDataset"],"summary":"Counts origdatablocks of RawDataset.","operationId":"RawDataset.prototype.__count__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets":{"post":{"tags":["RawDataset"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"RawDataset.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"patch":{"tags":["RawDataset"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"RawDataset.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"RawDataset.replaceOrCreate__put_RawDatasets","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"get":{"tags":["RawDataset"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"RawDataset.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/RawDataset"}}}},"deprecated":false}},"/RawDatasets/replaceOrCreate":{"post":{"tags":["RawDataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"RawDataset.replaceOrCreate__post_RawDatasets_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/upsertWithWhere":{"post":{"tags":["RawDataset"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"RawDataset.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/{id}/exists":{"get":{"tags":["RawDataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"RawDataset.exists__get_RawDatasets_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/RawDatasets/{id}":{"head":{"tags":["RawDataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"RawDataset.exists__head_RawDatasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["RawDataset"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"RawDataset.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"RawDataset.replaceById__put_RawDatasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"RawDataset.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["RawDataset"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"RawDataset.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/{id}/replace":{"post":{"tags":["RawDataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"RawDataset.replaceById__post_RawDatasets_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/findOne":{"get":{"tags":["RawDataset"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"RawDataset.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/update":{"post":{"tags":["RawDataset"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"RawDataset.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets/count":{"get":{"tags":["RawDataset"],"summary":"Count instances of the model matched by where from the data source.","operationId":"RawDataset.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets/change-stream":{"post":{"tags":["RawDataset"],"summary":"Create a change stream.","operationId":"RawDataset.createChangeStream__post_RawDatasets_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["RawDataset"],"summary":"Create a change stream.","operationId":"RawDataset.createChangeStream__get_RawDatasets_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/RawDatasets/isValid":{"post":{"tags":["RawDataset"],"summary":"Check if data is valid according to a schema","operationId":"RawDataset.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/RawDatasets/resetArchiveStatus":{"post":{"tags":["RawDataset"],"summary":"Delete datablocks of dataset and reset status message","operationId":"RawDataset.reset","parameters":[{"name":"datasetId","in":"formData","required":false,"type":"string"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"result":{"type":"string"}}}}},"deprecated":false}},"/RawDatasets/facet":{"post":{"tags":["RawDataset"],"summary":"Search for numbers associated with dataset properties. I.e. How many datasets in Group A. Default returns: Creation Location, Owner Groups and Creation Time","operationId":"RawDataset.facet","parameters":[{"name":"fields","in":"formData","description":"Define the fields to search by, these will be mapped to the Dataset object and ensure the fields exist. There is also support for a `text` search to look for keywords. Can be undefined.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"formData","description":"This should be an array of objects with the structure: {name: key in mongo (without $ prefix), type: date|text|etc, preConditions: object to include in the query (i.e. unwind)}","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"results":{"type":"object"}}}}},"deprecated":false}},"/DerivedDatasets/{id}/datasetlifecycle":{"get":{"tags":["DerivedDataset"],"summary":"Fetches hasOne relation datasetlifecycle.","operationId":"DerivedDataset.prototype.__get__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"post":{"tags":["DerivedDataset"],"summary":"Creates a new instance in datasetlifecycle of this model.","operationId":"DerivedDataset.prototype.__create__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Update datasetlifecycle of this model.","operationId":"DerivedDataset.prototype.__update__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Deletes datasetlifecycle of this model.","operationId":"DerivedDataset.prototype.__destroy__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DerivedDatasets/{id}/datablocks/{fk}":{"get":{"tags":["DerivedDataset"],"summary":"Find a related item by id for datablocks.","operationId":"DerivedDataset.prototype.__findById__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Delete a related item by id for datablocks.","operationId":"DerivedDataset.prototype.__destroyById__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Update a related item by id for datablocks.","operationId":"DerivedDataset.prototype.__updateById__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/DerivedDatasets/{id}/datasetattachments/{fk}":{"get":{"tags":["DerivedDataset"],"summary":"Find a related item by id for datasetattachments.","operationId":"DerivedDataset.prototype.__findById__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Delete a related item by id for datasetattachments.","operationId":"DerivedDataset.prototype.__destroyById__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Update a related item by id for datasetattachments.","operationId":"DerivedDataset.prototype.__updateById__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DerivedDatasets/{id}/origdatablocks/{fk}":{"get":{"tags":["DerivedDataset"],"summary":"Find a related item by id for origdatablocks.","operationId":"DerivedDataset.prototype.__findById__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Delete a related item by id for origdatablocks.","operationId":"DerivedDataset.prototype.__destroyById__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Update a related item by id for origdatablocks.","operationId":"DerivedDataset.prototype.__updateById__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/DerivedDatasets/{id}/datablocks":{"get":{"tags":["DerivedDataset"],"summary":"Queries datablocks of DerivedDataset.","operationId":"DerivedDataset.prototype.__get__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Datablock"}}}},"deprecated":false},"post":{"tags":["DerivedDataset"],"summary":"Creates a new instance in datablocks of this model.","operationId":"DerivedDataset.prototype.__create__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Deletes all datablocks of this model.","operationId":"DerivedDataset.prototype.__delete__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DerivedDatasets/{id}/datablocks/count":{"get":{"tags":["DerivedDataset"],"summary":"Counts datablocks of DerivedDataset.","operationId":"DerivedDataset.prototype.__count__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets/{id}/datasetattachments":{"get":{"tags":["DerivedDataset"],"summary":"Queries datasetattachments of DerivedDataset.","operationId":"DerivedDataset.prototype.__get__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetAttachment"}}}},"deprecated":false},"post":{"tags":["DerivedDataset"],"summary":"Creates a new instance in datasetattachments of this model.","operationId":"DerivedDataset.prototype.__create__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Deletes all datasetattachments of this model.","operationId":"DerivedDataset.prototype.__delete__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DerivedDatasets/{id}/datasetattachments/count":{"get":{"tags":["DerivedDataset"],"summary":"Counts datasetattachments of DerivedDataset.","operationId":"DerivedDataset.prototype.__count__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets/{id}/origdatablocks":{"get":{"tags":["DerivedDataset"],"summary":"Queries origdatablocks of DerivedDataset.","operationId":"DerivedDataset.prototype.__get__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/OrigDatablock"}}}},"deprecated":false},"post":{"tags":["DerivedDataset"],"summary":"Creates a new instance in origdatablocks of this model.","operationId":"DerivedDataset.prototype.__create__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Deletes all origdatablocks of this model.","operationId":"DerivedDataset.prototype.__delete__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DerivedDatasets/{id}/origdatablocks/count":{"get":{"tags":["DerivedDataset"],"summary":"Counts origdatablocks of DerivedDataset.","operationId":"DerivedDataset.prototype.__count__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets":{"post":{"tags":["DerivedDataset"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"DerivedDataset.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"patch":{"tags":["DerivedDataset"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"DerivedDataset.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DerivedDataset.replaceOrCreate__put_DerivedDatasets","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"get":{"tags":["DerivedDataset"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"DerivedDataset.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DerivedDataset"}}}},"deprecated":false}},"/DerivedDatasets/replaceOrCreate":{"post":{"tags":["DerivedDataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DerivedDataset.replaceOrCreate__post_DerivedDatasets_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/upsertWithWhere":{"post":{"tags":["DerivedDataset"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"DerivedDataset.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/{id}/exists":{"get":{"tags":["DerivedDataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"DerivedDataset.exists__get_DerivedDatasets_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/DerivedDatasets/{id}":{"head":{"tags":["DerivedDataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"DerivedDataset.exists__head_DerivedDatasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["DerivedDataset"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"DerivedDataset.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DerivedDataset.replaceById__put_DerivedDatasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"DerivedDataset.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["DerivedDataset"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"DerivedDataset.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/{id}/replace":{"post":{"tags":["DerivedDataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DerivedDataset.replaceById__post_DerivedDatasets_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/findOne":{"get":{"tags":["DerivedDataset"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"DerivedDataset.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/update":{"post":{"tags":["DerivedDataset"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"DerivedDataset.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets/count":{"get":{"tags":["DerivedDataset"],"summary":"Count instances of the model matched by where from the data source.","operationId":"DerivedDataset.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets/change-stream":{"post":{"tags":["DerivedDataset"],"summary":"Create a change stream.","operationId":"DerivedDataset.createChangeStream__post_DerivedDatasets_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["DerivedDataset"],"summary":"Create a change stream.","operationId":"DerivedDataset.createChangeStream__get_DerivedDatasets_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/DerivedDatasets/isValid":{"post":{"tags":["DerivedDataset"],"summary":"Check if data is valid according to a schema","operationId":"DerivedDataset.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/DerivedDatasets/resetArchiveStatus":{"post":{"tags":["DerivedDataset"],"summary":"Delete datablocks of dataset and reset status message","operationId":"DerivedDataset.reset","parameters":[{"name":"datasetId","in":"formData","required":false,"type":"string"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"result":{"type":"string"}}}}},"deprecated":false}},"/DerivedDatasets/facet":{"post":{"tags":["DerivedDataset"],"summary":"Search for numbers associated with dataset properties. I.e. How many datasets in Group A. Default returns: Creation Location, Owner Groups and Creation Time","operationId":"DerivedDataset.facet","parameters":[{"name":"fields","in":"formData","description":"Define the fields to search by, these will be mapped to the Dataset object and ensure the fields exist. There is also support for a `text` search to look for keywords. Can be undefined.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"formData","description":"This should be an array of objects with the structure: {name: key in mongo (without $ prefix), type: date|text|etc, preConditions: object to include in the query (i.e. unwind)}","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"results":{"type":"object"}}}}},"deprecated":false}},"/Samples":{"post":{"tags":["Sample"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Sample.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"patch":{"tags":["Sample"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Sample.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"put":{"tags":["Sample"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Sample.replaceOrCreate__put_Samples","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"get":{"tags":["Sample"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Sample.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Sample"}}}},"deprecated":false}},"/Samples/replaceOrCreate":{"post":{"tags":["Sample"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Sample.replaceOrCreate__post_Samples_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/upsertWithWhere":{"post":{"tags":["Sample"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Sample.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/{id}/exists":{"get":{"tags":["Sample"],"summary":"Check whether a model instance exists in the data source.","operationId":"Sample.exists__get_Samples_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Samples/{id}":{"head":{"tags":["Sample"],"summary":"Check whether a model instance exists in the data source.","operationId":"Sample.exists__head_Samples_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Sample"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Sample.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"put":{"tags":["Sample"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Sample.replaceById__put_Samples_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"delete":{"tags":["Sample"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Sample.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Sample"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Sample.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Sample id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/{id}/replace":{"post":{"tags":["Sample"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Sample.replaceById__post_Samples_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/findOne":{"get":{"tags":["Sample"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Sample.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/update":{"post":{"tags":["Sample"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Sample.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Samples/count":{"get":{"tags":["Sample"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Sample.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Samples/change-stream":{"post":{"tags":["Sample"],"summary":"Create a change stream.","operationId":"Sample.createChangeStream__post_Samples_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Sample"],"summary":"Create a change stream.","operationId":"Sample.createChangeStream__get_Samples_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Samples/isValid":{"post":{"tags":["Sample"],"summary":"Check if data is valid according to a schema","operationId":"Sample.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Proposals/{id}/measurementPeriods/{fk}":{"get":{"tags":["Proposal"],"summary":"Find a related item by id for measurementPeriods.","operationId":"Proposal.prototype.__findById__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for measurementPeriods","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/MeasurementPeriod"}}},"deprecated":false},"delete":{"tags":["Proposal"],"summary":"Delete a related item by id for measurementPeriods.","operationId":"Proposal.prototype.__destroyById__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for measurementPeriods","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Proposal"],"summary":"Update a related item by id for measurementPeriods.","operationId":"Proposal.prototype.__updateById__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for measurementPeriods","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/MeasurementPeriod"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/MeasurementPeriod"}}},"deprecated":false}},"/Proposals/{id}/measurementPeriods":{"get":{"tags":["Proposal"],"summary":"Queries measurementPeriods of Proposal.","operationId":"Proposal.prototype.__get__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/MeasurementPeriod"}}}},"deprecated":false},"post":{"tags":["Proposal"],"summary":"Creates a new instance in measurementPeriods of this model.","operationId":"Proposal.prototype.__create__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/MeasurementPeriod"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/MeasurementPeriod"}}},"deprecated":false},"delete":{"tags":["Proposal"],"summary":"Deletes all measurementPeriods of this model.","operationId":"Proposal.prototype.__delete__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Proposals/{id}/measurementPeriods/count":{"get":{"tags":["Proposal"],"summary":"Counts measurementPeriods of Proposal.","operationId":"Proposal.prototype.__count__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Proposals":{"post":{"tags":["Proposal"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Proposal.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"patch":{"tags":["Proposal"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Proposal.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"put":{"tags":["Proposal"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Proposal.replaceOrCreate__put_Proposals","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"get":{"tags":["Proposal"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Proposal.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Proposal"}}}},"deprecated":false}},"/Proposals/replaceOrCreate":{"post":{"tags":["Proposal"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Proposal.replaceOrCreate__post_Proposals_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/upsertWithWhere":{"post":{"tags":["Proposal"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Proposal.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/{id}/exists":{"get":{"tags":["Proposal"],"summary":"Check whether a model instance exists in the data source.","operationId":"Proposal.exists__get_Proposals_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Proposals/{id}":{"head":{"tags":["Proposal"],"summary":"Check whether a model instance exists in the data source.","operationId":"Proposal.exists__head_Proposals_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Proposal"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Proposal.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"put":{"tags":["Proposal"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Proposal.replaceById__put_Proposals_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"delete":{"tags":["Proposal"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Proposal.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Proposal"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Proposal.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/{id}/replace":{"post":{"tags":["Proposal"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Proposal.replaceById__post_Proposals_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/findOne":{"get":{"tags":["Proposal"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Proposal.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/update":{"post":{"tags":["Proposal"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Proposal.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Proposals/count":{"get":{"tags":["Proposal"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Proposal.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Proposals/change-stream":{"post":{"tags":["Proposal"],"summary":"Create a change stream.","operationId":"Proposal.createChangeStream__post_Proposals_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Proposal"],"summary":"Create a change stream.","operationId":"Proposal.createChangeStream__get_Proposals_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Proposals/isValid":{"post":{"tags":["Proposal"],"summary":"Check if data is valid according to a schema","operationId":"Proposal.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Proposals/findByInstrumentAndDate":{"get":{"tags":["Proposal"],"summary":"Find proposal that took data at specified instrument and time","operationId":"Proposal.findByInstrumentAndDate","parameters":[{"name":"instrument","in":"query","required":false,"type":"string"},{"name":"measureTime","in":"query","required":false,"type":"string","format":"date-time"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"findByInstrumentAndDate":{"type":"object"}}}}},"deprecated":false}},"/Proposals/searchText":{"get":{"tags":["Proposal"],"summary":"Search text inside proposal","operationId":"Proposal.searchText","parameters":[],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"searchText":{"type":"object"}}}}},"deprecated":false}},"/DatasetLifecycles/{id}/dataset":{"get":{"tags":["DatasetLifecycle"],"summary":"Fetches belongsTo relation dataset.","operationId":"DatasetLifecycle.prototype.__get__dataset","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/DatasetLifecycles":{"post":{"tags":["DatasetLifecycle"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"DatasetLifecycle.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"put":{"tags":["DatasetLifecycle"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"DatasetLifecycle.patchOrCreate__put_DatasetLifecycles","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"patch":{"tags":["DatasetLifecycle"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"DatasetLifecycle.patchOrCreate__patch_DatasetLifecycles","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"get":{"tags":["DatasetLifecycle"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"DatasetLifecycle.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetLifecycle"}}}},"deprecated":false}},"/DatasetLifecycles/replaceOrCreate":{"post":{"tags":["DatasetLifecycle"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DatasetLifecycle.replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/upsertWithWhere":{"post":{"tags":["DatasetLifecycle"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"DatasetLifecycle.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/{id}/exists":{"get":{"tags":["DatasetLifecycle"],"summary":"Check whether a model instance exists in the data source.","operationId":"DatasetLifecycle.exists__get_DatasetLifecycles_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/DatasetLifecycles/{id}":{"head":{"tags":["DatasetLifecycle"],"summary":"Check whether a model instance exists in the data source.","operationId":"DatasetLifecycle.exists__head_DatasetLifecycles_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["DatasetLifecycle"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"DatasetLifecycle.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"delete":{"tags":["DatasetLifecycle"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"DatasetLifecycle.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"put":{"tags":["DatasetLifecycle"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"DatasetLifecycle.prototype.patchAttributes__put_DatasetLifecycles_{id}","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"patch":{"tags":["DatasetLifecycle"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"DatasetLifecycle.prototype.patchAttributes__patch_DatasetLifecycles_{id}","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/{id}/replace":{"post":{"tags":["DatasetLifecycle"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DatasetLifecycle.replaceById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/findOne":{"get":{"tags":["DatasetLifecycle"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"DatasetLifecycle.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/update":{"post":{"tags":["DatasetLifecycle"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"DatasetLifecycle.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetLifecycles/count":{"get":{"tags":["DatasetLifecycle"],"summary":"Count instances of the model matched by where from the data source.","operationId":"DatasetLifecycle.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetLifecycles/change-stream":{"post":{"tags":["DatasetLifecycle"],"summary":"Create a change stream.","operationId":"DatasetLifecycle.createChangeStream__post_DatasetLifecycles_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["DatasetLifecycle"],"summary":"Create a change stream.","operationId":"DatasetLifecycle.createChangeStream__get_DatasetLifecycles_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/DatasetLifecycles/isValid":{"post":{"tags":["DatasetLifecycle"],"summary":"Check if data is valid according to a schema","operationId":"DatasetLifecycle.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Datablocks/{id}/dataset":{"get":{"tags":["Datablock"],"summary":"Fetches belongsTo relation dataset.","operationId":"Datablock.prototype.__get__dataset","parameters":[{"name":"id","in":"path","description":"Datablock id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datablocks":{"post":{"tags":["Datablock"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Datablock.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"patch":{"tags":["Datablock"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Datablock.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"put":{"tags":["Datablock"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Datablock.replaceOrCreate__put_Datablocks","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"get":{"tags":["Datablock"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Datablock.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Datablock"}}}},"deprecated":false}},"/Datablocks/replaceOrCreate":{"post":{"tags":["Datablock"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Datablock.replaceOrCreate__post_Datablocks_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/upsertWithWhere":{"post":{"tags":["Datablock"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Datablock.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/{id}/exists":{"get":{"tags":["Datablock"],"summary":"Check whether a model instance exists in the data source.","operationId":"Datablock.exists__get_Datablocks_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Datablocks/{id}":{"head":{"tags":["Datablock"],"summary":"Check whether a model instance exists in the data source.","operationId":"Datablock.exists__head_Datablocks_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Datablock"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Datablock.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"put":{"tags":["Datablock"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Datablock.replaceById__put_Datablocks_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["Datablock"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Datablock.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Datablock"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Datablock.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Datablock id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/{id}/replace":{"post":{"tags":["Datablock"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Datablock.replaceById__post_Datablocks_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/findOne":{"get":{"tags":["Datablock"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Datablock.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/update":{"post":{"tags":["Datablock"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Datablock.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Datablocks/count":{"get":{"tags":["Datablock"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Datablock.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datablocks/change-stream":{"post":{"tags":["Datablock"],"summary":"Create a change stream.","operationId":"Datablock.createChangeStream__post_Datablocks_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Datablock"],"summary":"Create a change stream.","operationId":"Datablock.createChangeStream__get_Datablocks_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Datablocks/isValid":{"post":{"tags":["Datablock"],"summary":"Check if data is valid according to a schema","operationId":"Datablock.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/AccessUsers":{"post":{"tags":["AccessUser"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"AccessUser.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"patch":{"tags":["AccessUser"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"AccessUser.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"put":{"tags":["AccessUser"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"AccessUser.replaceOrCreate__put_AccessUsers","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"get":{"tags":["AccessUser"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"AccessUser.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/AccessUser"}}}},"deprecated":false}},"/AccessUsers/replaceOrCreate":{"post":{"tags":["AccessUser"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"AccessUser.replaceOrCreate__post_AccessUsers_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/upsertWithWhere":{"post":{"tags":["AccessUser"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"AccessUser.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/{id}/exists":{"get":{"tags":["AccessUser"],"summary":"Check whether a model instance exists in the data source.","operationId":"AccessUser.exists__get_AccessUsers_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/AccessUsers/{id}":{"head":{"tags":["AccessUser"],"summary":"Check whether a model instance exists in the data source.","operationId":"AccessUser.exists__head_AccessUsers_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["AccessUser"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"AccessUser.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"put":{"tags":["AccessUser"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"AccessUser.replaceById__put_AccessUsers_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"delete":{"tags":["AccessUser"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"AccessUser.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["AccessUser"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"AccessUser.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"AccessUser id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/{id}/replace":{"post":{"tags":["AccessUser"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"AccessUser.replaceById__post_AccessUsers_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/findOne":{"get":{"tags":["AccessUser"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"AccessUser.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/update":{"post":{"tags":["AccessUser"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"AccessUser.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/AccessUsers/count":{"get":{"tags":["AccessUser"],"summary":"Count instances of the model matched by where from the data source.","operationId":"AccessUser.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/AccessUsers/change-stream":{"post":{"tags":["AccessUser"],"summary":"Create a change stream.","operationId":"AccessUser.createChangeStream__post_AccessUsers_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["AccessUser"],"summary":"Create a change stream.","operationId":"AccessUser.createChangeStream__get_AccessUsers_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/AccessGroups":{"post":{"tags":["AccessGroup"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"AccessGroup.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"patch":{"tags":["AccessGroup"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"AccessGroup.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"put":{"tags":["AccessGroup"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"AccessGroup.replaceOrCreate__put_AccessGroups","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"get":{"tags":["AccessGroup"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"AccessGroup.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/AccessGroup"}}}},"deprecated":false}},"/AccessGroups/replaceOrCreate":{"post":{"tags":["AccessGroup"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"AccessGroup.replaceOrCreate__post_AccessGroups_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/upsertWithWhere":{"post":{"tags":["AccessGroup"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"AccessGroup.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/{id}/exists":{"get":{"tags":["AccessGroup"],"summary":"Check whether a model instance exists in the data source.","operationId":"AccessGroup.exists__get_AccessGroups_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/AccessGroups/{id}":{"head":{"tags":["AccessGroup"],"summary":"Check whether a model instance exists in the data source.","operationId":"AccessGroup.exists__head_AccessGroups_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["AccessGroup"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"AccessGroup.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"put":{"tags":["AccessGroup"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"AccessGroup.replaceById__put_AccessGroups_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"delete":{"tags":["AccessGroup"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"AccessGroup.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["AccessGroup"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"AccessGroup.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"AccessGroup id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/{id}/replace":{"post":{"tags":["AccessGroup"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"AccessGroup.replaceById__post_AccessGroups_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/findOne":{"get":{"tags":["AccessGroup"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"AccessGroup.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/update":{"post":{"tags":["AccessGroup"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"AccessGroup.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/AccessGroups/count":{"get":{"tags":["AccessGroup"],"summary":"Count instances of the model matched by where from the data source.","operationId":"AccessGroup.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/AccessGroups/change-stream":{"post":{"tags":["AccessGroup"],"summary":"Create a change stream.","operationId":"AccessGroup.createChangeStream__post_AccessGroups_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["AccessGroup"],"summary":"Create a change stream.","operationId":"AccessGroup.createChangeStream__get_AccessGroups_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/UserCredentials/{id}/user":{"get":{"tags":["UserCredential"],"summary":"Fetches belongsTo relation user.","operationId":"UserCredential.prototype.__get__user","parameters":[{"name":"id","in":"path","description":"UserCredential id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/UserCredentials":{"post":{"tags":["UserCredential"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"UserCredential.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"patch":{"tags":["UserCredential"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"UserCredential.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"put":{"tags":["UserCredential"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"UserCredential.replaceOrCreate__put_UserCredentials","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"get":{"tags":["UserCredential"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"UserCredential.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/UserCredential"}}}},"deprecated":false}},"/UserCredentials/replaceOrCreate":{"post":{"tags":["UserCredential"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"UserCredential.replaceOrCreate__post_UserCredentials_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/upsertWithWhere":{"post":{"tags":["UserCredential"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"UserCredential.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/{id}/exists":{"get":{"tags":["UserCredential"],"summary":"Check whether a model instance exists in the data source.","operationId":"UserCredential.exists__get_UserCredentials_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/UserCredentials/{id}":{"head":{"tags":["UserCredential"],"summary":"Check whether a model instance exists in the data source.","operationId":"UserCredential.exists__head_UserCredentials_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["UserCredential"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"UserCredential.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"put":{"tags":["UserCredential"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"UserCredential.replaceById__put_UserCredentials_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"delete":{"tags":["UserCredential"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"UserCredential.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["UserCredential"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"UserCredential.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"UserCredential id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/{id}/replace":{"post":{"tags":["UserCredential"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"UserCredential.replaceById__post_UserCredentials_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/findOne":{"get":{"tags":["UserCredential"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"UserCredential.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/update":{"post":{"tags":["UserCredential"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"UserCredential.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/UserCredentials/count":{"get":{"tags":["UserCredential"],"summary":"Count instances of the model matched by where from the data source.","operationId":"UserCredential.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/UserCredentials/change-stream":{"post":{"tags":["UserCredential"],"summary":"Create a change stream.","operationId":"UserCredential.createChangeStream__post_UserCredentials_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["UserCredential"],"summary":"Create a change stream.","operationId":"UserCredential.createChangeStream__get_UserCredentials_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/UserIdentities/{id}/user":{"get":{"tags":["UserIdentity"],"summary":"Fetches belongsTo relation user.","operationId":"UserIdentity.prototype.__get__user","parameters":[{"name":"id","in":"path","description":"UserIdentity id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/UserIdentities":{"post":{"tags":["UserIdentity"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"UserIdentity.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"patch":{"tags":["UserIdentity"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"UserIdentity.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"put":{"tags":["UserIdentity"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"UserIdentity.replaceOrCreate__put_UserIdentities","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"get":{"tags":["UserIdentity"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"UserIdentity.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/UserIdentity"}}}},"deprecated":false}},"/UserIdentities/replaceOrCreate":{"post":{"tags":["UserIdentity"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"UserIdentity.replaceOrCreate__post_UserIdentities_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/upsertWithWhere":{"post":{"tags":["UserIdentity"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"UserIdentity.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/{id}/exists":{"get":{"tags":["UserIdentity"],"summary":"Check whether a model instance exists in the data source.","operationId":"UserIdentity.exists__get_UserIdentities_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/UserIdentities/{id}":{"head":{"tags":["UserIdentity"],"summary":"Check whether a model instance exists in the data source.","operationId":"UserIdentity.exists__head_UserIdentities_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["UserIdentity"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"UserIdentity.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"put":{"tags":["UserIdentity"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"UserIdentity.replaceById__put_UserIdentities_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"delete":{"tags":["UserIdentity"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"UserIdentity.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["UserIdentity"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"UserIdentity.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"UserIdentity id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/{id}/replace":{"post":{"tags":["UserIdentity"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"UserIdentity.replaceById__post_UserIdentities_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/findOne":{"get":{"tags":["UserIdentity"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"UserIdentity.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/update":{"post":{"tags":["UserIdentity"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"UserIdentity.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/UserIdentities/count":{"get":{"tags":["UserIdentity"],"summary":"Count instances of the model matched by where from the data source.","operationId":"UserIdentity.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/UserIdentities/change-stream":{"post":{"tags":["UserIdentity"],"summary":"Create a change stream.","operationId":"UserIdentity.createChangeStream__post_UserIdentities_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["UserIdentity"],"summary":"Create a change stream.","operationId":"UserIdentity.createChangeStream__get_UserIdentities_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/ApplicationCredentials":{"post":{"tags":["ApplicationCredential"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"ApplicationCredential.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"patch":{"tags":["ApplicationCredential"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"ApplicationCredential.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"put":{"tags":["ApplicationCredential"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"ApplicationCredential.replaceOrCreate__put_ApplicationCredentials","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"get":{"tags":["ApplicationCredential"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"ApplicationCredential.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/ApplicationCredential"}}}},"deprecated":false}},"/ApplicationCredentials/replaceOrCreate":{"post":{"tags":["ApplicationCredential"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"ApplicationCredential.replaceOrCreate__post_ApplicationCredentials_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/upsertWithWhere":{"post":{"tags":["ApplicationCredential"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"ApplicationCredential.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/{id}/exists":{"get":{"tags":["ApplicationCredential"],"summary":"Check whether a model instance exists in the data source.","operationId":"ApplicationCredential.exists__get_ApplicationCredentials_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/ApplicationCredentials/{id}":{"head":{"tags":["ApplicationCredential"],"summary":"Check whether a model instance exists in the data source.","operationId":"ApplicationCredential.exists__head_ApplicationCredentials_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["ApplicationCredential"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"ApplicationCredential.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"put":{"tags":["ApplicationCredential"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"ApplicationCredential.replaceById__put_ApplicationCredentials_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"delete":{"tags":["ApplicationCredential"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"ApplicationCredential.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["ApplicationCredential"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"ApplicationCredential.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"ApplicationCredential id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/{id}/replace":{"post":{"tags":["ApplicationCredential"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"ApplicationCredential.replaceById__post_ApplicationCredentials_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/findOne":{"get":{"tags":["ApplicationCredential"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"ApplicationCredential.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/update":{"post":{"tags":["ApplicationCredential"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"ApplicationCredential.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/ApplicationCredentials/count":{"get":{"tags":["ApplicationCredential"],"summary":"Count instances of the model matched by where from the data source.","operationId":"ApplicationCredential.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/ApplicationCredentials/change-stream":{"post":{"tags":["ApplicationCredential"],"summary":"Create a change stream.","operationId":"ApplicationCredential.createChangeStream__post_ApplicationCredentials_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["ApplicationCredential"],"summary":"Create a change stream.","operationId":"ApplicationCredential.createChangeStream__get_ApplicationCredentials_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Policies":{"post":{"tags":["Policy"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Policy.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"patch":{"tags":["Policy"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Policy.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"put":{"tags":["Policy"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Policy.replaceOrCreate__put_Policies","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"get":{"tags":["Policy"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Policy.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Policy"}}}},"deprecated":false}},"/Policies/replaceOrCreate":{"post":{"tags":["Policy"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Policy.replaceOrCreate__post_Policies_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/upsertWithWhere":{"post":{"tags":["Policy"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Policy.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/{id}/exists":{"get":{"tags":["Policy"],"summary":"Check whether a model instance exists in the data source.","operationId":"Policy.exists__get_Policies_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Policies/{id}":{"head":{"tags":["Policy"],"summary":"Check whether a model instance exists in the data source.","operationId":"Policy.exists__head_Policies_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Policy"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Policy.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"put":{"tags":["Policy"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Policy.replaceById__put_Policies_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"delete":{"tags":["Policy"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Policy.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Policy"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Policy.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Policy id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/{id}/replace":{"post":{"tags":["Policy"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Policy.replaceById__post_Policies_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/findOne":{"get":{"tags":["Policy"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Policy.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/update":{"post":{"tags":["Policy"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Policy.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Policies/count":{"get":{"tags":["Policy"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Policy.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Policies/change-stream":{"post":{"tags":["Policy"],"summary":"Create a change stream.","operationId":"Policy.createChangeStream__post_Policies_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Policy"],"summary":"Create a change stream.","operationId":"Policy.createChangeStream__get_Policies_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Policies/isValid":{"post":{"tags":["Policy"],"summary":"Check if data is valid according to a schema","operationId":"Policy.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Jobs":{"post":{"tags":["Job"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Job.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"put":{"tags":["Job"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Job.patchOrCreate__put_Jobs","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"patch":{"tags":["Job"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Job.patchOrCreate__patch_Jobs","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"get":{"tags":["Job"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Job.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Job"}}}},"deprecated":false}},"/Jobs/replaceOrCreate":{"post":{"tags":["Job"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Job.replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/upsertWithWhere":{"post":{"tags":["Job"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Job.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/{id}/exists":{"get":{"tags":["Job"],"summary":"Check whether a model instance exists in the data source.","operationId":"Job.exists__get_Jobs_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Jobs/{id}":{"head":{"tags":["Job"],"summary":"Check whether a model instance exists in the data source.","operationId":"Job.exists__head_Jobs_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Job"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Job.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"delete":{"tags":["Job"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Job.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"put":{"tags":["Job"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Job.prototype.patchAttributes__put_Jobs_{id}","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"patch":{"tags":["Job"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Job.prototype.patchAttributes__patch_Jobs_{id}","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/{id}/replace":{"post":{"tags":["Job"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Job.replaceById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/findOne":{"get":{"tags":["Job"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Job.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/update":{"post":{"tags":["Job"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Job.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Jobs/count":{"get":{"tags":["Job"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Job.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Jobs/change-stream":{"post":{"tags":["Job"],"summary":"Create a change stream.","operationId":"Job.createChangeStream__post_Jobs_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Job"],"summary":"Create a change stream.","operationId":"Job.createChangeStream__get_Jobs_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/DatasetAttachments/{id}/dataset":{"get":{"tags":["DatasetAttachment"],"summary":"Fetches belongsTo relation dataset.","operationId":"DatasetAttachment.prototype.__get__dataset","parameters":[{"name":"id","in":"path","description":"DatasetAttachment id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/DatasetAttachments":{"post":{"tags":["DatasetAttachment"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"DatasetAttachment.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"patch":{"tags":["DatasetAttachment"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"DatasetAttachment.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"put":{"tags":["DatasetAttachment"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DatasetAttachment.replaceOrCreate__put_DatasetAttachments","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"get":{"tags":["DatasetAttachment"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"DatasetAttachment.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetAttachment"}}}},"deprecated":false}},"/DatasetAttachments/replaceOrCreate":{"post":{"tags":["DatasetAttachment"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DatasetAttachment.replaceOrCreate__post_DatasetAttachments_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/upsertWithWhere":{"post":{"tags":["DatasetAttachment"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"DatasetAttachment.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/{id}/exists":{"get":{"tags":["DatasetAttachment"],"summary":"Check whether a model instance exists in the data source.","operationId":"DatasetAttachment.exists__get_DatasetAttachments_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/DatasetAttachments/{id}":{"head":{"tags":["DatasetAttachment"],"summary":"Check whether a model instance exists in the data source.","operationId":"DatasetAttachment.exists__head_DatasetAttachments_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["DatasetAttachment"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"DatasetAttachment.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"put":{"tags":["DatasetAttachment"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DatasetAttachment.replaceById__put_DatasetAttachments_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["DatasetAttachment"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"DatasetAttachment.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["DatasetAttachment"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"DatasetAttachment.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"DatasetAttachment id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/{id}/replace":{"post":{"tags":["DatasetAttachment"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DatasetAttachment.replaceById__post_DatasetAttachments_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/findOne":{"get":{"tags":["DatasetAttachment"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"DatasetAttachment.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/update":{"post":{"tags":["DatasetAttachment"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"DatasetAttachment.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetAttachments/count":{"get":{"tags":["DatasetAttachment"],"summary":"Count instances of the model matched by where from the data source.","operationId":"DatasetAttachment.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetAttachments/change-stream":{"post":{"tags":["DatasetAttachment"],"summary":"Create a change stream.","operationId":"DatasetAttachment.createChangeStream__post_DatasetAttachments_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["DatasetAttachment"],"summary":"Create a change stream.","operationId":"DatasetAttachment.createChangeStream__get_DatasetAttachments_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/OrigDatablocks/{id}/dataset":{"get":{"tags":["OrigDatablock"],"summary":"Fetches belongsTo relation dataset.","operationId":"OrigDatablock.prototype.__get__dataset","parameters":[{"name":"id","in":"path","description":"OrigDatablock id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/OrigDatablocks":{"post":{"tags":["OrigDatablock"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"OrigDatablock.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"patch":{"tags":["OrigDatablock"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"OrigDatablock.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"put":{"tags":["OrigDatablock"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"OrigDatablock.replaceOrCreate__put_OrigDatablocks","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"get":{"tags":["OrigDatablock"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"OrigDatablock.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/OrigDatablock"}}}},"deprecated":false}},"/OrigDatablocks/replaceOrCreate":{"post":{"tags":["OrigDatablock"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"OrigDatablock.replaceOrCreate__post_OrigDatablocks_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/upsertWithWhere":{"post":{"tags":["OrigDatablock"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"OrigDatablock.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/{id}/exists":{"get":{"tags":["OrigDatablock"],"summary":"Check whether a model instance exists in the data source.","operationId":"OrigDatablock.exists__get_OrigDatablocks_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/OrigDatablocks/{id}":{"head":{"tags":["OrigDatablock"],"summary":"Check whether a model instance exists in the data source.","operationId":"OrigDatablock.exists__head_OrigDatablocks_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["OrigDatablock"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"OrigDatablock.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"put":{"tags":["OrigDatablock"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"OrigDatablock.replaceById__put_OrigDatablocks_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["OrigDatablock"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"OrigDatablock.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["OrigDatablock"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"OrigDatablock.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"OrigDatablock id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/{id}/replace":{"post":{"tags":["OrigDatablock"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"OrigDatablock.replaceById__post_OrigDatablocks_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/findOne":{"get":{"tags":["OrigDatablock"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"OrigDatablock.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/update":{"post":{"tags":["OrigDatablock"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"OrigDatablock.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/OrigDatablocks/count":{"get":{"tags":["OrigDatablock"],"summary":"Count instances of the model matched by where from the data source.","operationId":"OrigDatablock.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/OrigDatablocks/change-stream":{"post":{"tags":["OrigDatablock"],"summary":"Create a change stream.","operationId":"OrigDatablock.createChangeStream__post_OrigDatablocks_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["OrigDatablock"],"summary":"Create a change stream.","operationId":"OrigDatablock.createChangeStream__get_OrigDatablocks_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/OrigDatablocks/isValid":{"post":{"tags":["OrigDatablock"],"summary":"Check if data is valid according to a schema","operationId":"OrigDatablock.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}}},"tags":[{"name":"User"},{"name":"Dataset","description":"Stores the meta data information for a given collection of files. It defines a list of mandatory and optional metadata fields to be defined. Datasets have a PID field for unique identification. A DOI field can be added for publication purposes later. This is the base 'class' for derived documents like raw datasets or derived datasets. The type field is used to distinguish between the different types of datasets. For each dataset in addition a DatasetLifecycle and a OrigDatablock type of container can be created, giving additional information about the datasets lifecycles and its containing files."},{"name":"RawDataset","description":"Contains the information for datasets which are the result of measurements or of simulations. Often raw datasets are automatically added as part of an automated ingest step as part of the data acquisition chain at an instrument. This schema inherits the fields from the generic Dataset collection and adds specific fields as defined below."},{"name":"DerivedDataset","description":"Contains the information for datasets which are the result of an analysis step, typically based on raw datasets or other derived datasets as input. Derived datasets are typically added by the researcher pursuing the specific analysis. This schema inherits the fields from the generic Dataset collection and adds specific fields as defined below."},{"name":"Sample","description":"Models describing the characteristics of the samples to be investigated. Raw datasets should be linked to such sample definitions."},{"name":"Proposal","description":"Defines the purpose of an experiment and links an experiment to principal investigator and main proposer"},{"name":"DatasetLifecycle","description":"For each dataset there exists exactly one dataset lifecycle document which describes the current status of the dataset during its lifetime with respect to the storage handling systems"},{"name":"Datablock","description":"When archiving a dataset all files contained in the dataset are listed here together with their checksum information. Several datablocks can be created if the file listing is too long for a single datablock. This partitioning decision is done by the archiving system to allow for chunks of datablocks with managable sizes. E.g a dataset consisting of 10 TB of data could be split into 10 datablocks of about 1 TB each. The upper limit set by the data catalog system itself is given by the fact that documents must be smaller than 16 MB, which typically allows for datasets of about 100000 files."},{"name":"AccessUser"},{"name":"AccessGroup"},{"name":"UserCredential"},{"name":"UserIdentity"},{"name":"ApplicationCredential"},{"name":"Policy","description":"Definition of policy parameters relevant for the storgae lifecycle management of the datasets"},{"name":"Job","description":"This collection keeps information about jobs to be excuted in external systems. In particular it keeps information about the jobs submitted for archiving or retrieving datasets stored inside an archive system. It can also be used to keep track of analysis jobs e.g. for automated analysis workflows."},{"name":"DatasetAttachment","description":"Small less than 16 MB attchments for datasets, envisaged for png/jpeg previews"},{"name":"OrigDatablock","description":"Container list all files and their attributes which make up a dataset. Usually Filled at the time the datasets metadata is created in the data catalog. Can be used by subsequent archiving processes to create the archived datasets."}],"consumes":["application/json","application/x-www-form-urlencoded","application/xml","text/xml"],"produces":["application/json","application/xml","text/xml","application/javascript","text/javascript"],"definitions":{"x-any":{"properties":{}},"AccessToken":{"properties":{"id":{"type":"string"},"ttl":{"default":1209600,"description":"time to live in seconds (2 weeks by default)","type":"number","format":"double"},"scopes":{"description":"Array of scopes granted to this access token.","type":"array","items":{"type":"string"}},"created":{"type":"string","format":"date-time"},"userId":{"$ref":"#/definitions/ObjectID"}},"required":["id"],"additionalProperties":false},"User":{"properties":{"realm":{"type":"string"},"username":{"type":"string"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"id":{"$ref":"#/definitions/ObjectID"}},"required":["email"],"additionalProperties":false},"DatasetLifecycle":{"description":"For each dataset there exists exactly one dataset lifecycle document which describes the current status of the dataset during its lifetime with respect to the storage handling systems","properties":{"id":{"description":"ID of status information. This must be the ID of the associated dataset","type":"string"},"isOnDisk":{"description":"Flag which is true, if full dataset is available on disk","type":"boolean"},"isOnTape":{"description":"Flag which is true, if full dataset has been stored to tape","type":"boolean"},"archiveStatusMessage":{"description":"Current status of Dataset with respect to storage on disk/tape","type":"string"},"retrieveStatusMessage":{"description":"Latest message for this dataset concerning retrieve from archive system","type":"string"},"lastUpdateMessage":{"description":"Latest status update / transition message for this dataset","type":"string"},"archiveReturnMessage":{"description":"Detailed status or error message returned by archive system when treating this dataset","type":"string"},"dateOfLastMessage":{"description":"Time when last status message was sent. Format according to chapter 5.6 internet date/time format in RFC 3339. This will be filled automatically if not provided. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"dateOfDiskPurging":{"description":"Day when dataset will be removed from disk, assuming that is already stored on tape.","type":"string","format":"date-time"},"archiveRetentionTime":{"description":"Day when the dataset's future fate will be evaluated again, e.g. to decide if the dataset can be deleted from archive.","type":"string","format":"date-time"},"isExported":{"description":"Flag is true if data was exported to another location","type":"boolean"},"exportedTo":{"description":"Location of the export destination","type":"string"},"dateOfPublishing":{"description":"Day when dataset is supposed to become public according to data policy","type":"string","format":"date-time"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"datasetId":{"type":"string"},"rawDatasetId":{"type":"string"},"derivedDatasetId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","ownerGroup"],"additionalProperties":false},"Datablock":{"description":"When archiving a dataset all files contained in the dataset are listed here together with their checksum information. Several datablocks can be created if the file listing is too long for a single datablock. This partitioning decision is done by the archiving system to allow for chunks of datablocks with managable sizes. E.g a dataset consisting of 10 TB of data could be split into 10 datablocks of about 1 TB each. The upper limit set by the data catalog system itself is given by the fact that documents must be smaller than 16 MB, which typically allows for datasets of about 100000 files.","properties":{"id":{"description":"Catalog internal UUIDv4 for datablock","type":"string"},"archiveId":{"description":"Unique identifier given bey archive system to the stored datablock. This id is used when data is retrieved back.","type":"string"},"size":{"description":"Total size in bytes of all files in datablock when unpacked","type":"number","format":"double"},"packedSize":{"description":"Size of datablock package file","type":"number","format":"double"},"chkAlg":{"description":"Algoritm used for calculation of checksums, e.g. sha2","type":"string"},"version":{"description":"Version string defining format of how data is packed and stored in archive","type":"string"},"dataFileList":{"type":"array","items":{"$ref":"#/definitions/Datafile"}},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"datasetId":{"type":"string"},"rawDatasetId":{"type":"string"},"derivedDatasetId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","archiveId","size","version","dataFileList","ownerGroup"],"additionalProperties":false},"DatasetAttachment":{"description":"Small less than 16 MB attchments for datasets, envisaged for png/jpeg previews","properties":{"thumbnail":{"default":"retrieve","description":"Contains a thumbnail preview in base64 encoded png format for a given dataset","type":"string"},"creationTime":{"description":"Time when job is created. Format according to chapter 5.6 internet date/time format in RFC 3339","type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"},"datasetId":{"type":"string"},"rawDatasetId":{"type":"string"},"derivedDatasetId":{"type":"string"}},"required":["thumbnail"],"additionalProperties":false},"OrigDatablock":{"description":"Container list all files and their attributes which make up a dataset. Usually Filled at the time the datasets metadata is created in the data catalog. Can be used by subsequent archiving processes to create the archived datasets.","properties":{"id":{"$ref":"#/definitions/ObjectID"},"size":{"description":"Total size in bytes of all files contained in the dataFileList","type":"number","format":"double"},"dataFileList":{"description":"List of files contained in the linked dataset. Files can be regular files, folders and softlinks. In case the linked dataset has a source *folder* all file paths are relative file paths. In the single file dataset case the path is the fullpath to the dataset file on the source system.","type":"array","items":{"$ref":"#/definitions/Datafile"}},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"datasetId":{"type":"string"},"rawDatasetId":{"type":"string"},"derivedDatasetId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["size","dataFileList","ownerGroup"],"additionalProperties":false},"Dataset":{"description":"Stores the meta data information for a given collection of files. It defines a list of mandatory and optional metadata fields to be defined. Datasets have a PID field for unique identification. A DOI field can be added for publication purposes later. This is the base 'class' for derived documents like raw datasets or derived datasets. The type field is used to distinguish between the different types of datasets. For each dataset in addition a DatasetLifecycle and a OrigDatablock type of container can be created, giving additional information about the datasets lifecycles and its containing files.","properties":{"pid":{"description":"Persistent Identifier for datasets derived from UUIDv4 and prepended automatically by site specific PID prefix like 20.500.12345/","type":"string"},"owner":{"description":"Owner of the data set, usually first name + lastname","type":"string"},"ownerEmail":{"description":"Email of owner of the data set","type":"string"},"orcidOfOwner":{"description":"ORCID of owner https://orcid.org if available","type":"string"},"contactEmail":{"description":"Email of contact person for this dataset","type":"string"},"sourceFolder":{"description":"Absolute file path on file server containing the files of this dataset, optionally including protocol and file server hostname, e.g. nfs://fileserver1.example.com/some/path/to/sourcefolder. In case of a single file dataset, e.g. HDF5 data file the string can also be the full path to this single file.","type":"string"},"size":{"description":"Total size of all source files contained in source folder on disk when unpacked","type":"number","format":"double"},"packedSize":{"description":"Total size of all datablock package files created for this dataset","type":"number","format":"double"},"creationTime":{"description":"Time when dataset became fully available on disk, i.e. all containing files have been written. Format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server.","type":"string","format":"date-time"},"type":{"description":"Characterize type of dataset, either 'base' or 'raw' or 'derived'. Autofilled","type":"string"},"validationStatus":{"description":"Defines a level of trust, e.g. a measure of how much data was verified or used by other persons","type":"string"},"keywords":{"description":"Array of tags associated with the meaning or contents of this dataset. Values should ideally come from defined vocabularies, taxonomies, ontologies or knowledge graphs","type":"array","items":{"type":"string"}},"description":{"description":"Free text explanation of contents of dataset","type":"string"},"userTargetLocation":{"description":"User choosable absolute virtual path where datasets are stored. Mainly used as a help for the enduser at dataset retrieval time to find the proper dataset. Will be prepended by p-group","type":"string"},"classification":{"description":"ACIA information about AUthenticity,COnfidentiality,INtegrity and AVailability requirements of dataset. E.g. AV(ailabilty)=medium could trigger the creation of a two tape copies. Format 'AV=medium,CO=low'","type":"string"},"license":{"description":"Name of license under which data can be used","type":"string"},"version":{"description":"Version of API used in creation of dataset","type":"string"},"doi":{"description":"Digital object Identifier like doi: used for publication purposes","type":"string"},"isPublished":{"description":"Flag is true when data are made publically available","type":"boolean"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["pid","owner","contactEmail","sourceFolder","creationTime","type","ownerGroup"],"additionalProperties":false},"Sample":{"description":"Models describing the characteristics of the samples to be investigated. Raw datasets should be linked to such sample definitions.","properties":{"samplelId":{"type":"string"},"owner":{"type":"string"},"description":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"sampleCharacteristics":{"type":"object"},"attachments":{"type":"array","items":{"type":"string"}},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["samplelId","ownerGroup"],"additionalProperties":false},"Proposal":{"description":"Defines the purpose of an experiment and links an experiment to principal investigator and main proposer","properties":{"proposalId":{"description":"Globally unique identifier of a proposal, eg. PID-prefix/internal-proposal-number. PID prefix is auto prepended","type":"string"},"pi_email":{"description":"Email of principal investigator","type":"string"},"pi_firstname":{"description":"First name of principal investigator","type":"string"},"pi_lastname":{"description":"Last name of principal investigator","type":"string"},"email":{"description":"Email of main proposer","type":"string"},"firstname":{"description":"First name of main proposer","type":"string"},"lastname":{"description":"Last name of main proposer","type":"string"},"title":{"type":"string"},"abstract":{"type":"string"},"attachments":{"description":"Array of URLs pointing to attached documents","type":"array","items":{"type":"string"}},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"MeasurementPeriodList":{"type":"array","items":{"$ref":"#/definitions/MeasurementPeriod"}}},"required":["proposalId","email","ownerGroup"],"additionalProperties":false},"RawDataset":{"description":"Contains the information for datasets which are the result of measurements or of simulations. Often raw datasets are automatically added as part of an automated ingest step as part of the data acquisition chain at an instrument. This schema inherits the fields from the generic Dataset collection and adds specific fields as defined below.","properties":{"principalInvestigator":{"description":"Email of principal investigator","type":"string"},"endTime":{"description":"Time of end of data taking for this dataset, format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"creationLocation":{"description":"Unique location identifier where data was taken, usually in the form /Site-name/facility-name/instrumentOrBeamline-name","type":"string"},"dataFormat":{"description":"Defines format of subsequent scientific meta data, e.g Nexus Version x.y","type":"string"},"scientificMetadata":{"description":"JSON object containing the scientific meta data","type":"object"},"pid":{"description":"Persistent Identifier for datasets derived from UUIDv4 and prepended automatically by site specific PID prefix like 20.500.12345/","type":"string"},"owner":{"description":"Owner of the data set, usually first name + lastname","type":"string"},"ownerEmail":{"description":"Email of owner of the data set","type":"string"},"orcidOfOwner":{"description":"ORCID of owner https://orcid.org if available","type":"string"},"contactEmail":{"description":"Email of contact person for this dataset","type":"string"},"sourceFolder":{"description":"Absolute file path on file server containing the files of this dataset, optionally including protocol and file server hostname, e.g. nfs://fileserver1.example.com/some/path/to/sourcefolder. In case of a single file dataset, e.g. HDF5 data file the string can also be the full path to this single file.","type":"string"},"size":{"description":"Total size of all source files contained in source folder on disk when unpacked","type":"number","format":"double"},"packedSize":{"description":"Total size of all datablock package files created for this dataset","type":"number","format":"double"},"creationTime":{"description":"Time when dataset became fully available on disk, i.e. all containing files have been written. Format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server.","type":"string","format":"date-time"},"type":{"description":"Characterize type of dataset, either 'base' or 'raw' or 'derived'. Autofilled","type":"string"},"validationStatus":{"description":"Defines a level of trust, e.g. a measure of how much data was verified or used by other persons","type":"string"},"keywords":{"description":"Array of tags associated with the meaning or contents of this dataset. Values should ideally come from defined vocabularies, taxonomies, ontologies or knowledge graphs","type":"array","items":{"type":"string"}},"description":{"description":"Free text explanation of contents of dataset","type":"string"},"userTargetLocation":{"description":"User choosable absolute virtual path where datasets are stored. Mainly used as a help for the enduser at dataset retrieval time to find the proper dataset. Will be prepended by p-group","type":"string"},"classification":{"description":"ACIA information about AUthenticity,COnfidentiality,INtegrity and AVailability requirements of dataset. E.g. AV(ailabilty)=medium could trigger the creation of a two tape copies. Format 'AV=medium,CO=low'","type":"string"},"license":{"description":"Name of license under which data can be used","type":"string"},"version":{"description":"Version of API used in creation of dataset","type":"string"},"doi":{"description":"Digital object Identifier like doi: used for publication purposes","type":"string"},"isPublished":{"description":"Flag is true when data are made publically available","type":"boolean"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"sampleId":{"type":"string"},"proposalId":{"type":"string"}},"required":["principalInvestigator","creationLocation","pid","owner","contactEmail","sourceFolder","creationTime","type","ownerGroup"],"additionalProperties":false},"DerivedDataset":{"description":"Contains the information for datasets which are the result of an analysis step, typically based on raw datasets or other derived datasets as input. Derived datasets are typically added by the researcher pursuing the specific analysis. This schema inherits the fields from the generic Dataset collection and adds specific fields as defined below.","properties":{"investigator":{"description":"Email of person pursuing the data analysis","type":"string"},"inputDatasets":{"description":"Array of input dataset identifiers used in producing the derived dataset. Ideally these are the global identifier to existing datasets inside this or federated data catalogs","type":"array","items":{"type":"string"}},"usedSoftware":{"description":"A list of links to software repositories which uniquely identifies the software used and the version for yielding the derived data","type":"array","items":{"type":"string"}},"jobParameters":{"description":"The creation process of the drived data will usually depend on input job parameters. The full structure of these input parameters are stored here","type":"object"},"jobLogData":{"description":"The output job logfile. Keep the size of this log data well below 15 MB ","type":"string"},"pid":{"description":"Persistent Identifier for datasets derived from UUIDv4 and prepended automatically by site specific PID prefix like 20.500.12345/","type":"string"},"owner":{"description":"Owner of the data set, usually first name + lastname","type":"string"},"ownerEmail":{"description":"Email of owner of the data set","type":"string"},"orcidOfOwner":{"description":"ORCID of owner https://orcid.org if available","type":"string"},"contactEmail":{"description":"Email of contact person for this dataset","type":"string"},"sourceFolder":{"description":"Absolute file path on file server containing the files of this dataset, optionally including protocol and file server hostname, e.g. nfs://fileserver1.example.com/some/path/to/sourcefolder. In case of a single file dataset, e.g. HDF5 data file the string can also be the full path to this single file.","type":"string"},"size":{"description":"Total size of all source files contained in source folder on disk when unpacked","type":"number","format":"double"},"packedSize":{"description":"Total size of all datablock package files created for this dataset","type":"number","format":"double"},"creationTime":{"description":"Time when dataset became fully available on disk, i.e. all containing files have been written. Format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server.","type":"string","format":"date-time"},"type":{"description":"Characterize type of dataset, either 'base' or 'raw' or 'derived'. Autofilled","type":"string"},"validationStatus":{"description":"Defines a level of trust, e.g. a measure of how much data was verified or used by other persons","type":"string"},"keywords":{"description":"Array of tags associated with the meaning or contents of this dataset. Values should ideally come from defined vocabularies, taxonomies, ontologies or knowledge graphs","type":"array","items":{"type":"string"}},"description":{"description":"Free text explanation of contents of dataset","type":"string"},"userTargetLocation":{"description":"User choosable absolute virtual path where datasets are stored. Mainly used as a help for the enduser at dataset retrieval time to find the proper dataset. Will be prepended by p-group","type":"string"},"classification":{"description":"ACIA information about AUthenticity,COnfidentiality,INtegrity and AVailability requirements of dataset. E.g. AV(ailabilty)=medium could trigger the creation of a two tape copies. Format 'AV=medium,CO=low'","type":"string"},"license":{"description":"Name of license under which data can be used","type":"string"},"version":{"description":"Version of API used in creation of dataset","type":"string"},"doi":{"description":"Digital object Identifier like doi: used for publication purposes","type":"string"},"isPublished":{"description":"Flag is true when data are made publically available","type":"boolean"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["investigator","inputDatasets","usedSoftware","pid","owner","contactEmail","sourceFolder","creationTime","type","ownerGroup"],"additionalProperties":false},"MeasurementPeriod":{"description":"Embedded information used inside proposals to define which type of experiment as to be pursued where (at which intrument) and when.","properties":{"id":{"description":"id currently needed by limitation in embedsmanny","type":"string"},"instrument":{"description":"Instrument or beamline identifier where measurement was pursued, e.g. /PSI/SLS/TOMCAT","type":"string"},"start":{"description":"Time when measurement period started, format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"end":{"description":"Time when measurement period ended, format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"comment":{"description":"Additional information relevant for this measurement period, e.g. if different accounts were used for data taking","type":"string"}},"required":["id","instrument"],"additionalProperties":false},"AccessUser":{"properties":{"sAMAccountName":{"type":"string"},"displayName":{"type":"string"},"description":{"type":"string"},"email":{"type":"string"},"memberOf":{"type":"array","items":{"type":"string"}}},"required":["sAMAccountName"],"additionalProperties":false},"AccessGroup":{"properties":{"sAMAccountName":{"type":"string"},"description":{"type":"string"},"member":{"type":"array","items":{"type":"string"}},"memberOf":{"type":"array","items":{"type":"string"}}},"required":["sAMAccountName"],"additionalProperties":false},"UserCredential":{"properties":{"provider":{"type":"string"},"authScheme":{"type":"string"},"externalId":{"type":"string"},"profile":{"type":"object"},"credentials":{"type":"object"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"},"userId":{"$ref":"#/definitions/ObjectID"}},"additionalProperties":false},"UserIdentity":{"properties":{"provider":{"type":"string"},"authScheme":{"type":"string"},"externalId":{"type":"string"},"profile":{"type":"object"},"credentials":{"type":"object"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"},"userId":{"$ref":"#/definitions/ObjectID"}},"additionalProperties":false},"ApplicationCredential":{"properties":{"provider":{"type":"string"},"authScheme":{"type":"string"},"credentials":{"type":"object"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"}},"required":["provider"],"additionalProperties":false},"Policy":{"description":"Definition of policy parameters relevant for the storgae lifecycle management of the datasets","properties":{"availability":{"default":"low","description":"Defines the level of redundancy in storage to minimize loss of data. Allowed values are low, medium, high. Low could e.g. mean one tape copy only, medium could mean two tape copies and high two geo-redundant tape copies","type":"string"},"tapeRetentionTime":{"default":10,"description":"Number of years after creation time, where datasets are subject to retention policies, possibly leading to deletion of data on tape.","type":"number","format":"double"},"autoArchiveDelay":{"default":7,"description":"Number of days after dataset creation that (remaining) datasets are archived automatically","type":"number","format":"double"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"id":{"$ref":"#/definitions/ObjectID"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["ownerGroup"],"additionalProperties":false},"Job":{"description":"This collection keeps information about jobs to be excuted in external systems. In particular it keeps information about the jobs submitted for archiving or retrieving datasets stored inside an archive system. It can also be used to keep track of analysis jobs e.g. for automated analysis workflows.","properties":{"emailJobInitiator":{"description":"The email of the person initiating the job request","type":"string"},"type":{"default":"retrieve","description":"Type of job, e.g. archive, retrieve etc","type":"string"},"creationTime":{"description":"Time when job is created. Format according to chapter 5.6 internet date/time format in RFC 3339","type":"string","format":"date-time"},"executionTime":{"description":"Time when job should be executed. If not specified then the Job will be executed asap. Format according to chapter 5.6 internet date/time format in RFC 3339","type":"string","format":"date-time"},"jobParams":{"description":"Object of key-value pairs defining job input parameters, e.g. 'desinationPath' for retrieve jobs or 'tapeCopies' for archive jobs","type":"object"},"jobStatusMessage":{"description":"Defines current status of job lifecycle","type":"string"},"archiveReturnMessage":{"description":"Detailed status or error message returned by archive system at archive job creation time. If One Job request triggers many archive requests, e.g. when archiving multiple datasets in one job, then this message contains the result of the last dataset handled","type":"string"},"dateOfLastMessage":{"description":"Time when last status message was sent. Format according to chapter 5.6 internet date/time format in RFC 3339. This will be filled automatically if not provided","type":"string","format":"date-time"},"datasetList":{"description":"Array of objects with keys: pid, files. The value for the pid key defines the dataset ID, the value for the files key is an array of file names. This array is either an empty array, implying that all files within the dataset are selected or an explicit list of dataset-relative file paths, which should be selected","type":"object"},"id":{"$ref":"#/definitions/ObjectID"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["emailJobInitiator","type","datasetList"],"additionalProperties":false},"ObjectID":{"type":"string","pattern":"^[a-fA-F\\d]{24}$"},"Datafile":{"description":"Embedded schema definition for which fields are required for each file","properties":{"path":{"description":"Relative path of the file within the dataset folder","type":"string"},"size":{"description":"Uncompressed file size in bytes","type":"number","format":"double"},"time":{"description":"Time of file creation on disk, format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"chk":{"description":"Checksum for the file, e.g. its sha-2 hashstring","type":"string"},"uid":{"description":"optional: user ID name as seen on filesystem","type":"string"},"gid":{"description":"optional: group ID name as seen on filesystem","type":"string"},"perm":{"description":"optional: Posix permission bits","type":"string"}},"required":["path"],"additionalProperties":false}}} \ No newline at end of file +{"swagger":"2.0","info":{"version":"2.8.1","title":"dacat-api","description":"dacat-api"},"basePath":"/api/v2","paths":{"/Users/{id}/accessTokens/{fk}":{"get":{"tags":["User"],"summary":"Find a related item by id for accessTokens.","operationId":"User.prototype.__findById__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for accessTokens","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessToken"}}},"deprecated":false},"delete":{"tags":["User"],"summary":"Delete a related item by id for accessTokens.","operationId":"User.prototype.__destroyById__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for accessTokens","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["User"],"summary":"Update a related item by id for accessTokens.","operationId":"User.prototype.__updateById__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for accessTokens","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/AccessToken"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessToken"}}},"deprecated":false}},"/Users/{id}/accessTokens":{"get":{"tags":["User"],"summary":"Queries accessTokens of User.","operationId":"User.prototype.__get__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/AccessToken"}}}},"deprecated":false},"post":{"tags":["User"],"summary":"Creates a new instance in accessTokens of this model.","operationId":"User.prototype.__create__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/AccessToken"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessToken"}}},"deprecated":false},"delete":{"tags":["User"],"summary":"Deletes all accessTokens of this model.","operationId":"User.prototype.__delete__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/{id}/accessTokens/count":{"get":{"tags":["User"],"summary":"Counts accessTokens of User.","operationId":"User.prototype.__count__accessTokens","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Users":{"post":{"tags":["User"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"User.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"patch":{"tags":["User"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"User.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"put":{"tags":["User"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"User.replaceOrCreate__put_Users","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"get":{"tags":["User"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"User.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/User"}}}},"deprecated":false}},"/Users/replaceOrCreate":{"post":{"tags":["User"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"User.replaceOrCreate__post_Users_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/upsertWithWhere":{"post":{"tags":["User"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"User.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/{id}/exists":{"get":{"tags":["User"],"summary":"Check whether a model instance exists in the data source.","operationId":"User.exists__get_Users_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Users/{id}":{"head":{"tags":["User"],"summary":"Check whether a model instance exists in the data source.","operationId":"User.exists__head_Users_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["User"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"User.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"put":{"tags":["User"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"User.replaceById__put_Users_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false},"delete":{"tags":["User"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"User.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["User"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"User.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/{id}/replace":{"post":{"tags":["User"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"User.replaceById__post_Users_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/findOne":{"get":{"tags":["User"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"User.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/Users/update":{"post":{"tags":["User"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"User.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/User"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Users/count":{"get":{"tags":["User"],"summary":"Count instances of the model matched by where from the data source.","operationId":"User.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Users/change-stream":{"post":{"tags":["User"],"summary":"Create a change stream.","operationId":"User.createChangeStream__post_Users_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["User"],"summary":"Create a change stream.","operationId":"User.createChangeStream__get_Users_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Users/login":{"post":{"tags":["User"],"summary":"Login a user with username/email and password.","operationId":"User.login","parameters":[{"name":"credentials","in":"body","required":true,"schema":{"type":"object"}},{"name":"include","in":"query","description":"Related objects to include in the response. See the description of return value for more details.","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"description":"The response body contains properties of the AccessToken created on login.\nDepending on the value of `include` parameter, the body may contain additional properties:\n\n - `user` - `U+007BUserU+007D` - Data of the currently logged in user. (`include=user`)\n\n","type":"object"}}},"deprecated":false}},"/Users/logout":{"post":{"tags":["User"],"summary":"Logout a user with access token.","operationId":"User.logout","parameters":[],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/{id}/verify":{"post":{"tags":["User"],"summary":"Trigger user's identity verification with configured verifyOptions","operationId":"User.prototype.verify","parameters":[{"name":"id","in":"path","description":"User id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/confirm":{"get":{"tags":["User"],"summary":"Confirm a user registration with identity verification token.","operationId":"User.confirm","parameters":[{"name":"uid","in":"query","required":true,"type":"string"},{"name":"token","in":"query","required":true,"type":"string"},{"name":"redirect","in":"query","required":false,"type":"string"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/reset":{"post":{"tags":["User"],"summary":"Reset password for a user with email.","operationId":"User.resetPassword","parameters":[{"name":"options","in":"body","required":true,"schema":{"type":"object"}}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/change-password":{"post":{"tags":["User"],"summary":"Change a user's password.","operationId":"User.changePassword","parameters":[{"name":"oldPassword","in":"formData","required":true,"type":"string"},{"name":"newPassword","in":"formData","required":true,"type":"string"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Users/reset-password":{"post":{"tags":["User"],"summary":"Reset user's password via a password-reset token.","operationId":"User.setPassword","parameters":[{"name":"newPassword","in":"formData","required":true,"type":"string"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/datasetlifecycle":{"get":{"tags":["Dataset"],"summary":"Fetches hasOne relation datasetlifecycle.","operationId":"Dataset.prototype.__get__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"post":{"tags":["Dataset"],"summary":"Creates a new instance in datasetlifecycle of this model.","operationId":"Dataset.prototype.__create__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Update datasetlifecycle of this model.","operationId":"Dataset.prototype.__update__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Deletes datasetlifecycle of this model.","operationId":"Dataset.prototype.__destroy__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/datablocks/{fk}":{"get":{"tags":["Dataset"],"summary":"Find a related item by id for datablocks.","operationId":"Dataset.prototype.__findById__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Delete a related item by id for datablocks.","operationId":"Dataset.prototype.__destroyById__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Update a related item by id for datablocks.","operationId":"Dataset.prototype.__updateById__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datasets/{id}/datasetattachments/{fk}":{"get":{"tags":["Dataset"],"summary":"Find a related item by id for datasetattachments.","operationId":"Dataset.prototype.__findById__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Delete a related item by id for datasetattachments.","operationId":"Dataset.prototype.__destroyById__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Update a related item by id for datasetattachments.","operationId":"Dataset.prototype.__updateById__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/Datasets/{id}/origdatablocks/{fk}":{"get":{"tags":["Dataset"],"summary":"Find a related item by id for origdatablocks.","operationId":"Dataset.prototype.__findById__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Delete a related item by id for origdatablocks.","operationId":"Dataset.prototype.__destroyById__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Update a related item by id for origdatablocks.","operationId":"Dataset.prototype.__updateById__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/Datasets/{id}/datablocks":{"get":{"tags":["Dataset"],"summary":"Queries datablocks of Dataset.","operationId":"Dataset.prototype.__get__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Datablock"}}}},"deprecated":false},"post":{"tags":["Dataset"],"summary":"Creates a new instance in datablocks of this model.","operationId":"Dataset.prototype.__create__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Deletes all datablocks of this model.","operationId":"Dataset.prototype.__delete__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/datablocks/count":{"get":{"tags":["Dataset"],"summary":"Counts datablocks of Dataset.","operationId":"Dataset.prototype.__count__datablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets/{id}/datasetattachments":{"get":{"tags":["Dataset"],"summary":"Queries datasetattachments of Dataset.","operationId":"Dataset.prototype.__get__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetAttachment"}}}},"deprecated":false},"post":{"tags":["Dataset"],"summary":"Creates a new instance in datasetattachments of this model.","operationId":"Dataset.prototype.__create__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Deletes all datasetattachments of this model.","operationId":"Dataset.prototype.__delete__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/datasetattachments/count":{"get":{"tags":["Dataset"],"summary":"Counts datasetattachments of Dataset.","operationId":"Dataset.prototype.__count__datasetattachments","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets/{id}/origdatablocks":{"get":{"tags":["Dataset"],"summary":"Queries origdatablocks of Dataset.","operationId":"Dataset.prototype.__get__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/OrigDatablock"}}}},"deprecated":false},"post":{"tags":["Dataset"],"summary":"Creates a new instance in origdatablocks of this model.","operationId":"Dataset.prototype.__create__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Deletes all origdatablocks of this model.","operationId":"Dataset.prototype.__delete__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Datasets/{id}/origdatablocks/count":{"get":{"tags":["Dataset"],"summary":"Counts origdatablocks of Dataset.","operationId":"Dataset.prototype.__count__origdatablocks","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets":{"post":{"tags":["Dataset"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Dataset.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"patch":{"tags":["Dataset"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Dataset.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Dataset.replaceOrCreate__put_Datasets","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"get":{"tags":["Dataset"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Dataset.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Dataset"}}}},"deprecated":false}},"/Datasets/replaceOrCreate":{"post":{"tags":["Dataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Dataset.replaceOrCreate__post_Datasets_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/upsertWithWhere":{"post":{"tags":["Dataset"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Dataset.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/{id}/exists":{"get":{"tags":["Dataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"Dataset.exists__get_Datasets_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Datasets/{id}":{"head":{"tags":["Dataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"Dataset.exists__head_Datasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Dataset"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Dataset.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"put":{"tags":["Dataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Dataset.replaceById__put_Datasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false},"delete":{"tags":["Dataset"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Dataset.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Dataset"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Dataset.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Dataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/{id}/replace":{"post":{"tags":["Dataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Dataset.replaceById__post_Datasets_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/findOne":{"get":{"tags":["Dataset"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Dataset.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datasets/update":{"post":{"tags":["Dataset"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Dataset.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Dataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets/count":{"get":{"tags":["Dataset"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Dataset.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datasets/change-stream":{"post":{"tags":["Dataset"],"summary":"Create a change stream.","operationId":"Dataset.createChangeStream__post_Datasets_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Dataset"],"summary":"Create a change stream.","operationId":"Dataset.createChangeStream__get_Datasets_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Datasets/isValid":{"post":{"tags":["Dataset"],"summary":"Check if data is valid according to a schema","operationId":"Dataset.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Datasets/resetArchiveStatus":{"post":{"tags":["Dataset"],"summary":"Delete datablocks of dataset and reset status message. Warning: to be oboleted, use reset call for DatasetLifecycle instead","operationId":"Dataset.reset","parameters":[{"name":"datasetId","in":"formData","required":false,"type":"string"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"result":{"type":"string"}}}}},"deprecated":false}},"/Datasets/facet":{"post":{"tags":["Dataset"],"summary":"Search for numbers associated with dataset properties. I.e. How many datasets in Group A. Default returns: Creation Location, Owner Groups and Creation Time","operationId":"Dataset.facet","parameters":[{"name":"fields","in":"formData","description":"Define the fields to search by, these will be mapped to the Dataset object and ensure the fields exist. There is also support for a `text` search to look for keywords. Can be undefined.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"formData","description":"This should be an array of objects with the structure: {name: key in mongo (without $ prefix), type: date|text|etc, preConditions: object to include in the query (i.e. unwind)}","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"results":{"type":"object"}}}}},"deprecated":false}},"/Datasets/fullfacet":{"get":{"tags":["Dataset"],"summary":"Return facet counts relevant for the given selected subset of datasets. ","operationId":"Dataset.fullfacet","parameters":[{"name":"fields","in":"query","description":"Define the filter conditions by specifying the name and values of fields. There ia also support for a `text` search to look for strngs anywhere in the dataset.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"query","description":"Defines list of field names, for which facet counts should be calculated","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Datasets/fullquery":{"get":{"tags":["Dataset"],"summary":"Return datasets fulfilling complex filter conditions, including from fields of joined models.","operationId":"Dataset.fullquery","parameters":[{"name":"fields","in":"query","description":"Define the filter conditions by specifying the name of values of fields requested. There ia also support for a `text` search to look for strings anywhere in the dataset. Skip and limit parameters allow for paging.","required":false,"type":"string","format":"JSON"},{"name":"limits","in":"query","description":"Define further query parameters like skip, limit, order","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/RawDatasets/{id}/sample":{"get":{"tags":["RawDataset"],"summary":"Fetches belongsTo relation sample.","operationId":"RawDataset.prototype.__get__sample","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/RawDatasets/{id}/proposal":{"get":{"tags":["RawDataset"],"summary":"Fetches belongsTo relation proposal.","operationId":"RawDataset.prototype.__get__proposal","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/RawDatasets/{id}/datasetlifecycle":{"get":{"tags":["RawDataset"],"summary":"Fetches hasOne relation datasetlifecycle.","operationId":"RawDataset.prototype.__get__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"post":{"tags":["RawDataset"],"summary":"Creates a new instance in datasetlifecycle of this model.","operationId":"RawDataset.prototype.__create__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Update datasetlifecycle of this model.","operationId":"RawDataset.prototype.__update__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Deletes datasetlifecycle of this model.","operationId":"RawDataset.prototype.__destroy__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/RawDatasets/{id}/datablocks/{fk}":{"get":{"tags":["RawDataset"],"summary":"Find a related item by id for datablocks.","operationId":"RawDataset.prototype.__findById__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Delete a related item by id for datablocks.","operationId":"RawDataset.prototype.__destroyById__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Update a related item by id for datablocks.","operationId":"RawDataset.prototype.__updateById__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/RawDatasets/{id}/datasetattachments/{fk}":{"get":{"tags":["RawDataset"],"summary":"Find a related item by id for datasetattachments.","operationId":"RawDataset.prototype.__findById__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Delete a related item by id for datasetattachments.","operationId":"RawDataset.prototype.__destroyById__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Update a related item by id for datasetattachments.","operationId":"RawDataset.prototype.__updateById__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/RawDatasets/{id}/origdatablocks/{fk}":{"get":{"tags":["RawDataset"],"summary":"Find a related item by id for origdatablocks.","operationId":"RawDataset.prototype.__findById__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Delete a related item by id for origdatablocks.","operationId":"RawDataset.prototype.__destroyById__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Update a related item by id for origdatablocks.","operationId":"RawDataset.prototype.__updateById__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/RawDatasets/{id}/datablocks":{"get":{"tags":["RawDataset"],"summary":"Queries datablocks of RawDataset.","operationId":"RawDataset.prototype.__get__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Datablock"}}}},"deprecated":false},"post":{"tags":["RawDataset"],"summary":"Creates a new instance in datablocks of this model.","operationId":"RawDataset.prototype.__create__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Deletes all datablocks of this model.","operationId":"RawDataset.prototype.__delete__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/RawDatasets/{id}/datablocks/count":{"get":{"tags":["RawDataset"],"summary":"Counts datablocks of RawDataset.","operationId":"RawDataset.prototype.__count__datablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets/{id}/datasetattachments":{"get":{"tags":["RawDataset"],"summary":"Queries datasetattachments of RawDataset.","operationId":"RawDataset.prototype.__get__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetAttachment"}}}},"deprecated":false},"post":{"tags":["RawDataset"],"summary":"Creates a new instance in datasetattachments of this model.","operationId":"RawDataset.prototype.__create__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Deletes all datasetattachments of this model.","operationId":"RawDataset.prototype.__delete__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/RawDatasets/{id}/datasetattachments/count":{"get":{"tags":["RawDataset"],"summary":"Counts datasetattachments of RawDataset.","operationId":"RawDataset.prototype.__count__datasetattachments","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets/{id}/origdatablocks":{"get":{"tags":["RawDataset"],"summary":"Queries origdatablocks of RawDataset.","operationId":"RawDataset.prototype.__get__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/OrigDatablock"}}}},"deprecated":false},"post":{"tags":["RawDataset"],"summary":"Creates a new instance in origdatablocks of this model.","operationId":"RawDataset.prototype.__create__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Deletes all origdatablocks of this model.","operationId":"RawDataset.prototype.__delete__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/RawDatasets/{id}/origdatablocks/count":{"get":{"tags":["RawDataset"],"summary":"Counts origdatablocks of RawDataset.","operationId":"RawDataset.prototype.__count__origdatablocks","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets":{"post":{"tags":["RawDataset"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"RawDataset.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"patch":{"tags":["RawDataset"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"RawDataset.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"RawDataset.replaceOrCreate__put_RawDatasets","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"get":{"tags":["RawDataset"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"RawDataset.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/RawDataset"}}}},"deprecated":false}},"/RawDatasets/replaceOrCreate":{"post":{"tags":["RawDataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"RawDataset.replaceOrCreate__post_RawDatasets_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/upsertWithWhere":{"post":{"tags":["RawDataset"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"RawDataset.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/{id}/exists":{"get":{"tags":["RawDataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"RawDataset.exists__get_RawDatasets_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/RawDatasets/{id}":{"head":{"tags":["RawDataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"RawDataset.exists__head_RawDatasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["RawDataset"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"RawDataset.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"put":{"tags":["RawDataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"RawDataset.replaceById__put_RawDatasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false},"delete":{"tags":["RawDataset"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"RawDataset.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["RawDataset"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"RawDataset.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"RawDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/{id}/replace":{"post":{"tags":["RawDataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"RawDataset.replaceById__post_RawDatasets_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/findOne":{"get":{"tags":["RawDataset"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"RawDataset.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/RawDataset"}}},"deprecated":false}},"/RawDatasets/update":{"post":{"tags":["RawDataset"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"RawDataset.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/RawDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets/count":{"get":{"tags":["RawDataset"],"summary":"Count instances of the model matched by where from the data source.","operationId":"RawDataset.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/RawDatasets/change-stream":{"post":{"tags":["RawDataset"],"summary":"Create a change stream.","operationId":"RawDataset.createChangeStream__post_RawDatasets_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["RawDataset"],"summary":"Create a change stream.","operationId":"RawDataset.createChangeStream__get_RawDatasets_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/RawDatasets/isValid":{"post":{"tags":["RawDataset"],"summary":"Check if data is valid according to a schema","operationId":"RawDataset.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/RawDatasets/resetArchiveStatus":{"post":{"tags":["RawDataset"],"summary":"Delete datablocks of dataset and reset status message. Warning: to be oboleted, use reset call for DatasetLifecycle instead","operationId":"RawDataset.reset","parameters":[{"name":"datasetId","in":"formData","required":false,"type":"string"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"result":{"type":"string"}}}}},"deprecated":false}},"/RawDatasets/facet":{"post":{"tags":["RawDataset"],"summary":"Search for numbers associated with dataset properties. I.e. How many datasets in Group A. Default returns: Creation Location, Owner Groups and Creation Time","operationId":"RawDataset.facet","parameters":[{"name":"fields","in":"formData","description":"Define the fields to search by, these will be mapped to the Dataset object and ensure the fields exist. There is also support for a `text` search to look for keywords. Can be undefined.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"formData","description":"This should be an array of objects with the structure: {name: key in mongo (without $ prefix), type: date|text|etc, preConditions: object to include in the query (i.e. unwind)}","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"results":{"type":"object"}}}}},"deprecated":false}},"/RawDatasets/fullfacet":{"get":{"tags":["RawDataset"],"summary":"Return facet counts relevant for the given selected subset of datasets. ","operationId":"RawDataset.fullfacet","parameters":[{"name":"fields","in":"query","description":"Define the filter conditions by specifying the name and values of fields. There ia also support for a `text` search to look for strngs anywhere in the dataset.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"query","description":"Defines list of field names, for which facet counts should be calculated","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/RawDatasets/fullquery":{"get":{"tags":["RawDataset"],"summary":"Return datasets fulfilling complex filter conditions, including from fields of joined models.","operationId":"RawDataset.fullquery","parameters":[{"name":"fields","in":"query","description":"Define the filter conditions by specifying the name of values of fields requested. There ia also support for a `text` search to look for strings anywhere in the dataset. Skip and limit parameters allow for paging.","required":false,"type":"string","format":"JSON"},{"name":"limits","in":"query","description":"Define further query parameters like skip, limit, order","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/DerivedDatasets/{id}/datasetlifecycle":{"get":{"tags":["DerivedDataset"],"summary":"Fetches hasOne relation datasetlifecycle.","operationId":"DerivedDataset.prototype.__get__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"post":{"tags":["DerivedDataset"],"summary":"Creates a new instance in datasetlifecycle of this model.","operationId":"DerivedDataset.prototype.__create__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Update datasetlifecycle of this model.","operationId":"DerivedDataset.prototype.__update__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Deletes datasetlifecycle of this model.","operationId":"DerivedDataset.prototype.__destroy__datasetlifecycle","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DerivedDatasets/{id}/datablocks/{fk}":{"get":{"tags":["DerivedDataset"],"summary":"Find a related item by id for datablocks.","operationId":"DerivedDataset.prototype.__findById__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Delete a related item by id for datablocks.","operationId":"DerivedDataset.prototype.__destroyById__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Update a related item by id for datablocks.","operationId":"DerivedDataset.prototype.__updateById__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/DerivedDatasets/{id}/datasetattachments/{fk}":{"get":{"tags":["DerivedDataset"],"summary":"Find a related item by id for datasetattachments.","operationId":"DerivedDataset.prototype.__findById__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Delete a related item by id for datasetattachments.","operationId":"DerivedDataset.prototype.__destroyById__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Update a related item by id for datasetattachments.","operationId":"DerivedDataset.prototype.__updateById__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for datasetattachments","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DerivedDatasets/{id}/origdatablocks/{fk}":{"get":{"tags":["DerivedDataset"],"summary":"Find a related item by id for origdatablocks.","operationId":"DerivedDataset.prototype.__findById__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Delete a related item by id for origdatablocks.","operationId":"DerivedDataset.prototype.__destroyById__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Update a related item by id for origdatablocks.","operationId":"DerivedDataset.prototype.__updateById__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for origdatablocks","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/DerivedDatasets/{id}/datablocks":{"get":{"tags":["DerivedDataset"],"summary":"Queries datablocks of DerivedDataset.","operationId":"DerivedDataset.prototype.__get__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Datablock"}}}},"deprecated":false},"post":{"tags":["DerivedDataset"],"summary":"Creates a new instance in datablocks of this model.","operationId":"DerivedDataset.prototype.__create__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Deletes all datablocks of this model.","operationId":"DerivedDataset.prototype.__delete__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DerivedDatasets/{id}/datablocks/count":{"get":{"tags":["DerivedDataset"],"summary":"Counts datablocks of DerivedDataset.","operationId":"DerivedDataset.prototype.__count__datablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets/{id}/datasetattachments":{"get":{"tags":["DerivedDataset"],"summary":"Queries datasetattachments of DerivedDataset.","operationId":"DerivedDataset.prototype.__get__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetAttachment"}}}},"deprecated":false},"post":{"tags":["DerivedDataset"],"summary":"Creates a new instance in datasetattachments of this model.","operationId":"DerivedDataset.prototype.__create__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Deletes all datasetattachments of this model.","operationId":"DerivedDataset.prototype.__delete__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DerivedDatasets/{id}/datasetattachments/count":{"get":{"tags":["DerivedDataset"],"summary":"Counts datasetattachments of DerivedDataset.","operationId":"DerivedDataset.prototype.__count__datasetattachments","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets/{id}/origdatablocks":{"get":{"tags":["DerivedDataset"],"summary":"Queries origdatablocks of DerivedDataset.","operationId":"DerivedDataset.prototype.__get__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/OrigDatablock"}}}},"deprecated":false},"post":{"tags":["DerivedDataset"],"summary":"Creates a new instance in origdatablocks of this model.","operationId":"DerivedDataset.prototype.__create__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Deletes all origdatablocks of this model.","operationId":"DerivedDataset.prototype.__delete__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DerivedDatasets/{id}/origdatablocks/count":{"get":{"tags":["DerivedDataset"],"summary":"Counts origdatablocks of DerivedDataset.","operationId":"DerivedDataset.prototype.__count__origdatablocks","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets":{"post":{"tags":["DerivedDataset"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"DerivedDataset.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"patch":{"tags":["DerivedDataset"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"DerivedDataset.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DerivedDataset.replaceOrCreate__put_DerivedDatasets","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"get":{"tags":["DerivedDataset"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"DerivedDataset.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DerivedDataset"}}}},"deprecated":false}},"/DerivedDatasets/replaceOrCreate":{"post":{"tags":["DerivedDataset"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DerivedDataset.replaceOrCreate__post_DerivedDatasets_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/upsertWithWhere":{"post":{"tags":["DerivedDataset"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"DerivedDataset.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/{id}/exists":{"get":{"tags":["DerivedDataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"DerivedDataset.exists__get_DerivedDatasets_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/DerivedDatasets/{id}":{"head":{"tags":["DerivedDataset"],"summary":"Check whether a model instance exists in the data source.","operationId":"DerivedDataset.exists__head_DerivedDatasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["DerivedDataset"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"DerivedDataset.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"put":{"tags":["DerivedDataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DerivedDataset.replaceById__put_DerivedDatasets_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false},"delete":{"tags":["DerivedDataset"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"DerivedDataset.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["DerivedDataset"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"DerivedDataset.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"DerivedDataset id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/{id}/replace":{"post":{"tags":["DerivedDataset"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DerivedDataset.replaceById__post_DerivedDatasets_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/findOne":{"get":{"tags":["DerivedDataset"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"DerivedDataset.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DerivedDataset"}}},"deprecated":false}},"/DerivedDatasets/update":{"post":{"tags":["DerivedDataset"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"DerivedDataset.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DerivedDataset"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets/count":{"get":{"tags":["DerivedDataset"],"summary":"Count instances of the model matched by where from the data source.","operationId":"DerivedDataset.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DerivedDatasets/change-stream":{"post":{"tags":["DerivedDataset"],"summary":"Create a change stream.","operationId":"DerivedDataset.createChangeStream__post_DerivedDatasets_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["DerivedDataset"],"summary":"Create a change stream.","operationId":"DerivedDataset.createChangeStream__get_DerivedDatasets_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/DerivedDatasets/isValid":{"post":{"tags":["DerivedDataset"],"summary":"Check if data is valid according to a schema","operationId":"DerivedDataset.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/DerivedDatasets/resetArchiveStatus":{"post":{"tags":["DerivedDataset"],"summary":"Delete datablocks of dataset and reset status message. Warning: to be oboleted, use reset call for DatasetLifecycle instead","operationId":"DerivedDataset.reset","parameters":[{"name":"datasetId","in":"formData","required":false,"type":"string"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"result":{"type":"string"}}}}},"deprecated":false}},"/DerivedDatasets/facet":{"post":{"tags":["DerivedDataset"],"summary":"Search for numbers associated with dataset properties. I.e. How many datasets in Group A. Default returns: Creation Location, Owner Groups and Creation Time","operationId":"DerivedDataset.facet","parameters":[{"name":"fields","in":"formData","description":"Define the fields to search by, these will be mapped to the Dataset object and ensure the fields exist. There is also support for a `text` search to look for keywords. Can be undefined.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"formData","description":"This should be an array of objects with the structure: {name: key in mongo (without $ prefix), type: date|text|etc, preConditions: object to include in the query (i.e. unwind)}","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"results":{"type":"object"}}}}},"deprecated":false}},"/DerivedDatasets/fullfacet":{"get":{"tags":["DerivedDataset"],"summary":"Return facet counts relevant for the given selected subset of datasets. ","operationId":"DerivedDataset.fullfacet","parameters":[{"name":"fields","in":"query","description":"Define the filter conditions by specifying the name and values of fields. There ia also support for a `text` search to look for strngs anywhere in the dataset.","required":false,"type":"string","format":"JSON"},{"name":"facets","in":"query","description":"Defines list of field names, for which facet counts should be calculated","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/DerivedDatasets/fullquery":{"get":{"tags":["DerivedDataset"],"summary":"Return datasets fulfilling complex filter conditions, including from fields of joined models.","operationId":"DerivedDataset.fullquery","parameters":[{"name":"fields","in":"query","description":"Define the filter conditions by specifying the name of values of fields requested. There ia also support for a `text` search to look for strings anywhere in the dataset. Skip and limit parameters allow for paging.","required":false,"type":"string","format":"JSON"},{"name":"limits","in":"query","description":"Define further query parameters like skip, limit, order","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Samples":{"post":{"tags":["Sample"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Sample.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"patch":{"tags":["Sample"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Sample.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"put":{"tags":["Sample"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Sample.replaceOrCreate__put_Samples","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"get":{"tags":["Sample"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Sample.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Sample"}}}},"deprecated":false}},"/Samples/replaceOrCreate":{"post":{"tags":["Sample"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Sample.replaceOrCreate__post_Samples_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/upsertWithWhere":{"post":{"tags":["Sample"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Sample.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/{id}/exists":{"get":{"tags":["Sample"],"summary":"Check whether a model instance exists in the data source.","operationId":"Sample.exists__get_Samples_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Samples/{id}":{"head":{"tags":["Sample"],"summary":"Check whether a model instance exists in the data source.","operationId":"Sample.exists__head_Samples_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Sample"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Sample.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"put":{"tags":["Sample"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Sample.replaceById__put_Samples_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false},"delete":{"tags":["Sample"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Sample.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Sample"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Sample.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Sample id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/{id}/replace":{"post":{"tags":["Sample"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Sample.replaceById__post_Samples_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/findOne":{"get":{"tags":["Sample"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Sample.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Sample"}}},"deprecated":false}},"/Samples/update":{"post":{"tags":["Sample"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Sample.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Sample"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Samples/count":{"get":{"tags":["Sample"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Sample.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Samples/change-stream":{"post":{"tags":["Sample"],"summary":"Create a change stream.","operationId":"Sample.createChangeStream__post_Samples_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Sample"],"summary":"Create a change stream.","operationId":"Sample.createChangeStream__get_Samples_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Samples/isValid":{"post":{"tags":["Sample"],"summary":"Check if data is valid according to a schema","operationId":"Sample.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Proposals/{id}/measurementPeriods/{fk}":{"get":{"tags":["Proposal"],"summary":"Find a related item by id for measurementPeriods.","operationId":"Proposal.prototype.__findById__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for measurementPeriods","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/MeasurementPeriod"}}},"deprecated":false},"delete":{"tags":["Proposal"],"summary":"Delete a related item by id for measurementPeriods.","operationId":"Proposal.prototype.__destroyById__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for measurementPeriods","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Proposal"],"summary":"Update a related item by id for measurementPeriods.","operationId":"Proposal.prototype.__updateById__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for measurementPeriods","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/MeasurementPeriod"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/MeasurementPeriod"}}},"deprecated":false}},"/Proposals/{id}/measurementPeriods":{"get":{"tags":["Proposal"],"summary":"Queries measurementPeriods of Proposal.","operationId":"Proposal.prototype.__get__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/MeasurementPeriod"}}}},"deprecated":false},"post":{"tags":["Proposal"],"summary":"Creates a new instance in measurementPeriods of this model.","operationId":"Proposal.prototype.__create__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/MeasurementPeriod"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/MeasurementPeriod"}}},"deprecated":false},"delete":{"tags":["Proposal"],"summary":"Deletes all measurementPeriods of this model.","operationId":"Proposal.prototype.__delete__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Proposals/{id}/measurementPeriods/count":{"get":{"tags":["Proposal"],"summary":"Counts measurementPeriods of Proposal.","operationId":"Proposal.prototype.__count__measurementPeriods","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Proposals":{"post":{"tags":["Proposal"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Proposal.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"patch":{"tags":["Proposal"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Proposal.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"put":{"tags":["Proposal"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Proposal.replaceOrCreate__put_Proposals","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"get":{"tags":["Proposal"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Proposal.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Proposal"}}}},"deprecated":false}},"/Proposals/replaceOrCreate":{"post":{"tags":["Proposal"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Proposal.replaceOrCreate__post_Proposals_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/upsertWithWhere":{"post":{"tags":["Proposal"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Proposal.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/{id}/exists":{"get":{"tags":["Proposal"],"summary":"Check whether a model instance exists in the data source.","operationId":"Proposal.exists__get_Proposals_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Proposals/{id}":{"head":{"tags":["Proposal"],"summary":"Check whether a model instance exists in the data source.","operationId":"Proposal.exists__head_Proposals_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Proposal"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Proposal.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"put":{"tags":["Proposal"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Proposal.replaceById__put_Proposals_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false},"delete":{"tags":["Proposal"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Proposal.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Proposal"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Proposal.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Proposal id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/{id}/replace":{"post":{"tags":["Proposal"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Proposal.replaceById__post_Proposals_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/findOne":{"get":{"tags":["Proposal"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Proposal.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Proposal"}}},"deprecated":false}},"/Proposals/update":{"post":{"tags":["Proposal"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Proposal.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Proposal"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Proposals/count":{"get":{"tags":["Proposal"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Proposal.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Proposals/change-stream":{"post":{"tags":["Proposal"],"summary":"Create a change stream.","operationId":"Proposal.createChangeStream__post_Proposals_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Proposal"],"summary":"Create a change stream.","operationId":"Proposal.createChangeStream__get_Proposals_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Proposals/isValid":{"post":{"tags":["Proposal"],"summary":"Check if data is valid according to a schema","operationId":"Proposal.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Proposals/findByInstrumentAndDate":{"get":{"tags":["Proposal"],"summary":"Find proposal that took data at specified instrument and time","operationId":"Proposal.findByInstrumentAndDate","parameters":[{"name":"instrument","in":"query","required":false,"type":"string"},{"name":"measureTime","in":"query","required":false,"type":"string","format":"date-time"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"findByInstrumentAndDate":{"type":"object"}}}}},"deprecated":false}},"/Proposals/searchText":{"get":{"tags":["Proposal"],"summary":"Search text inside proposal","operationId":"Proposal.searchText","parameters":[],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"searchText":{"type":"object"}}}}},"deprecated":false}},"/PublishedData":{"post":{"tags":["PublishedData"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"PublishedData.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false},"patch":{"tags":["PublishedData"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"PublishedData.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false},"put":{"tags":["PublishedData"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"PublishedData.replaceOrCreate__put_PublishedData","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false},"get":{"tags":["PublishedData"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"PublishedData.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/PublishedData"}}}},"deprecated":false}},"/PublishedData/replaceOrCreate":{"post":{"tags":["PublishedData"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"PublishedData.replaceOrCreate__post_PublishedData_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false}},"/PublishedData/upsertWithWhere":{"post":{"tags":["PublishedData"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"PublishedData.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false}},"/PublishedData/{id}/exists":{"get":{"tags":["PublishedData"],"summary":"Check whether a model instance exists in the data source.","operationId":"PublishedData.exists__get_PublishedData_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/PublishedData/{id}":{"head":{"tags":["PublishedData"],"summary":"Check whether a model instance exists in the data source.","operationId":"PublishedData.exists__head_PublishedData_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["PublishedData"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"PublishedData.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false},"put":{"tags":["PublishedData"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"PublishedData.replaceById__put_PublishedData_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false},"delete":{"tags":["PublishedData"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"PublishedData.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["PublishedData"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"PublishedData.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"PublishedData id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false}},"/PublishedData/{id}/replace":{"post":{"tags":["PublishedData"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"PublishedData.replaceById__post_PublishedData_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false}},"/PublishedData/findOne":{"get":{"tags":["PublishedData"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"PublishedData.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/PublishedData"}}},"deprecated":false}},"/PublishedData/update":{"post":{"tags":["PublishedData"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"PublishedData.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/PublishedData"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/PublishedData/count":{"get":{"tags":["PublishedData"],"summary":"Count instances of the model matched by where from the data source.","operationId":"PublishedData.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/PublishedData/change-stream":{"post":{"tags":["PublishedData"],"summary":"Create a change stream.","operationId":"PublishedData.createChangeStream__post_PublishedData_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["PublishedData"],"summary":"Create a change stream.","operationId":"PublishedData.createChangeStream__get_PublishedData_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/DatasetLifecycles/{id}/dataset":{"get":{"tags":["DatasetLifecycle"],"summary":"Fetches belongsTo relation dataset.","operationId":"DatasetLifecycle.prototype.__get__dataset","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/DatasetLifecycles/{id}/messageHistory/{fk}":{"get":{"tags":["DatasetLifecycle"],"summary":"Find a related item by id for messageHistory.","operationId":"DatasetLifecycle.prototype.__findById__messageHistory","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for messageHistory","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Message"}}},"deprecated":false},"delete":{"tags":["DatasetLifecycle"],"summary":"Delete a related item by id for messageHistory.","operationId":"DatasetLifecycle.prototype.__destroyById__messageHistory","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for messageHistory","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["DatasetLifecycle"],"summary":"Update a related item by id for messageHistory.","operationId":"DatasetLifecycle.prototype.__updateById__messageHistory","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for messageHistory","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Message"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Message"}}},"deprecated":false}},"/DatasetLifecycles/{id}/messageHistory":{"get":{"tags":["DatasetLifecycle"],"summary":"Queries messageHistory of DatasetLifecycle.","operationId":"DatasetLifecycle.prototype.__get__messageHistory","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Message"}}}},"deprecated":false},"post":{"tags":["DatasetLifecycle"],"summary":"Creates a new instance in messageHistory of this model.","operationId":"DatasetLifecycle.prototype.__create__messageHistory","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Message"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Message"}}},"deprecated":false},"delete":{"tags":["DatasetLifecycle"],"summary":"Deletes all messageHistory of this model.","operationId":"DatasetLifecycle.prototype.__delete__messageHistory","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/DatasetLifecycles/{id}/messageHistory/count":{"get":{"tags":["DatasetLifecycle"],"summary":"Counts messageHistory of DatasetLifecycle.","operationId":"DatasetLifecycle.prototype.__count__messageHistory","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetLifecycles":{"post":{"tags":["DatasetLifecycle"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"DatasetLifecycle.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"put":{"tags":["DatasetLifecycle"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"DatasetLifecycle.patchOrCreate__put_DatasetLifecycles","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"patch":{"tags":["DatasetLifecycle"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"DatasetLifecycle.patchOrCreate__patch_DatasetLifecycles","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"get":{"tags":["DatasetLifecycle"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"DatasetLifecycle.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetLifecycle"}}}},"deprecated":false}},"/DatasetLifecycles/replaceOrCreate":{"post":{"tags":["DatasetLifecycle"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DatasetLifecycle.replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/upsertWithWhere":{"post":{"tags":["DatasetLifecycle"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"DatasetLifecycle.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/{id}/exists":{"get":{"tags":["DatasetLifecycle"],"summary":"Check whether a model instance exists in the data source.","operationId":"DatasetLifecycle.exists__get_DatasetLifecycles_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/DatasetLifecycles/{id}":{"head":{"tags":["DatasetLifecycle"],"summary":"Check whether a model instance exists in the data source.","operationId":"DatasetLifecycle.exists__head_DatasetLifecycles_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["DatasetLifecycle"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"DatasetLifecycle.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"delete":{"tags":["DatasetLifecycle"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"DatasetLifecycle.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"put":{"tags":["DatasetLifecycle"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"DatasetLifecycle.prototype.patchAttributes__put_DatasetLifecycles_{id}","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false},"patch":{"tags":["DatasetLifecycle"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"DatasetLifecycle.prototype.patchAttributes__patch_DatasetLifecycles_{id}","parameters":[{"name":"id","in":"path","description":"DatasetLifecycle id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/{id}/replace":{"post":{"tags":["DatasetLifecycle"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DatasetLifecycle.replaceById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/findOne":{"get":{"tags":["DatasetLifecycle"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"DatasetLifecycle.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetLifecycle"}}},"deprecated":false}},"/DatasetLifecycles/update":{"post":{"tags":["DatasetLifecycle"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"DatasetLifecycle.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetLifecycle"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetLifecycles/count":{"get":{"tags":["DatasetLifecycle"],"summary":"Count instances of the model matched by where from the data source.","operationId":"DatasetLifecycle.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetLifecycles/change-stream":{"post":{"tags":["DatasetLifecycle"],"summary":"Create a change stream.","operationId":"DatasetLifecycle.createChangeStream__post_DatasetLifecycles_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["DatasetLifecycle"],"summary":"Create a change stream.","operationId":"DatasetLifecycle.createChangeStream__get_DatasetLifecycles_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/DatasetLifecycles/isValid":{"post":{"tags":["DatasetLifecycle"],"summary":"Check if data is valid according to a schema","operationId":"DatasetLifecycle.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/DatasetLifecycles/resetArchiveStatus":{"put":{"tags":["DatasetLifecycle"],"summary":"Delete datablocks of dataset and reset status message.","operationId":"DatasetLifecycle.reset","parameters":[{"name":"datasetId","in":"formData","required":false,"type":"string"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Datablocks/{id}/dataset":{"get":{"tags":["Datablock"],"summary":"Fetches belongsTo relation dataset.","operationId":"Datablock.prototype.__get__dataset","parameters":[{"name":"id","in":"path","description":"Datablock id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/Datablocks":{"post":{"tags":["Datablock"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Datablock.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"patch":{"tags":["Datablock"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Datablock.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"put":{"tags":["Datablock"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Datablock.replaceOrCreate__put_Datablocks","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"get":{"tags":["Datablock"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Datablock.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Datablock"}}}},"deprecated":false}},"/Datablocks/replaceOrCreate":{"post":{"tags":["Datablock"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Datablock.replaceOrCreate__post_Datablocks_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/upsertWithWhere":{"post":{"tags":["Datablock"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Datablock.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/{id}/exists":{"get":{"tags":["Datablock"],"summary":"Check whether a model instance exists in the data source.","operationId":"Datablock.exists__get_Datablocks_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Datablocks/{id}":{"head":{"tags":["Datablock"],"summary":"Check whether a model instance exists in the data source.","operationId":"Datablock.exists__head_Datablocks_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Datablock"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Datablock.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"put":{"tags":["Datablock"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Datablock.replaceById__put_Datablocks_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false},"delete":{"tags":["Datablock"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Datablock.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Datablock"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Datablock.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Datablock id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/{id}/replace":{"post":{"tags":["Datablock"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Datablock.replaceById__post_Datablocks_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/findOne":{"get":{"tags":["Datablock"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Datablock.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Datablock"}}},"deprecated":false}},"/Datablocks/update":{"post":{"tags":["Datablock"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Datablock.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Datablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Datablocks/count":{"get":{"tags":["Datablock"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Datablock.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Datablocks/change-stream":{"post":{"tags":["Datablock"],"summary":"Create a change stream.","operationId":"Datablock.createChangeStream__post_Datablocks_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Datablock"],"summary":"Create a change stream.","operationId":"Datablock.createChangeStream__get_Datablocks_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Datablocks/isValid":{"post":{"tags":["Datablock"],"summary":"Check if data is valid according to a schema","operationId":"Datablock.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/AccessUsers":{"post":{"tags":["AccessUser"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"AccessUser.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"patch":{"tags":["AccessUser"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"AccessUser.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"put":{"tags":["AccessUser"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"AccessUser.replaceOrCreate__put_AccessUsers","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"get":{"tags":["AccessUser"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"AccessUser.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/AccessUser"}}}},"deprecated":false}},"/AccessUsers/replaceOrCreate":{"post":{"tags":["AccessUser"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"AccessUser.replaceOrCreate__post_AccessUsers_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/upsertWithWhere":{"post":{"tags":["AccessUser"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"AccessUser.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/{id}/exists":{"get":{"tags":["AccessUser"],"summary":"Check whether a model instance exists in the data source.","operationId":"AccessUser.exists__get_AccessUsers_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/AccessUsers/{id}":{"head":{"tags":["AccessUser"],"summary":"Check whether a model instance exists in the data source.","operationId":"AccessUser.exists__head_AccessUsers_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["AccessUser"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"AccessUser.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"put":{"tags":["AccessUser"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"AccessUser.replaceById__put_AccessUsers_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false},"delete":{"tags":["AccessUser"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"AccessUser.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["AccessUser"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"AccessUser.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"AccessUser id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/{id}/replace":{"post":{"tags":["AccessUser"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"AccessUser.replaceById__post_AccessUsers_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/findOne":{"get":{"tags":["AccessUser"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"AccessUser.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessUser"}}},"deprecated":false}},"/AccessUsers/update":{"post":{"tags":["AccessUser"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"AccessUser.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessUser"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/AccessUsers/count":{"get":{"tags":["AccessUser"],"summary":"Count instances of the model matched by where from the data source.","operationId":"AccessUser.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/AccessUsers/change-stream":{"post":{"tags":["AccessUser"],"summary":"Create a change stream.","operationId":"AccessUser.createChangeStream__post_AccessUsers_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["AccessUser"],"summary":"Create a change stream.","operationId":"AccessUser.createChangeStream__get_AccessUsers_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/AccessGroups":{"post":{"tags":["AccessGroup"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"AccessGroup.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"patch":{"tags":["AccessGroup"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"AccessGroup.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"put":{"tags":["AccessGroup"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"AccessGroup.replaceOrCreate__put_AccessGroups","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"get":{"tags":["AccessGroup"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"AccessGroup.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/AccessGroup"}}}},"deprecated":false}},"/AccessGroups/replaceOrCreate":{"post":{"tags":["AccessGroup"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"AccessGroup.replaceOrCreate__post_AccessGroups_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/upsertWithWhere":{"post":{"tags":["AccessGroup"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"AccessGroup.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/{id}/exists":{"get":{"tags":["AccessGroup"],"summary":"Check whether a model instance exists in the data source.","operationId":"AccessGroup.exists__get_AccessGroups_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/AccessGroups/{id}":{"head":{"tags":["AccessGroup"],"summary":"Check whether a model instance exists in the data source.","operationId":"AccessGroup.exists__head_AccessGroups_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["AccessGroup"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"AccessGroup.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"put":{"tags":["AccessGroup"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"AccessGroup.replaceById__put_AccessGroups_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false},"delete":{"tags":["AccessGroup"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"AccessGroup.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["AccessGroup"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"AccessGroup.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"AccessGroup id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/{id}/replace":{"post":{"tags":["AccessGroup"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"AccessGroup.replaceById__post_AccessGroups_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/findOne":{"get":{"tags":["AccessGroup"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"AccessGroup.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/AccessGroup"}}},"deprecated":false}},"/AccessGroups/update":{"post":{"tags":["AccessGroup"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"AccessGroup.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/AccessGroup"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/AccessGroups/count":{"get":{"tags":["AccessGroup"],"summary":"Count instances of the model matched by where from the data source.","operationId":"AccessGroup.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/AccessGroups/change-stream":{"post":{"tags":["AccessGroup"],"summary":"Create a change stream.","operationId":"AccessGroup.createChangeStream__post_AccessGroups_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["AccessGroup"],"summary":"Create a change stream.","operationId":"AccessGroup.createChangeStream__get_AccessGroups_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/UserCredentials/{id}/user":{"get":{"tags":["UserCredential"],"summary":"Fetches belongsTo relation user.","operationId":"UserCredential.prototype.__get__user","parameters":[{"name":"id","in":"path","description":"UserCredential id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/UserCredentials":{"post":{"tags":["UserCredential"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"UserCredential.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"patch":{"tags":["UserCredential"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"UserCredential.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"put":{"tags":["UserCredential"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"UserCredential.replaceOrCreate__put_UserCredentials","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"get":{"tags":["UserCredential"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"UserCredential.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/UserCredential"}}}},"deprecated":false}},"/UserCredentials/replaceOrCreate":{"post":{"tags":["UserCredential"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"UserCredential.replaceOrCreate__post_UserCredentials_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/upsertWithWhere":{"post":{"tags":["UserCredential"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"UserCredential.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/{id}/exists":{"get":{"tags":["UserCredential"],"summary":"Check whether a model instance exists in the data source.","operationId":"UserCredential.exists__get_UserCredentials_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/UserCredentials/{id}":{"head":{"tags":["UserCredential"],"summary":"Check whether a model instance exists in the data source.","operationId":"UserCredential.exists__head_UserCredentials_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["UserCredential"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"UserCredential.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"put":{"tags":["UserCredential"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"UserCredential.replaceById__put_UserCredentials_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false},"delete":{"tags":["UserCredential"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"UserCredential.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["UserCredential"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"UserCredential.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"UserCredential id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/{id}/replace":{"post":{"tags":["UserCredential"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"UserCredential.replaceById__post_UserCredentials_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/findOne":{"get":{"tags":["UserCredential"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"UserCredential.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserCredential"}}},"deprecated":false}},"/UserCredentials/update":{"post":{"tags":["UserCredential"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"UserCredential.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/UserCredentials/count":{"get":{"tags":["UserCredential"],"summary":"Count instances of the model matched by where from the data source.","operationId":"UserCredential.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/UserCredentials/change-stream":{"post":{"tags":["UserCredential"],"summary":"Create a change stream.","operationId":"UserCredential.createChangeStream__post_UserCredentials_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["UserCredential"],"summary":"Create a change stream.","operationId":"UserCredential.createChangeStream__get_UserCredentials_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/UserIdentities/{id}/user":{"get":{"tags":["UserIdentity"],"summary":"Fetches belongsTo relation user.","operationId":"UserIdentity.prototype.__get__user","parameters":[{"name":"id","in":"path","description":"UserIdentity id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/User"}}},"deprecated":false}},"/UserIdentities":{"post":{"tags":["UserIdentity"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"UserIdentity.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"patch":{"tags":["UserIdentity"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"UserIdentity.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"put":{"tags":["UserIdentity"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"UserIdentity.replaceOrCreate__put_UserIdentities","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"get":{"tags":["UserIdentity"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"UserIdentity.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/UserIdentity"}}}},"deprecated":false}},"/UserIdentities/replaceOrCreate":{"post":{"tags":["UserIdentity"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"UserIdentity.replaceOrCreate__post_UserIdentities_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/upsertWithWhere":{"post":{"tags":["UserIdentity"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"UserIdentity.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/{id}/exists":{"get":{"tags":["UserIdentity"],"summary":"Check whether a model instance exists in the data source.","operationId":"UserIdentity.exists__get_UserIdentities_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/UserIdentities/{id}":{"head":{"tags":["UserIdentity"],"summary":"Check whether a model instance exists in the data source.","operationId":"UserIdentity.exists__head_UserIdentities_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["UserIdentity"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"UserIdentity.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"put":{"tags":["UserIdentity"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"UserIdentity.replaceById__put_UserIdentities_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false},"delete":{"tags":["UserIdentity"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"UserIdentity.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["UserIdentity"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"UserIdentity.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"UserIdentity id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/{id}/replace":{"post":{"tags":["UserIdentity"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"UserIdentity.replaceById__post_UserIdentities_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/findOne":{"get":{"tags":["UserIdentity"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"UserIdentity.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/UserIdentity"}}},"deprecated":false}},"/UserIdentities/update":{"post":{"tags":["UserIdentity"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"UserIdentity.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/UserIdentity"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/UserIdentities/count":{"get":{"tags":["UserIdentity"],"summary":"Count instances of the model matched by where from the data source.","operationId":"UserIdentity.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/UserIdentities/change-stream":{"post":{"tags":["UserIdentity"],"summary":"Create a change stream.","operationId":"UserIdentity.createChangeStream__post_UserIdentities_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["UserIdentity"],"summary":"Create a change stream.","operationId":"UserIdentity.createChangeStream__get_UserIdentities_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/ApplicationCredentials":{"post":{"tags":["ApplicationCredential"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"ApplicationCredential.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"patch":{"tags":["ApplicationCredential"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"ApplicationCredential.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"put":{"tags":["ApplicationCredential"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"ApplicationCredential.replaceOrCreate__put_ApplicationCredentials","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"get":{"tags":["ApplicationCredential"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"ApplicationCredential.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/ApplicationCredential"}}}},"deprecated":false}},"/ApplicationCredentials/replaceOrCreate":{"post":{"tags":["ApplicationCredential"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"ApplicationCredential.replaceOrCreate__post_ApplicationCredentials_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/upsertWithWhere":{"post":{"tags":["ApplicationCredential"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"ApplicationCredential.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/{id}/exists":{"get":{"tags":["ApplicationCredential"],"summary":"Check whether a model instance exists in the data source.","operationId":"ApplicationCredential.exists__get_ApplicationCredentials_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/ApplicationCredentials/{id}":{"head":{"tags":["ApplicationCredential"],"summary":"Check whether a model instance exists in the data source.","operationId":"ApplicationCredential.exists__head_ApplicationCredentials_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["ApplicationCredential"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"ApplicationCredential.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"put":{"tags":["ApplicationCredential"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"ApplicationCredential.replaceById__put_ApplicationCredentials_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false},"delete":{"tags":["ApplicationCredential"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"ApplicationCredential.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["ApplicationCredential"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"ApplicationCredential.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"ApplicationCredential id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/{id}/replace":{"post":{"tags":["ApplicationCredential"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"ApplicationCredential.replaceById__post_ApplicationCredentials_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/findOne":{"get":{"tags":["ApplicationCredential"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"ApplicationCredential.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/ApplicationCredential"}}},"deprecated":false}},"/ApplicationCredentials/update":{"post":{"tags":["ApplicationCredential"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"ApplicationCredential.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/ApplicationCredential"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/ApplicationCredentials/count":{"get":{"tags":["ApplicationCredential"],"summary":"Count instances of the model matched by where from the data source.","operationId":"ApplicationCredential.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/ApplicationCredentials/change-stream":{"post":{"tags":["ApplicationCredential"],"summary":"Create a change stream.","operationId":"ApplicationCredential.createChangeStream__post_ApplicationCredentials_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["ApplicationCredential"],"summary":"Create a change stream.","operationId":"ApplicationCredential.createChangeStream__get_ApplicationCredentials_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Policies":{"post":{"tags":["Policy"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Policy.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"patch":{"tags":["Policy"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Policy.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"put":{"tags":["Policy"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Policy.replaceOrCreate__put_Policies","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"get":{"tags":["Policy"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Policy.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Policy"}}}},"deprecated":false}},"/Policies/replaceOrCreate":{"post":{"tags":["Policy"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Policy.replaceOrCreate__post_Policies_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/upsertWithWhere":{"post":{"tags":["Policy"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Policy.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/{id}/exists":{"get":{"tags":["Policy"],"summary":"Check whether a model instance exists in the data source.","operationId":"Policy.exists__get_Policies_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Policies/{id}":{"head":{"tags":["Policy"],"summary":"Check whether a model instance exists in the data source.","operationId":"Policy.exists__head_Policies_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Policy"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Policy.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"put":{"tags":["Policy"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Policy.replaceById__put_Policies_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false},"delete":{"tags":["Policy"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Policy.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["Policy"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Policy.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"Policy id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/{id}/replace":{"post":{"tags":["Policy"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Policy.replaceById__post_Policies_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/findOne":{"get":{"tags":["Policy"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Policy.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Policy"}}},"deprecated":false}},"/Policies/update":{"post":{"tags":["Policy"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Policy.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Policy"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Policies/count":{"get":{"tags":["Policy"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Policy.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Policies/change-stream":{"post":{"tags":["Policy"],"summary":"Create a change stream.","operationId":"Policy.createChangeStream__post_Policies_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Policy"],"summary":"Create a change stream.","operationId":"Policy.createChangeStream__get_Policies_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/Policies/isValid":{"post":{"tags":["Policy"],"summary":"Check if data is valid according to a schema","operationId":"Policy.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}},"/Jobs/{id}/messageHistory/{fk}":{"get":{"tags":["Job"],"summary":"Find a related item by id for messageHistory.","operationId":"Job.prototype.__findById__messageHistory","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for messageHistory","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Message"}}},"deprecated":false},"delete":{"tags":["Job"],"summary":"Delete a related item by id for messageHistory.","operationId":"Job.prototype.__destroyById__messageHistory","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for messageHistory","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false},"put":{"tags":["Job"],"summary":"Update a related item by id for messageHistory.","operationId":"Job.prototype.__updateById__messageHistory","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"fk","in":"path","description":"Foreign key for messageHistory","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Message"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Message"}}},"deprecated":false}},"/Jobs/{id}/messageHistory":{"get":{"tags":["Job"],"summary":"Queries messageHistory of Job.","operationId":"Job.prototype.__get__messageHistory","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Message"}}}},"deprecated":false},"post":{"tags":["Job"],"summary":"Creates a new instance in messageHistory of this model.","operationId":"Job.prototype.__create__messageHistory","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","required":false,"schema":{"$ref":"#/definitions/Message"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Message"}}},"deprecated":false},"delete":{"tags":["Job"],"summary":"Deletes all messageHistory of this model.","operationId":"Job.prototype.__delete__messageHistory","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"}],"responses":{"204":{"description":"Request was successful"}},"deprecated":false}},"/Jobs/{id}/messageHistory/count":{"get":{"tags":["Job"],"summary":"Counts messageHistory of Job.","operationId":"Job.prototype.__count__messageHistory","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Jobs":{"post":{"tags":["Job"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"Job.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"put":{"tags":["Job"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Job.patchOrCreate__put_Jobs","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"patch":{"tags":["Job"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"Job.patchOrCreate__patch_Jobs","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"get":{"tags":["Job"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"Job.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/Job"}}}},"deprecated":false}},"/Jobs/replaceOrCreate":{"post":{"tags":["Job"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"Job.replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/upsertWithWhere":{"post":{"tags":["Job"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"Job.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/{id}/exists":{"get":{"tags":["Job"],"summary":"Check whether a model instance exists in the data source.","operationId":"Job.exists__get_Jobs_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/Jobs/{id}":{"head":{"tags":["Job"],"summary":"Check whether a model instance exists in the data source.","operationId":"Job.exists__head_Jobs_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["Job"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"Job.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"delete":{"tags":["Job"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"Job.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"put":{"tags":["Job"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Job.prototype.patchAttributes__put_Jobs_{id}","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false},"patch":{"tags":["Job"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"Job.prototype.patchAttributes__patch_Jobs_{id}","parameters":[{"name":"id","in":"path","description":"Job id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/{id}/replace":{"post":{"tags":["Job"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"Job.replaceById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/findOne":{"get":{"tags":["Job"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"Job.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Job"}}},"deprecated":false}},"/Jobs/update":{"post":{"tags":["Job"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"Job.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/Job"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/Jobs/count":{"get":{"tags":["Job"],"summary":"Count instances of the model matched by where from the data source.","operationId":"Job.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/Jobs/change-stream":{"post":{"tags":["Job"],"summary":"Create a change stream.","operationId":"Job.createChangeStream__post_Jobs_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["Job"],"summary":"Create a change stream.","operationId":"Job.createChangeStream__get_Jobs_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/DatasetAttachments/{id}/dataset":{"get":{"tags":["DatasetAttachment"],"summary":"Fetches belongsTo relation dataset.","operationId":"DatasetAttachment.prototype.__get__dataset","parameters":[{"name":"id","in":"path","description":"DatasetAttachment id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/DatasetAttachments":{"post":{"tags":["DatasetAttachment"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"DatasetAttachment.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"patch":{"tags":["DatasetAttachment"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"DatasetAttachment.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"put":{"tags":["DatasetAttachment"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DatasetAttachment.replaceOrCreate__put_DatasetAttachments","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"get":{"tags":["DatasetAttachment"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"DatasetAttachment.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/DatasetAttachment"}}}},"deprecated":false}},"/DatasetAttachments/replaceOrCreate":{"post":{"tags":["DatasetAttachment"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"DatasetAttachment.replaceOrCreate__post_DatasetAttachments_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/upsertWithWhere":{"post":{"tags":["DatasetAttachment"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"DatasetAttachment.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/{id}/exists":{"get":{"tags":["DatasetAttachment"],"summary":"Check whether a model instance exists in the data source.","operationId":"DatasetAttachment.exists__get_DatasetAttachments_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/DatasetAttachments/{id}":{"head":{"tags":["DatasetAttachment"],"summary":"Check whether a model instance exists in the data source.","operationId":"DatasetAttachment.exists__head_DatasetAttachments_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["DatasetAttachment"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"DatasetAttachment.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"put":{"tags":["DatasetAttachment"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DatasetAttachment.replaceById__put_DatasetAttachments_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false},"delete":{"tags":["DatasetAttachment"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"DatasetAttachment.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["DatasetAttachment"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"DatasetAttachment.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"DatasetAttachment id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/{id}/replace":{"post":{"tags":["DatasetAttachment"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"DatasetAttachment.replaceById__post_DatasetAttachments_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/findOne":{"get":{"tags":["DatasetAttachment"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"DatasetAttachment.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/DatasetAttachment"}}},"deprecated":false}},"/DatasetAttachments/update":{"post":{"tags":["DatasetAttachment"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"DatasetAttachment.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/DatasetAttachment"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetAttachments/count":{"get":{"tags":["DatasetAttachment"],"summary":"Count instances of the model matched by where from the data source.","operationId":"DatasetAttachment.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/DatasetAttachments/change-stream":{"post":{"tags":["DatasetAttachment"],"summary":"Create a change stream.","operationId":"DatasetAttachment.createChangeStream__post_DatasetAttachments_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["DatasetAttachment"],"summary":"Create a change stream.","operationId":"DatasetAttachment.createChangeStream__get_DatasetAttachments_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/OrigDatablocks/{id}/dataset":{"get":{"tags":["OrigDatablock"],"summary":"Fetches belongsTo relation dataset.","operationId":"OrigDatablock.prototype.__get__dataset","parameters":[{"name":"id","in":"path","description":"OrigDatablock id","required":true,"type":"string","format":"JSON"},{"name":"refresh","in":"query","required":false,"type":"boolean"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/Dataset"}}},"deprecated":false}},"/OrigDatablocks":{"post":{"tags":["OrigDatablock"],"summary":"Create a new instance of the model and persist it into the data source.","operationId":"OrigDatablock.create","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"patch":{"tags":["OrigDatablock"],"summary":"Patch an existing model instance or insert a new one into the data source.","operationId":"OrigDatablock.patchOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"put":{"tags":["OrigDatablock"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"OrigDatablock.replaceOrCreate__put_OrigDatablocks","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"get":{"tags":["OrigDatablock"],"summary":"Find all instances of the model matched by filter from the data source.","operationId":"OrigDatablock.find","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"array","items":{"$ref":"#/definitions/OrigDatablock"}}}},"deprecated":false}},"/OrigDatablocks/replaceOrCreate":{"post":{"tags":["OrigDatablock"],"summary":"Replace an existing model instance or insert a new one into the data source.","operationId":"OrigDatablock.replaceOrCreate__post_OrigDatablocks_replaceOrCreate","parameters":[{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/upsertWithWhere":{"post":{"tags":["OrigDatablock"],"summary":"Update an existing model instance or insert a new one into the data source based on the where criteria.","operationId":"OrigDatablock.upsertWithWhere","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/{id}/exists":{"get":{"tags":["OrigDatablock"],"summary":"Check whether a model instance exists in the data source.","operationId":"OrigDatablock.exists__get_OrigDatablocks_{id}_exists","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false}},"/OrigDatablocks/{id}":{"head":{"tags":["OrigDatablock"],"summary":"Check whether a model instance exists in the data source.","operationId":"OrigDatablock.exists__head_OrigDatablocks_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"exists":{"type":"boolean"}}}}},"deprecated":false},"get":{"tags":["OrigDatablock"],"summary":"Find a model instance by {{id}} from the data source.","operationId":"OrigDatablock.findById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"filter","in":"query","description":"Filter defining fields and include - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"put":{"tags":["OrigDatablock"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"OrigDatablock.replaceById__put_OrigDatablocks_{id}","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false},"delete":{"tags":["OrigDatablock"],"summary":"Delete a model instance by {{id}} from the data source.","operationId":"OrigDatablock.deleteById","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object"}}},"deprecated":false},"patch":{"tags":["OrigDatablock"],"summary":"Patch attributes for a model instance and persist it into the data source.","operationId":"OrigDatablock.prototype.patchAttributes","parameters":[{"name":"id","in":"path","description":"OrigDatablock id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/{id}/replace":{"post":{"tags":["OrigDatablock"],"summary":"Replace attributes for a model instance and persist it into the data source.","operationId":"OrigDatablock.replaceById__post_OrigDatablocks_{id}_replace","parameters":[{"name":"id","in":"path","description":"Model id","required":true,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"Model instance data","required":false,"schema":{"description":"Model instance data","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/findOne":{"get":{"tags":["OrigDatablock"],"summary":"Find first instance of the model matched by filter from the data source.","operationId":"OrigDatablock.findOne","parameters":[{"name":"filter","in":"query","description":"Filter defining fields, where, include, order, offset, and limit - must be a JSON-encoded string ({\"something\":\"value\"})","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/OrigDatablock"}}},"deprecated":false}},"/OrigDatablocks/update":{"post":{"tags":["OrigDatablock"],"summary":"Update instances of the model matched by {{where}} from the data source.","operationId":"OrigDatablock.updateAll","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"},{"name":"data","in":"body","description":"An object of model property name/value pairs","required":false,"schema":{"description":"An object of model property name/value pairs","$ref":"#/definitions/OrigDatablock"}}],"responses":{"200":{"description":"Request was successful","schema":{"description":"Information related to the outcome of the operation","type":"object","properties":{"count":{"description":"The number of instances updated","type":"number","format":"double"}}}}},"deprecated":false}},"/OrigDatablocks/count":{"get":{"tags":["OrigDatablock"],"summary":"Count instances of the model matched by where from the data source.","operationId":"OrigDatablock.count","parameters":[{"name":"where","in":"query","description":"Criteria to match model instances","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"object","properties":{"count":{"type":"number","format":"double"}}}}},"deprecated":false}},"/OrigDatablocks/change-stream":{"post":{"tags":["OrigDatablock"],"summary":"Create a change stream.","operationId":"OrigDatablock.createChangeStream__post_OrigDatablocks_change-stream","parameters":[{"name":"options","in":"formData","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false},"get":{"tags":["OrigDatablock"],"summary":"Create a change stream.","operationId":"OrigDatablock.createChangeStream__get_OrigDatablocks_change-stream","parameters":[{"name":"options","in":"query","required":false,"type":"string","format":"JSON"}],"responses":{"200":{"description":"Request was successful","schema":{"type":"file"}}},"deprecated":false}},"/OrigDatablocks/isValid":{"post":{"tags":["OrigDatablock"],"summary":"Check if data is valid according to a schema","operationId":"OrigDatablock.isValid","parameters":[{"name":"ownableItem","in":"body","required":false,"schema":{"type":"object"}}],"responses":{"200":{"description":"Request was successful","schema":{"$ref":"#/definitions/x-any"}}},"deprecated":false}}},"tags":[{"name":"User"},{"name":"Dataset","description":"Stores the meta data information for a given collection of files. It defines a list of mandatory and optional metadata fields to be defined. Datasets have a PID field for unique identification. A DOI field can be added for publication purposes later. This is the base 'class' for derived documents like raw datasets or derived datasets. The type field is used to distinguish between the different types of datasets. For each dataset in addition a DatasetLifecycle and a OrigDatablock type of container can be created, giving additional information about the datasets lifecycles and its containing files."},{"name":"RawDataset","description":"Contains the information for datasets which are the result of measurements or of simulations. Often raw datasets are automatically added as part of an automated ingest step as part of the data acquisition chain at an instrument. This schema inherits the fields from the generic Dataset collection and adds specific fields as defined below."},{"name":"DerivedDataset","description":"Contains the information for datasets which are the result of an analysis step, typically based on raw datasets or other derived datasets as input. Derived datasets are typically added by the researcher pursuing the specific analysis. This schema inherits the fields from the generic Dataset collection and adds specific fields as defined below."},{"name":"Sample","description":"Models describing the characteristics of the samples to be investigated. Raw datasets should be linked to such sample definitions."},{"name":"Proposal","description":"Defines the purpose of an experiment and links an experiment to principal investigator and main proposer"},{"name":"PublishedData","description":"Stores the meta data information for an accessible, published and DOI-identified collection of datasets. It defines a list of mandatory and optional metadata fields to be included. DataCite mandatory fields, a full URL to the landing page and modification times are included."},{"name":"DatasetLifecycle","description":"For each dataset there exists exactly one dataset lifecycle document which describes the current status of the dataset during its lifetime with respect to the storage handling systems"},{"name":"Datablock","description":"When archiving a dataset all files contained in the dataset are listed here together with their checksum information. Several datablocks can be created if the file listing is too long for a single datablock. This partitioning decision is done by the archiving system to allow for chunks of datablocks with managable sizes. E.g a dataset consisting of 10 TB of data could be split into 10 datablocks of about 1 TB each. The upper limit set by the data catalog system itself is given by the fact that documents must be smaller than 16 MB, which typically allows for datasets of about 100000 files."},{"name":"AccessUser"},{"name":"AccessGroup"},{"name":"UserCredential"},{"name":"UserIdentity"},{"name":"ApplicationCredential"},{"name":"Policy","description":"Definition of policy parameters relevant for the storgae lifecycle management of the datasets"},{"name":"Job","description":"This collection keeps information about jobs to be excuted in external systems. In particular it keeps information about the jobs submitted for archiving or retrieving datasets stored inside an archive system. It can also be used to keep track of analysis jobs e.g. for automated analysis workflows."},{"name":"DatasetAttachment","description":"Small less than 16 MB attchments for datasets, envisaged for png/jpeg previews"},{"name":"OrigDatablock","description":"Container list all files and their attributes which make up a dataset. Usually Filled at the time the datasets metadata is created in the data catalog. Can be used by subsequent archiving processes to create the archived datasets."}],"consumes":["application/json","application/x-www-form-urlencoded","application/xml","text/xml"],"produces":["application/json","application/xml","text/xml","application/javascript","text/javascript"],"definitions":{"x-any":{"properties":{}},"AccessToken":{"properties":{"id":{"type":"string"},"ttl":{"default":1209600,"description":"time to live in seconds (2 weeks by default)","type":"number","format":"double"},"scopes":{"description":"Array of scopes granted to this access token.","type":"array","items":{"type":"string"}},"created":{"type":"string","format":"date-time"},"userId":{"$ref":"#/definitions/ObjectID"}},"required":["id"],"additionalProperties":false},"User":{"properties":{"realm":{"type":"string"},"username":{"type":"string"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"id":{"$ref":"#/definitions/ObjectID"}},"required":["email"],"additionalProperties":false},"DatasetLifecycle":{"description":"For each dataset there exists exactly one dataset lifecycle document which describes the current status of the dataset during its lifetime with respect to the storage handling systems","properties":{"id":{"description":"ID of status information. This must be the ID of the associated dataset","type":"string"},"archivable":{"description":"Flag which is true, if dataset is available to be archived and no archive job for this dataset exists yet. Will be copied to Dataset for now and may become obsolete here eventually.","type":"boolean"},"retrievable":{"description":"Flag which is true, if dataset is stored on archive system and is ready to be retrieved. Will be copied to Dataset for now and may become obsolete here eventually.","type":"boolean"},"publishable":{"description":"Flag which is true, if dataset can be published. Usually requires a longterm storage option on tape or similar. Will be copied to Dataset for now and may become obsolete here eventually.","type":"boolean"},"dateOfDiskPurging":{"description":"Day when dataset will be removed from disk, assuming that is already stored on tape.","type":"string","format":"date-time"},"archiveRetentionTime":{"description":"Day when the dataset's future fate will be evaluated again, e.g. to decide if the dataset can be deleted from archive.","type":"string","format":"date-time"},"dateOfPublishing":{"description":"Day when dataset is supposed to become public according to data policy","type":"string","format":"date-time"},"isOnCentralDisk":{"description":"Flag which is true, if full dataset is available on central fileserver. If false data needs to be copied from decentral storage place to a cache server before the ingest. This information needs to be transferred to the archive system at archive time","type":"boolean"},"isOnDisk":{"description":"Flag which is true, if full dataset is available on disk. Warning: will be obsoleted in coming versions","type":"boolean"},"isOnTape":{"description":"Flag which is true, if full dataset has been stored to tape. Warning: will be obsoleted in coming versions","type":"boolean"},"archiveStatusMessage":{"description":"Current status of Dataset with respect to storage on disk/tape. Warning: will be obsoleted in coming versions","type":"string"},"retrieveStatusMessage":{"description":"Latest message for this dataset concerning retrieve from archive system. Warning: will be obsoleted in coming versions","type":"string"},"lastUpdateMessage":{"description":"Latest status update / transition message for this dataset. Warning: will be obsoleted in coming versions","type":"string"},"archiveReturnMessage":{"description":"Detailed status or error message returned by archive system when treating this dataset. Warning: will be obsoleted in coming versions","type":"string"},"dateOfLastMessage":{"description":"Time when last status message was sent. Format according to chapter 5.6 internet date/time format in RFC 3339. This will be filled automatically if not provided. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server. Warning: will be obsoleted in coming versions","type":"string","format":"date-time"},"isExported":{"description":"Flag is true if data was exported to another location. Warning: will be obsoleted in coming versions","type":"boolean"},"exportedTo":{"description":"Location of the export destination. Warning: will be obsoleted in coming versions","type":"string"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"datasetId":{"type":"string"},"rawDatasetId":{"type":"string"},"derivedDatasetId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"MessageHistory":{"type":"array","items":{"$ref":"#/definitions/Message"}}},"required":["id","ownerGroup"],"additionalProperties":false},"Datablock":{"description":"When archiving a dataset all files contained in the dataset are listed here together with their checksum information. Several datablocks can be created if the file listing is too long for a single datablock. This partitioning decision is done by the archiving system to allow for chunks of datablocks with managable sizes. E.g a dataset consisting of 10 TB of data could be split into 10 datablocks of about 1 TB each. The upper limit set by the data catalog system itself is given by the fact that documents must be smaller than 16 MB, which typically allows for datasets of about 100000 files.","properties":{"id":{"description":"Catalog internal UUIDv4 for datablock","type":"string"},"archiveId":{"description":"Unique identifier given bey archive system to the stored datablock. This id is used when data is retrieved back.","type":"string"},"size":{"description":"Total size in bytes of all files in datablock when unpacked","type":"number","format":"double"},"packedSize":{"description":"Size of datablock package file","type":"number","format":"double"},"chkAlg":{"description":"Algoritm used for calculation of checksums, e.g. sha2","type":"string"},"version":{"description":"Version string defining format of how data is packed and stored in archive","type":"string"},"dataFileList":{"type":"array","items":{"$ref":"#/definitions/Datafile"}},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"datasetId":{"type":"string"},"rawDatasetId":{"type":"string"},"derivedDatasetId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","archiveId","size","version","dataFileList","ownerGroup"],"additionalProperties":false},"DatasetAttachment":{"description":"Small less than 16 MB attchments for datasets, envisaged for png/jpeg previews","properties":{"thumbnail":{"default":"retrieve","description":"Contains a thumbnail preview in base64 encoded png format for a given dataset","type":"string"},"creationTime":{"description":"Time when job is created. Format according to chapter 5.6 internet date/time format in RFC 3339","type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"},"datasetId":{"type":"string"},"rawDatasetId":{"type":"string"},"derivedDatasetId":{"type":"string"}},"required":["thumbnail"],"additionalProperties":false},"OrigDatablock":{"description":"Container list all files and their attributes which make up a dataset. Usually Filled at the time the datasets metadata is created in the data catalog. Can be used by subsequent archiving processes to create the archived datasets.","properties":{"id":{"$ref":"#/definitions/ObjectID"},"size":{"description":"Total size in bytes of all files contained in the dataFileList","type":"number","format":"double"},"dataFileList":{"description":"List of files contained in the linked dataset. Files can be regular files, folders and softlinks. All file paths are relative paths with respect to the sourceFolder location of the linked dataset.","type":"array","items":{"$ref":"#/definitions/Datafile"}},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"datasetId":{"type":"string"},"rawDatasetId":{"type":"string"},"derivedDatasetId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["size","dataFileList","ownerGroup"],"additionalProperties":false},"Dataset":{"description":"Stores the meta data information for a given collection of files. It defines a list of mandatory and optional metadata fields to be defined. Datasets have a PID field for unique identification. A DOI field can be added for publication purposes later. This is the base 'class' for derived documents like raw datasets or derived datasets. The type field is used to distinguish between the different types of datasets. For each dataset in addition a DatasetLifecycle and a OrigDatablock type of container can be created, giving additional information about the datasets lifecycles and its containing files.","properties":{"pid":{"description":"Persistent Identifier for datasets derived from UUIDv4 and prepended automatically by site specific PID prefix like 20.500.12345/","type":"string"},"owner":{"description":"Owner of the data set, usually first name + lastname","type":"string"},"ownerEmail":{"description":"Email of owner of the data set","type":"string"},"orcidOfOwner":{"description":"ORCID of owner https://orcid.org if available","type":"string"},"contactEmail":{"description":"Email of contact person for this dataset","type":"string"},"sourceFolder":{"description":"Absolute file path on file server containing the files of this dataset, optionally including protocol and file server hostname, e.g. nfs://fileserver1.example.com/some/path/to/sourcefolder. In case of a single file dataset, e.g. HDF5 data it contains the path up to, but excluding the filename.","type":"string"},"size":{"description":"Total size of all source files contained in source folder on disk when unpacked","type":"number","format":"double"},"packedSize":{"description":"Total size of all datablock package files created for this dataset","type":"number","format":"double"},"creationTime":{"description":"Time when dataset became fully available on disk, i.e. all containing files have been written. Format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server.","type":"string","format":"date-time"},"type":{"description":"Characterize type of dataset, either 'base' or 'raw' or 'derived'. Autofilled","type":"string"},"validationStatus":{"description":"Defines a level of trust, e.g. a measure of how much data was verified or used by other persons","type":"string"},"keywords":{"description":"Array of tags associated with the meaning or contents of this dataset. Values should ideally come from defined vocabularies, taxonomies, ontologies or knowledge graphs","type":"array","items":{"type":"string"}},"description":{"description":"Free text explanation of contents of dataset","type":"string"},"datasetName":{"description":"A name for the dataset, given by the creator to carry some semantic meaning. Useful for display purposes e.g. instead of displaying the pid","type":"string"},"userTargetLocation":{"description":"User choosable absolute virtual path where datasets are stored. Mainly used as a help for the enduser at dataset retrieval time to find the proper dataset. Will be prepended by p-group","type":"string"},"classification":{"description":"ACIA information about AUthenticity,COnfidentiality,INtegrity and AVailability requirements of dataset. E.g. AV(ailabilty)=medium could trigger the creation of a two tape copies. Format 'AV=medium,CO=low'","type":"string"},"license":{"description":"Name of license under which data can be used","type":"string"},"version":{"description":"Version of API used in creation of dataset","type":"string"},"doi":{"description":"Digital object Identifier like doi: used for publication purposes","type":"string"},"isPublished":{"description":"Flag is true when data are made publically available","type":"boolean"},"archivable":{"description":"Copy of archivable flag from DatasetLifecycle","type":"boolean"},"retrievable":{"description":"Copy of retrievable flag from DatasetLifecycle","type":"boolean"},"publishable":{"description":"Copy of publishable flag from DatasetLifecycle","type":"boolean"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["pid","owner","contactEmail","sourceFolder","creationTime","type","ownerGroup"],"additionalProperties":false},"Sample":{"description":"Models describing the characteristics of the samples to be investigated. Raw datasets should be linked to such sample definitions.","properties":{"samplelId":{"type":"string"},"owner":{"type":"string"},"description":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"sampleCharacteristics":{"type":"object"},"attachments":{"type":"array","items":{"type":"string"}},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["samplelId","ownerGroup"],"additionalProperties":false},"Proposal":{"description":"Defines the purpose of an experiment and links an experiment to principal investigator and main proposer","properties":{"proposalId":{"description":"Globally unique identifier of a proposal, eg. PID-prefix/internal-proposal-number. PID prefix is auto prepended","type":"string"},"pi_email":{"description":"Email of principal investigator","type":"string"},"pi_firstname":{"description":"First name of principal investigator","type":"string"},"pi_lastname":{"description":"Last name of principal investigator","type":"string"},"email":{"description":"Email of main proposer","type":"string"},"firstname":{"description":"First name of main proposer","type":"string"},"lastname":{"description":"Last name of main proposer","type":"string"},"title":{"type":"string"},"abstract":{"type":"string"},"attachments":{"description":"Array of URLs pointing to attached documents","type":"array","items":{"type":"string"}},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"MeasurementPeriodList":{"type":"array","items":{"$ref":"#/definitions/MeasurementPeriod"}}},"required":["proposalId","email","ownerGroup"],"additionalProperties":false},"RawDataset":{"description":"Contains the information for datasets which are the result of measurements or of simulations. Often raw datasets are automatically added as part of an automated ingest step as part of the data acquisition chain at an instrument. This schema inherits the fields from the generic Dataset collection and adds specific fields as defined below.","properties":{"principalInvestigator":{"description":"Email of principal investigator","type":"string"},"endTime":{"description":"Time of end of data taking for this dataset, format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"creationLocation":{"description":"Unique location identifier where data was taken, usually in the form /Site-name/facility-name/instrumentOrBeamline-name","type":"string"},"dataFormat":{"description":"Defines format of subsequent scientific meta data, e.g Nexus Version x.y","type":"string"},"scientificMetadata":{"description":"JSON object containing the scientific meta data","type":"object"},"pid":{"description":"Persistent Identifier for datasets derived from UUIDv4 and prepended automatically by site specific PID prefix like 20.500.12345/","type":"string"},"owner":{"description":"Owner of the data set, usually first name + lastname","type":"string"},"ownerEmail":{"description":"Email of owner of the data set","type":"string"},"orcidOfOwner":{"description":"ORCID of owner https://orcid.org if available","type":"string"},"contactEmail":{"description":"Email of contact person for this dataset","type":"string"},"sourceFolder":{"description":"Absolute file path on file server containing the files of this dataset, optionally including protocol and file server hostname, e.g. nfs://fileserver1.example.com/some/path/to/sourcefolder. In case of a single file dataset, e.g. HDF5 data it contains the path up to, but excluding the filename.","type":"string"},"size":{"description":"Total size of all source files contained in source folder on disk when unpacked","type":"number","format":"double"},"packedSize":{"description":"Total size of all datablock package files created for this dataset","type":"number","format":"double"},"creationTime":{"description":"Time when dataset became fully available on disk, i.e. all containing files have been written. Format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server.","type":"string","format":"date-time"},"type":{"description":"Characterize type of dataset, either 'base' or 'raw' or 'derived'. Autofilled","type":"string"},"validationStatus":{"description":"Defines a level of trust, e.g. a measure of how much data was verified or used by other persons","type":"string"},"keywords":{"description":"Array of tags associated with the meaning or contents of this dataset. Values should ideally come from defined vocabularies, taxonomies, ontologies or knowledge graphs","type":"array","items":{"type":"string"}},"description":{"description":"Free text explanation of contents of dataset","type":"string"},"datasetName":{"description":"A name for the dataset, given by the creator to carry some semantic meaning. Useful for display purposes e.g. instead of displaying the pid","type":"string"},"userTargetLocation":{"description":"User choosable absolute virtual path where datasets are stored. Mainly used as a help for the enduser at dataset retrieval time to find the proper dataset. Will be prepended by p-group","type":"string"},"classification":{"description":"ACIA information about AUthenticity,COnfidentiality,INtegrity and AVailability requirements of dataset. E.g. AV(ailabilty)=medium could trigger the creation of a two tape copies. Format 'AV=medium,CO=low'","type":"string"},"license":{"description":"Name of license under which data can be used","type":"string"},"version":{"description":"Version of API used in creation of dataset","type":"string"},"doi":{"description":"Digital object Identifier like doi: used for publication purposes","type":"string"},"isPublished":{"description":"Flag is true when data are made publically available","type":"boolean"},"archivable":{"description":"Copy of archivable flag from DatasetLifecycle","type":"boolean"},"retrievable":{"description":"Copy of retrievable flag from DatasetLifecycle","type":"boolean"},"publishable":{"description":"Copy of publishable flag from DatasetLifecycle","type":"boolean"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"sampleId":{"type":"string"},"proposalId":{"type":"string"}},"required":["principalInvestigator","creationLocation","pid","owner","contactEmail","sourceFolder","creationTime","type","ownerGroup"],"additionalProperties":false},"DerivedDataset":{"description":"Contains the information for datasets which are the result of an analysis step, typically based on raw datasets or other derived datasets as input. Derived datasets are typically added by the researcher pursuing the specific analysis. This schema inherits the fields from the generic Dataset collection and adds specific fields as defined below.","properties":{"investigator":{"description":"Email of person pursuing the data analysis","type":"string"},"inputDatasets":{"description":"Array of input dataset identifiers used in producing the derived dataset. Ideally these are the global identifier to existing datasets inside this or federated data catalogs","type":"array","items":{"type":"string"}},"usedSoftware":{"description":"A list of links to software repositories which uniquely identifies the software used and the version for yielding the derived data","type":"array","items":{"type":"string"}},"jobParameters":{"description":"The creation process of the drived data will usually depend on input job parameters. The full structure of these input parameters are stored here","type":"object"},"jobLogData":{"description":"The output job logfile. Keep the size of this log data well below 15 MB ","type":"string"},"pid":{"description":"Persistent Identifier for datasets derived from UUIDv4 and prepended automatically by site specific PID prefix like 20.500.12345/","type":"string"},"owner":{"description":"Owner of the data set, usually first name + lastname","type":"string"},"ownerEmail":{"description":"Email of owner of the data set","type":"string"},"orcidOfOwner":{"description":"ORCID of owner https://orcid.org if available","type":"string"},"contactEmail":{"description":"Email of contact person for this dataset","type":"string"},"sourceFolder":{"description":"Absolute file path on file server containing the files of this dataset, optionally including protocol and file server hostname, e.g. nfs://fileserver1.example.com/some/path/to/sourcefolder. In case of a single file dataset, e.g. HDF5 data it contains the path up to, but excluding the filename.","type":"string"},"size":{"description":"Total size of all source files contained in source folder on disk when unpacked","type":"number","format":"double"},"packedSize":{"description":"Total size of all datablock package files created for this dataset","type":"number","format":"double"},"creationTime":{"description":"Time when dataset became fully available on disk, i.e. all containing files have been written. Format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server.","type":"string","format":"date-time"},"type":{"description":"Characterize type of dataset, either 'base' or 'raw' or 'derived'. Autofilled","type":"string"},"validationStatus":{"description":"Defines a level of trust, e.g. a measure of how much data was verified or used by other persons","type":"string"},"keywords":{"description":"Array of tags associated with the meaning or contents of this dataset. Values should ideally come from defined vocabularies, taxonomies, ontologies or knowledge graphs","type":"array","items":{"type":"string"}},"description":{"description":"Free text explanation of contents of dataset","type":"string"},"datasetName":{"description":"A name for the dataset, given by the creator to carry some semantic meaning. Useful for display purposes e.g. instead of displaying the pid","type":"string"},"userTargetLocation":{"description":"User choosable absolute virtual path where datasets are stored. Mainly used as a help for the enduser at dataset retrieval time to find the proper dataset. Will be prepended by p-group","type":"string"},"classification":{"description":"ACIA information about AUthenticity,COnfidentiality,INtegrity and AVailability requirements of dataset. E.g. AV(ailabilty)=medium could trigger the creation of a two tape copies. Format 'AV=medium,CO=low'","type":"string"},"license":{"description":"Name of license under which data can be used","type":"string"},"version":{"description":"Version of API used in creation of dataset","type":"string"},"doi":{"description":"Digital object Identifier like doi: used for publication purposes","type":"string"},"isPublished":{"description":"Flag is true when data are made publically available","type":"boolean"},"archivable":{"description":"Copy of archivable flag from DatasetLifecycle","type":"boolean"},"retrievable":{"description":"Copy of retrievable flag from DatasetLifecycle","type":"boolean"},"publishable":{"description":"Copy of publishable flag from DatasetLifecycle","type":"boolean"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["investigator","inputDatasets","usedSoftware","pid","owner","contactEmail","sourceFolder","creationTime","type","ownerGroup"],"additionalProperties":false},"MeasurementPeriod":{"description":"Embedded information used inside proposals to define which type of experiment as to be pursued where (at which intrument) and when.","properties":{"id":{"description":"id currently needed by limitation in embedsmany","type":"string"},"instrument":{"description":"Instrument or beamline identifier where measurement was pursued, e.g. /PSI/SLS/TOMCAT","type":"string"},"start":{"description":"Time when measurement period started, format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"end":{"description":"Time when measurement period ended, format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"comment":{"description":"Additional information relevant for this measurement period, e.g. if different accounts were used for data taking","type":"string"}},"required":["id","instrument"],"additionalProperties":false},"PublishedData":{"description":"Stores the meta data information for an accessible, published and DOI-identified collection of datasets. It defines a list of mandatory and optional metadata fields to be included. DataCite mandatory fields, a full URL to the landing page and modification times are included.","properties":{"doi":{"description":"Digital Object Identifier","type":"string"},"affiliation":{"description":"Creator Affiliation","type":"string"},"creator":{"description":"Creator of dataset/dataset collection","type":"string"},"publisher":{"description":"Dataset publisher","type":"string"},"publicationYear":{"description":"Year of publication ","type":"number","format":"double"},"title":{"description":"Title","type":"string"},"url":{"description":"Full URL to the landing page for this DOI","type":"string"},"abstract":{"description":"Abstract text for published datasets","type":"string"},"dataDescription":{"description":"Link to description of how to re-use data","type":"string"},"thumbnail":{"description":"Small, less than 16 MB base 64 image preview of dataset","type":"string"},"resourceType":{"description":"Type of files, format etc","type":"string"},"numberOfFiles":{"description":"Number of files","type":"number","format":"double"},"sizeOfArchive":{"description":"Size of archive","type":"number","format":"double"},"pidArray":{"description":"Array of one or more PIDS which make up the published data","type":"array","items":{"type":"string"}},"authors":{"description":"Array of one or more persons who are able to update this entry of published data","type":"array","items":{"type":"string"}},"doiRegisteredSuccessfullyTime":{"description":"Time when doi is successfully registered","type":"string","format":"date-time"}},"required":["doi","affiliation","creator","publisher","publicationYear","title","url","abstract","dataDescription","thumbnail","resourceType","numberOfFiles","sizeOfArchive","pidArray","authors"],"additionalProperties":false},"Message":{"description":"Embedded information used inside DatasetLifecycle or Job to keep track of history.","properties":{"id":{"description":"id currently needed by limitation in embedsmany","type":"string"},"shortMessage":{"description":"Short description of message, like datasetArchiveSuccesful","type":"string"},"sender":{"description":"Email of user or role who triggered the message","type":"string"},"when":{"default":"$now","description":"Time when message was received. Will be filled automatically by the server, format according to chapter 5.6 internet date/time format in RFC 3339.","type":"string","format":"date-time"},"payload":{"description":"Additional information relevant for this message. Please note this is an object","type":"object"}},"required":["id","shortMessage","sender"],"additionalProperties":false},"AccessUser":{"properties":{"sAMAccountName":{"type":"string"},"displayName":{"type":"string"},"description":{"type":"string"},"email":{"type":"string"},"memberOf":{"type":"array","items":{"type":"string"}}},"required":["sAMAccountName"],"additionalProperties":false},"AccessGroup":{"properties":{"sAMAccountName":{"type":"string"},"description":{"type":"string"},"member":{"type":"array","items":{"type":"string"}},"memberOf":{"type":"array","items":{"type":"string"}}},"required":["sAMAccountName"],"additionalProperties":false},"UserCredential":{"properties":{"provider":{"type":"string"},"authScheme":{"type":"string"},"externalId":{"type":"string"},"profile":{"type":"object"},"credentials":{"type":"object"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"},"userId":{"$ref":"#/definitions/ObjectID"}},"additionalProperties":false},"UserIdentity":{"properties":{"provider":{"type":"string"},"authScheme":{"type":"string"},"externalId":{"type":"string"},"profile":{"type":"object"},"credentials":{"type":"object"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"},"userId":{"$ref":"#/definitions/ObjectID"}},"additionalProperties":false},"ApplicationCredential":{"properties":{"provider":{"type":"string"},"authScheme":{"type":"string"},"credentials":{"type":"object"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"}},"required":["provider"],"additionalProperties":false},"Policy":{"description":"Definition of policy parameters relevant for the storgae lifecycle management of the datasets","properties":{"manager":{"description":"Defines the emails of users that can modify the policy parameters","type":"array","items":{"type":"string"}},"tapeRedundancy":{"default":"low","description":"Defines the level of redundancy in storage to minimize loss of data. Allowed values are low, medium, high. Low could e.g. mean one tape copy only, medium could mean two tape copies and high two geo-redundant tape copies","type":"string"},"autoArchive":{"default":true,"description":"Flag to indicate that a dataset should be automatically archived after ingest. If false then archive delay is ignored","type":"boolean"},"autoArchiveDelay":{"default":7,"description":"Number of days after dataset creation that (remaining) datasets are archived automatically","type":"number","format":"double"},"archiveEmailNotification":{"default":false,"description":"Flag is true when an email notification should be sent to archiveEmailsToBeNotified upon an archive job creation","type":"boolean"},"archiveEmailsToBeNotified":{"description":"Array of additional email addresses that should be notified up an archive job creation","type":"array","items":{"type":"string"}},"retrieveEmailNotification":{"default":false,"description":"Flag is true when an email notification should be sent to retrieveEmailsToBeNotified upon a retrieval job creation","type":"boolean"},"retrieveEmailsToBeNotified":{"description":"Array of additional email addresses that should be notified up a retrieval job creation","type":"array","items":{"type":"string"}},"embargoPeriod":{"default":3,"description":"Number of years after dataset creation before the dataset becomes public","type":"number","format":"double"},"ownerGroup":{"description":"Defines the group which owns the data, and therefore has unrestricted access to this data. Usually a pgroup like p12151","type":"string"},"accessGroups":{"description":"Optional additional groups which have read access to the data. Users which are member in one of the groups listed here are allowed to access this data. The special group 'public' makes data available to all users","type":"array","items":{"type":"string"}},"createdBy":{"description":"Functional or user account name who created this instance","type":"string"},"updatedBy":{"description":"Functional or user account name who last updated this instance","type":"string"},"id":{"$ref":"#/definitions/ObjectID"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["ownerGroup"],"additionalProperties":false},"Job":{"description":"This collection keeps information about jobs to be excuted in external systems. In particular it keeps information about the jobs submitted for archiving or retrieving datasets stored inside an archive system. It can also be used to keep track of analysis jobs e.g. for automated analysis workflows.","properties":{"emailJobInitiator":{"description":"The email of the person initiating the job request","type":"string"},"type":{"default":"retrieve","description":"Type of job, e.g. archive, retrieve etc","type":"string"},"creationTime":{"description":"Time when job is created. Format according to chapter 5.6 internet date/time format in RFC 3339","type":"string","format":"date-time"},"executionTime":{"description":"Time when job should be executed. If not specified then the Job will be executed asap. Format according to chapter 5.6 internet date/time format in RFC 3339","type":"string","format":"date-time"},"jobParams":{"description":"Object of key-value pairs defining job input parameters, e.g. 'desinationPath' for retrieve jobs or 'tapeCopies' for archive jobs","type":"object"},"jobStatusMessage":{"description":"Defines current status of job lifecycle","type":"string"},"datasetList":{"description":"Array of objects with keys: pid, files. The value for the pid key defines the dataset ID, the value for the files key is an array of file names. This array is either an empty array, implying that all files within the dataset are selected or an explicit list of dataset-relative file paths, which should be selected","type":"object"},"archiveReturnMessage":{"description":"Detailed status or error message returned by archive system at archive job creation time. If One Job request triggers many archive requests, e.g. when archiving multiple datasets in one job, then this message contains the result of the last dataset handled. Warning: to be obsoleted","type":"string"},"dateOfLastMessage":{"description":"Time when last status message was sent. Format according to chapter 5.6 internet date/time format in RFC 3339. This will be filled automatically if not provided. Warning: to be obsoleted.","type":"string","format":"date-time"},"id":{"$ref":"#/definitions/ObjectID"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"MessageHistory":{"type":"array","items":{"$ref":"#/definitions/Message"}}},"required":["emailJobInitiator","type","datasetList"],"additionalProperties":false},"ObjectID":{"type":"string","pattern":"^[a-fA-F\\d]{24}$"},"Datafile":{"description":"Embedded schema definition for which fields are required for each file","properties":{"path":{"description":"Relative path of the file within the dataset folder","type":"string"},"size":{"description":"Uncompressed file size in bytes","type":"number","format":"double"},"time":{"description":"Time of file creation on disk, format according to chapter 5.6 internet date/time format in RFC 3339. Local times without timezone/offset info are automatically transformed to UTC using the timezone of the API server","type":"string","format":"date-time"},"chk":{"description":"Checksum for the file, e.g. its sha-2 hashstring","type":"string"},"uid":{"description":"optional: user ID name as seen on filesystem","type":"string"},"gid":{"description":"optional: group ID name as seen on filesystem","type":"string"},"perm":{"description":"optional: Posix permission bits","type":"string"}},"required":["path"],"additionalProperties":false}}} \ No newline at end of file diff --git a/common/models/dataset.json b/common/models/dataset.json index 6622aa9f..e5c3c776 100644 --- a/common/models/dataset.json +++ b/common/models/dataset.json @@ -78,6 +78,10 @@ "type": "string", "description": "Free text explanation of contents of dataset" }, + "datasetName": { + "type": "string", + "description": "A name for the dataset, given by the creator to carry some semantic meaning. Useful for display purposes e.g. instead of displaying the pid" + }, "userTargetLocation": { "type": "string", "description": "User choosable absolute virtual path where datasets are stored. Mainly used as a help for the enduser at dataset retrieval time to find the proper dataset. Will be prepended by p-group" From 1a8d5b21dc4d657cf2ca0b27668f40196d3edfad Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 28 Nov 2018 10:22:56 +0100 Subject: [PATCH 102/147] change edit permissions --- common/models/dataset-attachment.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/common/models/dataset-attachment.json b/common/models/dataset-attachment.json index 345ce496..cb43cd23 100644 --- a/common/models/dataset-attachment.json +++ b/common/models/dataset-attachment.json @@ -37,6 +37,19 @@ "required": true } }, - "acls": [], + "acls": [ + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "ingestor", + "permission": "ALLOW" + }, + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "DENY" + } + ], "methods": {} } From 12f11823456f33cd3e0f9644c1d9c274043ce851 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 28 Nov 2018 15:10:41 +0100 Subject: [PATCH 103/147] remove ESS docker image tag --- CI/ESS/Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/CI/ESS/Jenkinsfile b/CI/ESS/Jenkinsfile index 7f591845..9657ddc4 100644 --- a/CI/ESS/Jenkinsfile +++ b/CI/ESS/Jenkinsfile @@ -10,6 +10,7 @@ node('docker') { echo "Git image id : ${IMAGE_ID}" sh "docker push dacat/catamel:${IMAGE_ID}dev" sh "docker push dacat/catamel:latest" + sh "docker rmi dacat/catamel:${IMAGE_ID}dev" } } stage('SuperTest Catamel ') { From 14a64f661a19bcd6dde6d0b758cd344fddbca91e Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 5 Dec 2018 11:25:58 +0100 Subject: [PATCH 104/147] Issue #109 Issue #108 --- common/models/dataset-lifecycle.js | 65 ++++++++++++------------------ common/models/dataset.js | 61 +++++++++++++++++++++++++--- common/models/policy.js | 19 ++++----- 3 files changed, 92 insertions(+), 53 deletions(-) diff --git a/common/models/dataset-lifecycle.js b/common/models/dataset-lifecycle.js index c6fc1da4..5cc094c9 100644 --- a/common/models/dataset-lifecycle.js +++ b/common/models/dataset-lifecycle.js @@ -45,47 +45,34 @@ module.exports = function(Datasetlifecycle) { } } // add ownerGroup field from linked Datasets - utils.addOwnerGroup(ctx, next) + utils.addOwnerGroup(ctx, next); }) - // transfer status flags to linked dataset Datasetlifecycle.observe('after save', (ctx, next) => { - var Dataset = app.models.Dataset - var instance = ctx.instance - if (!instance) { - instance = ctx.currentInstance - } - if (instance && (instance.datasetId !== undefined)) { - const datasetId = decodeURIComponent(instance.datasetId) - Dataset.findById(datasetId, null, ctx.options).then(datasetInstance => { - if (datasetInstance) { - // important to pass options here, otherwise context gets lost - datasetInstance.updateAttributes({ - archivable: instance.archivable, - retrievable: instance.retrievable, - publishable: instance.publishable - }, ctx.options, - function(err, datasetInstance) { - if (err) { - var error = new Error(); - error.statusCode = 403; - error.message = err; - next(error) - } else { - next() - } - }) - } else { - var error = new Error(); - error.statusCode = 404; - error.message = "DatasetLifecycle after save: No dataset found with pid " + datasetId - next(error) + // TODO add here a hook to check the relevant policy record for "autoArchive" + // if this is "true" then create a new job instance to archive the dataset. + // do NOT override the CLI parameter for autoArchive... + + // if ingest CLI already auto archive return + /* var Policy = app.models.Policy; + Policy.findOne({ + where: { + ownerGroup: ctx.instance.ownerGroup + } + }, + function(err, policyInstance) { + if (!policyInstance || err) { + console.log("Error when looking for Policy of pgroup ", ctx.instance.ownerGroup, err) + } + else { + if (policyInstance && policyInstance.autoArchive ) { + // create auto archive job + + utils.createArchiveJob(policyInstance, ctx); + } } - }) - } else { - next() - } - }) + });*/ + }); Datasetlifecycle.isValid = function(instance, next) { var ds = new Datasetlifecycle(instance) @@ -126,12 +113,12 @@ module.exports = function(Datasetlifecycle) { } else { Dataset.findById(id, options, function(err, instance) { if (err) { - console.log("==== error finding dataset:", err) + console.log("==== error finding dataset:",err) next(err); } else { instance.updateAttributes({ packedSize: 0, - }, options, function(err, inst) { + }, options, function(err,inst){ next(); }); } diff --git a/common/models/dataset.js b/common/models/dataset.js index 8b52a1ab..4da6a5c5 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -33,7 +33,7 @@ module.exports = function(Dataset) { next(); }); - // auto add pid, add a policy record + // auto add pid Dataset.observe('before save', (ctx, next) => { if (ctx.instance) { if (ctx.isNewInstance) { @@ -43,12 +43,64 @@ module.exports = function(Dataset) { console.log(' unmodified pid:', ctx.instance.pid); } ctx.instance.version = p.version; + } - // add a policy record now (A Groups). Check that one doesnt already exist + // auto fill classification + if (ctx.instance) { + if (!ctx.instance.ownerGroup) { + next("No owner group defined"); + } var Policy = app.models.Policy; - Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail); + if (!ctx.instance.classification) { + // classification undefined + Policy.findOne({ + where: { + ownerGroup: ctx.instance.ownerGroup + } + }, + function(err, policyInstance) { + if (err) { + console.log("Error when looking for Policy of pgroup ", ctx.instance.ownerGroup, err); + next(err); + } else if (policyInstance) { + var classification = ""; + switch (policyInstance.tapeRedundancy) { + case "low": + classification = "IN=medium,AV=low,CO=low"; + break; + case "medium": + classification = "IN=medium,AV=medium,CO=low"; + break; + case "high": + classification = "IN=medium,AV=high,CO=low"; + break; + default: + classification = "IN=medium,AV=low,CO=low"; + } + ctx.instance.classification = classification; + next(); + } else { + // neither a policy or a classification exist + ctx.instance.classification = "N=medium,AV=low,CO=low"; + Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail, ""); + next(); + } + }); + } else { + // create policy from classification + var classification = ctx.instance.classification; + var tapeRedundancy = ""; + if (classification.includes("AV=low")) { + tapeRedundancy = "low"; + } else if (classification.includes("AV=medium")) { + tapeRedundancy = "medium"; + } else if (classification.includes("AV=high")) { + tapeRedundancy = "high"; + } + Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail, tapeRedundancy); + next(); + } } - next(); }); // clean up data connected to a dataset, e.g. if archiving failed @@ -384,5 +436,4 @@ module.exports = function(Dataset) { }); }; - }; diff --git a/common/models/policy.js b/common/models/policy.js index a86644ef..fedd3f2f 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -42,28 +42,29 @@ module.exports = function(Policy) { } }); - Policy.addDefault = function(ownerGroup, ownerEmail) { + Policy.addDefault = function(ownerGroup, ownerEmail, tapeRedundancy) { // TODO: move the deault definition somewhere more sensible var defaultPolicy = Object(); defaultPolicy.ownerGroup = ownerGroup; - if (config && !ownerEmail) - { + if (config && !ownerEmail) { defaultPolicy.ownerEmail = config.defaultManager; - } - else - { + } else { defaultPolicy.manager = ownerEmail.split(","); } - defaultPolicy.tapeRedundancy = "low"; + if (tapeRedundancy) { + defaultPolicy.tapeRedundancy = tapeRedundancy; + } else { + defaultPolicy.tapeRedundancy = "low"; // AV default low + } defaultPolicy.autoArchive = false; defaultPolicy.autoArchiveDelay = 7; defaultPolicy.archiveEmailNotification = true; defaultPolicy.retrieveEmailNotification = true; - defaultPolicy.tapeRedundancy = "low"; + defaultPolicy.archiveEmailsToBeNotified = defaultPolicy.manager; + defaultPolicy.retrieveEmailsToBeNotified = defaultPolicy.manager; defaultPolicy.embargoPeriod = 3; //filter must be an object var filter = JSON.parse('{"where": {"ownerGroup":"' + ownerGroup + '"}}'); - console.log("default policy: " + JSON.stringify(defaultPolicy)); Policy.findOrCreate(filter, defaultPolicy); }; }; From 7f014d7dff3eb656c6a081a9c4c6199b6a10bbbf Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 5 Dec 2018 11:37:45 +0100 Subject: [PATCH 105/147] undo unintended delete --- common/models/dataset-lifecycle.js | 65 ++++++++++++++++++------------ 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/common/models/dataset-lifecycle.js b/common/models/dataset-lifecycle.js index 5cc094c9..c6fc1da4 100644 --- a/common/models/dataset-lifecycle.js +++ b/common/models/dataset-lifecycle.js @@ -45,34 +45,47 @@ module.exports = function(Datasetlifecycle) { } } // add ownerGroup field from linked Datasets - utils.addOwnerGroup(ctx, next); + utils.addOwnerGroup(ctx, next) }) + // transfer status flags to linked dataset Datasetlifecycle.observe('after save', (ctx, next) => { - // TODO add here a hook to check the relevant policy record for "autoArchive" - // if this is "true" then create a new job instance to archive the dataset. - // do NOT override the CLI parameter for autoArchive... - - // if ingest CLI already auto archive return - /* var Policy = app.models.Policy; - Policy.findOne({ - where: { - ownerGroup: ctx.instance.ownerGroup - } - }, - function(err, policyInstance) { - if (!policyInstance || err) { - console.log("Error when looking for Policy of pgroup ", ctx.instance.ownerGroup, err) - } - else { - if (policyInstance && policyInstance.autoArchive ) { - // create auto archive job - - utils.createArchiveJob(policyInstance, ctx); - } + var Dataset = app.models.Dataset + var instance = ctx.instance + if (!instance) { + instance = ctx.currentInstance + } + if (instance && (instance.datasetId !== undefined)) { + const datasetId = decodeURIComponent(instance.datasetId) + Dataset.findById(datasetId, null, ctx.options).then(datasetInstance => { + if (datasetInstance) { + // important to pass options here, otherwise context gets lost + datasetInstance.updateAttributes({ + archivable: instance.archivable, + retrievable: instance.retrievable, + publishable: instance.publishable + }, ctx.options, + function(err, datasetInstance) { + if (err) { + var error = new Error(); + error.statusCode = 403; + error.message = err; + next(error) + } else { + next() + } + }) + } else { + var error = new Error(); + error.statusCode = 404; + error.message = "DatasetLifecycle after save: No dataset found with pid " + datasetId + next(error) } - });*/ - }); + }) + } else { + next() + } + }) Datasetlifecycle.isValid = function(instance, next) { var ds = new Datasetlifecycle(instance) @@ -113,12 +126,12 @@ module.exports = function(Datasetlifecycle) { } else { Dataset.findById(id, options, function(err, instance) { if (err) { - console.log("==== error finding dataset:",err) + console.log("==== error finding dataset:", err) next(err); } else { instance.updateAttributes({ packedSize: 0, - }, options, function(err,inst){ + }, options, function(err, inst) { next(); }); } From 9709a8b260aa7ac97af6943ed9b14d3b1ca85478 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 5 Dec 2018 12:58:50 +0100 Subject: [PATCH 106/147] unique policy per owner group --- common/models/policy.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/models/policy.js b/common/models/policy.js index fedd3f2f..119df667 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -67,4 +67,6 @@ module.exports = function(Policy) { var filter = JSON.parse('{"where": {"ownerGroup":"' + ownerGroup + '"}}'); Policy.findOrCreate(filter, defaultPolicy); }; + + Policy.validatesUniquenessOf('ownerGroup'); }; From 9eceb537947676892425a413e094a01a93be28dc Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 5 Dec 2018 13:15:42 +0100 Subject: [PATCH 107/147] add thumbnail endpoint --- common/models/dataset.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/common/models/dataset.js b/common/models/dataset.js index 8b52a1ab..b2990f3f 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -384,5 +384,25 @@ module.exports = function(Dataset) { }); }; + Dataset.thumbnail = function( id, cb) { + console.log("get thumbnail"); + const base64string ="data:image/gif;base64,R0lGODlhAQABAAAAACw="; + cb(null, base64string); + return base64string; + } + + Dataset.remoteMethod("thumbnail", { + accepts: [ + { + arg: "id", + type: "string", + required: true + } + ], + http: {path: "/:id/thumbnail", verb: "get"}, + returns: {arg: "base64string", type: "string"} + }); + + }; From e55101f6685b763764a22bea1f51ef3d6276811d Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 5 Dec 2018 13:31:32 +0100 Subject: [PATCH 108/147] add thumbnail endpoint --- common/models/dataset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index b2990f3f..a31560fb 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -386,7 +386,7 @@ module.exports = function(Dataset) { Dataset.thumbnail = function( id, cb) { console.log("get thumbnail"); - const base64string ="data:image/gif;base64,R0lGODlhAQABAAAAACw="; + const base64string ="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; cb(null, base64string); return base64string; } From 35b336db97a1b4322e27bf9224e3904010711a02 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Thu, 6 Dec 2018 16:14:15 +0100 Subject: [PATCH 109/147] Issue #109 Issue #108fix callbacks --- common/models/dataset.js | 16 +++++++--------- common/models/policy.js | 7 ++++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 4da6a5c5..e3015fd7 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -43,12 +43,11 @@ module.exports = function(Dataset) { console.log(' unmodified pid:', ctx.instance.pid); } ctx.instance.version = p.version; - } - // auto fill classification - if (ctx.instance) { + + // auto fill classification if (!ctx.instance.ownerGroup) { - next("No owner group defined"); + return next("No owner group defined"); } var Policy = app.models.Policy; if (!ctx.instance.classification) { @@ -60,8 +59,9 @@ module.exports = function(Dataset) { }, function(err, policyInstance) { if (err) { - console.log("Error when looking for Policy of pgroup ", ctx.instance.ownerGroup, err); - next(err); + var msg = "Error when looking for Policy of pgroup " + ctx.instance.ownerGroup + " " + err; + console.log(msg); + return next(msg); } else if (policyInstance) { var classification = ""; switch (policyInstance.tapeRedundancy) { @@ -78,12 +78,10 @@ module.exports = function(Dataset) { classification = "IN=medium,AV=low,CO=low"; } ctx.instance.classification = classification; - next(); } else { // neither a policy or a classification exist ctx.instance.classification = "N=medium,AV=low,CO=low"; Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail, ""); - next(); } }); } else { @@ -98,9 +96,9 @@ module.exports = function(Dataset) { tapeRedundancy = "high"; } Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail, tapeRedundancy); - next(); } } + return next(); }); // clean up data connected to a dataset, e.g. if archiving failed diff --git a/common/models/policy.js b/common/models/policy.js index 119df667..fd31fcb0 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -13,7 +13,6 @@ module.exports = function(Policy) { // for policy interactions // check logged in user email is a member of policy.manager Policy.observe('before save', (ctx, next) => { - if (ctx.currentInstance) { //is a partial update currentInstance rather than instance var UserIdentity = app.models.UserIdentity; @@ -48,11 +47,13 @@ module.exports = function(Policy) { defaultPolicy.ownerGroup = ownerGroup; if (config && !ownerEmail) { defaultPolicy.ownerEmail = config.defaultManager; - } else { + } else if (ownerEmail) { defaultPolicy.manager = ownerEmail.split(","); + } else { + defaultPolicy.manager = ""; } if (tapeRedundancy) { - defaultPolicy.tapeRedundancy = tapeRedundancy; + defaultPolicy.tapeRedundancy = tapeRedundancy; } else { defaultPolicy.tapeRedundancy = "low"; // AV default low } From 69037446c770af5b09ba57dd24b2d9248e07df1e Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Thu, 6 Dec 2018 16:35:22 +0100 Subject: [PATCH 110/147] Update dataset.js --- common/models/dataset.js | 1 - 1 file changed, 1 deletion(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index e3015fd7..cb91fafc 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -44,7 +44,6 @@ module.exports = function(Dataset) { } ctx.instance.version = p.version; - // auto fill classification if (!ctx.instance.ownerGroup) { return next("No owner group defined"); From 31b5019db3ddb103ae5e1775c12bd7c77a8fbe90 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 10 Dec 2018 15:14:44 +0100 Subject: [PATCH 111/147] Update dataset.js --- common/models/dataset.js | 1 + 1 file changed, 1 insertion(+) diff --git a/common/models/dataset.js b/common/models/dataset.js index cb91fafc..c9f1ca09 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -44,6 +44,7 @@ module.exports = function(Dataset) { } ctx.instance.version = p.version; + // auto fill classification if (!ctx.instance.ownerGroup) { return next("No owner group defined"); From b248c5573c0d96b7b7468f9bb2e560fb3e47a8a5 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Mon, 10 Dec 2018 16:19:15 +0100 Subject: [PATCH 112/147] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9b703f08..51d8c138 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint": "eslint common/models", "start": "node .", "posttests": "npm run lint && nsp check", - "test": "./node_modules/mocha/bin/mocha --timeout=30000 --reporter spec --exit 2>/dev/null" + "test": "./node_modules/mocha/bin/mocha --timeout=300000 --reporter spec --exit 2>/dev/null" }, "dependencies": { "compression": "^1.7.3", From d1a0caab3b326f1e70c36a15ef67d220882cef90 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 11:43:57 +0100 Subject: [PATCH 113/147] Update testGenerator.js --- test/testGenerator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testGenerator.js b/test/testGenerator.js index c0dd8188..59018ad4 100644 --- a/test/testGenerator.js +++ b/test/testGenerator.js @@ -42,7 +42,7 @@ module.exports = { const expect = c.expect; const url = settings.apiPrefix + route; const withData = c.body || false; - const isWithAuthentication = c.authenticate || false; + const isWithAuthentication = false; From 42114a0fe079af9f5455ca79c0c05ab51fa539df Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 11:55:35 +0100 Subject: [PATCH 114/147] Update testGenerator.js --- test/testGenerator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testGenerator.js b/test/testGenerator.js index 59018ad4..1095a37b 100644 --- a/test/testGenerator.js +++ b/test/testGenerator.js @@ -42,7 +42,7 @@ module.exports = { const expect = c.expect; const url = settings.apiPrefix + route; const withData = c.body || false; - const isWithAuthentication = false; + const isWithAuthentication = true; From 272ca6c13fa792b7398f6a9a86e3407aa8633a27 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 12:15:06 +0100 Subject: [PATCH 115/147] Update testGenerator.js --- test/testGenerator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testGenerator.js b/test/testGenerator.js index 1095a37b..c0dd8188 100644 --- a/test/testGenerator.js +++ b/test/testGenerator.js @@ -42,7 +42,7 @@ module.exports = { const expect = c.expect; const url = settings.apiPrefix + route; const withData = c.body || false; - const isWithAuthentication = true; + const isWithAuthentication = c.authenticate || false; From 08429c19e888bc5ab0280bf61e7d0e50178111be Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 12:55:17 +0100 Subject: [PATCH 116/147] Update tests.json --- test/config/tests.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/config/tests.json b/test/config/tests.json index 373286ab..fb9df6b9 100644 --- a/test/config/tests.json +++ b/test/config/tests.json @@ -80,7 +80,7 @@ "method": "GET", "route": "Datasets/fullfacet", "expect": 200, - "authenticate": "user", + "authenticate": "admin", "response": [ "res.body.should.be.instanceof(Object);", "res.body.should.be.instanceof(Array);" From 6835a37e30d5b40a3a236e4d7edb0dcade65b650 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 13:01:30 +0100 Subject: [PATCH 117/147] Update tests.json --- test/config/tests.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/config/tests.json b/test/config/tests.json index fb9df6b9..a3322d01 100644 --- a/test/config/tests.json +++ b/test/config/tests.json @@ -8,7 +8,7 @@ "method": "GET", "route": "Datasets?filter=%7B%22limit%22%3A10%7D", "expect": 200, - "authenticate": "user", + "authenticate": "admin", "response": [ "res.body.should.be.instanceof(Array);" ] From 700deef1ae69fd1a40e1e59713e762cdaa9ada99 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 13:22:20 +0100 Subject: [PATCH 118/147] Update tests.json --- test/config/tests.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/config/tests.json b/test/config/tests.json index a3322d01..64a3e316 100644 --- a/test/config/tests.json +++ b/test/config/tests.json @@ -51,7 +51,7 @@ "method": "POST", "route": "Datasets", "expect": 200, - "authenticate": "user", + "authenticate": "admin", "body": { "owner": "Bertram Astor", "ownerEmail": "bertram.astor@grumble.com", @@ -90,7 +90,7 @@ "method": "POST", "route": "Jobs", "expect": 400, - "authenticate": "user", + "authenticate": "admin", "body": { "emailJobInitiator": "scicatingestor@psi.ch", "type": "archive", From 5683bad7b2f08cd780b3259ddfe66338b1f12d6d Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 13:31:11 +0100 Subject: [PATCH 119/147] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 51d8c138..9b703f08 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint": "eslint common/models", "start": "node .", "posttests": "npm run lint && nsp check", - "test": "./node_modules/mocha/bin/mocha --timeout=300000 --reporter spec --exit 2>/dev/null" + "test": "./node_modules/mocha/bin/mocha --timeout=30000 --reporter spec --exit 2>/dev/null" }, "dependencies": { "compression": "^1.7.3", From b9ea61d59c28932a7f08a919e3132410abdefac2 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 13:47:19 +0100 Subject: [PATCH 120/147] Update policy.js --- common/models/policy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/policy.js b/common/models/policy.js index fd31fcb0..a08644cf 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -50,7 +50,7 @@ module.exports = function(Policy) { } else if (ownerEmail) { defaultPolicy.manager = ownerEmail.split(","); } else { - defaultPolicy.manager = ""; + defaultPolicy.manager = "scicatingestor@psi.ch"; } if (tapeRedundancy) { defaultPolicy.tapeRedundancy = tapeRedundancy; From 1ec7ae34e8e84192b2c263ca7da8276cb12f8522 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 13:56:23 +0100 Subject: [PATCH 121/147] Update dataset.js --- common/models/dataset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index c9f1ca09..7e122b17 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -80,7 +80,7 @@ module.exports = function(Dataset) { ctx.instance.classification = classification; } else { // neither a policy or a classification exist - ctx.instance.classification = "N=medium,AV=low,CO=low"; + ctx.instance.classification = "IN=medium,AV=low,CO=low"; Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail, ""); } }); From 2cd091771e16f884630c13cc1fbe6406ab0e8947 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Tue, 11 Dec 2018 14:09:03 +0100 Subject: [PATCH 122/147] add endpoint --- .gitignore | 5 +++++ common/models/dataset.js | 2 +- server/boot/createRoles.js | 23 ++++++++++++----------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index fc81ea6b..44fb6bff 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,11 @@ coverage node_modules npm-debug.log server/pass +server/admin +server/ingestor +server/archiveManager +server/proposalIngestor +server/userGroupIngestor server/providers.json server/datasources.json CI/PSI/envfiles/* diff --git a/common/models/dataset.js b/common/models/dataset.js index a31560fb..fe7d5850 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -400,7 +400,7 @@ module.exports = function(Dataset) { } ], http: {path: "/:id/thumbnail", verb: "get"}, - returns: {arg: "base64string", type: "string"} + returns: {type: "string", root: true} }); diff --git a/server/boot/createRoles.js b/server/boot/createRoles.js index aa3a45fe..d4c7e5fd 100644 --- a/server/boot/createRoles.js +++ b/server/boot/createRoles.js @@ -1,14 +1,14 @@ var utils = require('./common_utils'); var fs = require('fs'); -module.exports = function(app, cb2) { +module.exports = function (app, cb2) { // define roles // note: role names are all lowercase , corresponding accounts camelcase // - createRole = function(account, cb) { + createRole = function (account, cb) { var User = app.models.User; @@ -16,7 +16,7 @@ module.exports = function(app, cb2) { where: { username: account } - }, function(err, users) { + }, function (err, users) { if (err) { return cb(err); } else if (users.length === 0) { @@ -25,13 +25,14 @@ module.exports = function(app, cb2) { console.log("creating account " + account); if (fs.existsSync(path)) { var data = fs.readFileSync(path, 'utf8').split('\n')[0].split(" "); + console.log("gm", data); User.create({ realm: 'localhost:3001', username: account, password: data[0], email: data[1], emailVerified: true - }, function(err, user) { + }, function (err, user) { if (err) { console.log("User create:" + err + " " + user) return cb(err) @@ -46,7 +47,7 @@ module.exports = function(app, cb2) { password: 'aman', email: account + '@change.com', emailVerified: true - }, function(err, user) { + }, function (err, user) { if (err) { console.log("User create:" + err + " " + user) return cb(err) @@ -63,12 +64,12 @@ module.exports = function(app, cb2) { }); }; - createRole('admin', function() { - createRole('archiveManager', function() { - createRole('ingestor', function() { - createRole('proposalIngestor', function() { - createRole('userGroupIngestor', function(){ - console.log("Last role mapped, finished booting ",new Date()) + createRole('admin', function () { + createRole('archiveManager', function () { + createRole('ingestor', function () { + createRole('proposalIngestor', function () { + createRole('userGroupIngestor', function () { + console.log("Last role mapped, finished booting ", new Date()) cb2(null) }) }) From 434ba9ec04142ee1f5ba6192bfbf2dceb76e8aa0 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Tue, 11 Dec 2018 14:15:20 +0100 Subject: [PATCH 123/147] add better description to caption --- .gitignore | 1 + common/models/dataset-attachment.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fc81ea6b..0c712be7 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ coverage node_modules npm-debug.log server/pass +server/ingestor server/providers.json server/datasources.json CI/PSI/envfiles/* diff --git a/common/models/dataset-attachment.json b/common/models/dataset-attachment.json index cb43cd23..cfab59e0 100644 --- a/common/models/dataset-attachment.json +++ b/common/models/dataset-attachment.json @@ -19,7 +19,7 @@ }, "caption": { "type": "string", - "description": "Contains a thumbnail preview in base64 encoded png format for a given dataset", + "description": "Dataset attachment caption to show in catanie", "default": "retrieve" }, "creationTime": { From aab3f6fd0fffd9d859f75e0025d8b69c1981be28 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Tue, 11 Dec 2018 14:24:21 +0100 Subject: [PATCH 124/147] upgrade packages --- package-lock.json | 195 ++++++++++++++++++++++++++++++---------------- package.json | 8 +- 2 files changed, 132 insertions(+), 71 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2254f54d..fc4ee05a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -139,7 +139,7 @@ }, "@types/ldapjs": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.3.tgz", "integrity": "sha512-FSj24s1WsFEfOy8taIKp2DokSZfFkjWYZb88AS5eDj3WTocZ+4DnHjhzrXEs048WQ5mfOLJXMOAnc0kSnHh5Lw==", "requires": { "@types/events": "*", @@ -228,9 +228,9 @@ "dev": true }, "acorn-jsx": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", - "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", "dev": true }, "ajv": { @@ -294,7 +294,7 @@ }, "ansi-escapes": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, @@ -359,6 +359,12 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", @@ -594,7 +600,7 @@ }, "callsites": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, @@ -1204,9 +1210,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.9.0.tgz", - "integrity": "sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.10.0.tgz", + "integrity": "sha512-HpqzC+BHULKlnPwWae9MaVZ5AXJKpkxCVXQHrFaRw3hbDj26V/9ArYM4Rr/SQ8pi6qUPLXSSXC4RBJlyq2Z2OQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1218,7 +1224,7 @@ "eslint-scope": "^4.0.0", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", + "espree": "^5.0.0", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", @@ -1228,7 +1234,6 @@ "ignore": "^4.0.6", "imurmurhash": "^0.1.4", "inquirer": "^6.1.0", - "is-resolvable": "^1.1.0", "js-yaml": "^3.12.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", @@ -1250,9 +1255,9 @@ }, "dependencies": { "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -1310,18 +1315,18 @@ } }, "eslint-config-loopback": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-loopback/-/eslint-config-loopback-12.0.0.tgz", - "integrity": "sha512-Pxz7ecK+/4ufJIMMtQ+XimQUP8qpM9IdVvIg78N17w6/PMBoFEeX1ef+ylb3c4BrAGcTzm+gb8VFtFW2JXoWKA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-loopback/-/eslint-config-loopback-12.1.0.tgz", + "integrity": "sha512-3YuzaOdfw5DwZuwmAZdFoBNpQDCDovyWITCY95gfyz9aYt5A8Zr95cEVfxcbTl3xQEyf/9wFUqEe8IbhrURkrA==", "dev": true, "requires": { - "eslint-plugin-mocha": "^4.11.0" + "eslint-plugin-mocha": "^5.2.0" } }, "eslint-plugin-mocha": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.12.1.tgz", - "integrity": "sha512-hxWtYHvLA0p/PKymRfDYh9Mxt5dYkg2Goy1vZDarTEEYfELP9ksga7kKG1NUKSQy27C8Qjc7YrSWTLUhOEOksA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.2.0.tgz", + "integrity": "sha512-4VTX/qIoxUFRnXLNm6bEhEJyfGnGagmQzV4TWXKzkZgIYyP2FSubEdCjEFTyS/dGwSVRWCWGX7jO7BK8R0kppg==", "dev": true, "requires": { "ramda": "^0.25.0" @@ -1350,9 +1355,9 @@ "dev": true }, "espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", "dev": true, "requires": { "acorn": "^6.0.2", @@ -1925,9 +1930,9 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -1941,10 +1946,16 @@ "run-async": "^2.2.0", "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" }, "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, "rxjs": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", @@ -1953,6 +1964,15 @@ "requires": { "tslib": "^1.9.0" } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } } } }, @@ -1983,12 +2003,6 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -2176,15 +2190,36 @@ } }, "ldapauth-fork": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.0.2.tgz", - "integrity": "sha512-YoPHsyfV6L/4SO5EMi/Jk1xUMaY+ANlR4Yp+WIsqGkWOLPKkuzRYB4s/IsdKBeb3sdwVCw+q/YN9eoa1dXmQdA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.1.0.tgz", + "integrity": "sha512-OFz3aJDqYGpgo96gVBKhaIFIO/mc9OFpn9IdINHo22eUmF0leU836HgksIQQ3Ga0Mz48xwEhSZ/rJlWOzaUXJQ==", "requires": { "@types/ldapjs": "^1.0.0", - "@types/node": "^7.0.21", + "@types/node": "^10.12.12", "bcryptjs": "^2.4.0", - "ldapjs": "^1.0.1", - "lru-cache": "^4.0.2" + "ldapjs": "^1.0.2", + "lru-cache": "^5.1.1", + "moment": "^2.22.2" + }, + "dependencies": { + "@types/node": { + "version": "10.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", + "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } } }, "ldapjs": { @@ -2987,7 +3022,7 @@ }, "rimraf": { "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", "optional": true, "requires": { @@ -3015,7 +3050,7 @@ }, "ncp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", "optional": true }, @@ -3143,9 +3178,9 @@ } }, "nodemailer": { - "version": "4.6.8", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.8.tgz", - "integrity": "sha512-A3s7EM/426OBIZbLHXq2KkgvmKbn2Xga4m4G+ZUA4IaZvG8PcZXrFh+2E4VaS2o+emhuUVRnzKN2YmpkXQ9qwA==" + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.7.0.tgz", + "integrity": "sha512-IludxDypFpYw4xpzKdMAozBSkzKHmNBvGanUREjJItgJ2NYcK/s8+PggVhj7c2yGFQykKsnnmv1+Aqo0ZfjHmw==" }, "nodemailer-direct-transport": { "version": "3.3.2", @@ -3340,14 +3375,21 @@ } }, "passport-ldapauth": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.1.0.tgz", - "integrity": "sha512-znZdKW4f1bn4F8MRMzHog8fauSZictsC4GlOTs7ks4pL6HSSFuIZdxr/pnYkRJG+dmdLOqzOBXeFXZJIg4CFQg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.1.1.tgz", + "integrity": "sha512-DiK9nwZthdCeZE+TRx2AzRk9mg8OeAz4+tZdXC8EPVAVmeW7YSWyK4XCJ8/B7ySWpEZtrN1OcrKtWjpLXFy0/A==", "requires": { - "@types/node": "^7.0.23", - "@types/passport": "^0.4.6", - "ldapauth-fork": "^4.0.1", + "@types/node": "^10.12.12", + "@types/passport": "^0.4.7", + "ldapauth-fork": "^4.1.0", "passport-strategy": "^1.0.0" + }, + "dependencies": { + "@types/node": { + "version": "10.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", + "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==" + } } }, "passport-local": { @@ -3461,9 +3503,9 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "proxy-addr": { @@ -3609,7 +3651,7 @@ }, "require-uncached": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { @@ -3826,12 +3868,25 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", + "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } } }, "smtp-connection": { @@ -4168,21 +4223,21 @@ "dev": true }, "table": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", - "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz", + "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==", "dev": true, "requires": { - "ajv": "^6.5.3", - "lodash": "^4.17.10", - "slice-ansi": "1.0.0", + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "2.0.0", "string-width": "^2.1.1" }, "dependencies": { "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -4202,6 +4257,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true } } }, diff --git a/package.json b/package.json index 9b703f08..ad3e95db 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,8 @@ "loopback-ds-timestamp-mixin": "^3.4.1", "moment": "^2.20.1", "moment-timezone": "^0.5.23", - "nodemailer": "^4.6.8", - "passport-ldapauth": "^2.1.0", + "nodemailer": "^4.7.0", + "passport-ldapauth": "^2.1.1", "passport-local": "^1.0.0", "passport-openidconnect": "^0.0.2", "serve-favicon": "2.5.0", @@ -41,8 +41,8 @@ "@mean-expert/loopback-sdk-builder": "^2.1.0", "chai": "^4.2.0", "chai-http": "^4.0.0", - "eslint": "^5.9.0", - "eslint-config-loopback": "^12.0.0", + "eslint": "^5.10.0", + "eslint-config-loopback": "^12.1.0", "mocha": "^5.2.0", "supertest": "^3.3.0" }, From c3a09c2412efa7968221942498c14f72dfc966f6 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 14:54:39 +0100 Subject: [PATCH 125/147] Update policy.js Minor change, using wrong property name --- common/models/policy.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/models/policy.js b/common/models/policy.js index a08644cf..6e6f46e6 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -46,11 +46,11 @@ module.exports = function(Policy) { var defaultPolicy = Object(); defaultPolicy.ownerGroup = ownerGroup; if (config && !ownerEmail) { - defaultPolicy.ownerEmail = config.defaultManager; + defaultPolicy.manager = config.defaultManager; } else if (ownerEmail) { defaultPolicy.manager = ownerEmail.split(","); } else { - defaultPolicy.manager = "scicatingestor@psi.ch"; + defaultPolicy.manager = ""; } if (tapeRedundancy) { defaultPolicy.tapeRedundancy = tapeRedundancy; From 3db2809191b0a1eb253937480ac5efc9e34aa6ce Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 16:50:03 +0100 Subject: [PATCH 126/147] add png(s) to readme for policy --- CI/ESS/images/policy1.png | Bin 0 -> 29147 bytes CI/ESS/images/policy2.png | Bin 0 -> 75835 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 CI/ESS/images/policy1.png create mode 100644 CI/ESS/images/policy2.png diff --git a/CI/ESS/images/policy1.png b/CI/ESS/images/policy1.png new file mode 100644 index 0000000000000000000000000000000000000000..3f17ff0b52a32085135c3686410ade037b77ee4e GIT binary patch literal 29147 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 literal 0 HcmV?d00001 From 3934cc5f559526f6fcdd73eba9bc16bc920280b2 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 16:57:06 +0100 Subject: [PATCH 127/147] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index aa4ed93e..b434a833 100644 --- a/README.md +++ b/README.md @@ -204,3 +204,7 @@ The library is generated by the following command ## Authentication Users are authenticated by loopback built in user accounts and by accounts, which are connected via any of the passport supported strategies, in particular OpenID connected and a direct AD connection + +## Policy Configuration for Archiving and Retrieving + /images/policy1.png or +![model diagram](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/images/policy1.png) From 46dc2c5de2f093ff565e010706a974662281ee1a Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 16:57:54 +0100 Subject: [PATCH 128/147] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index b434a833..6028b7d4 100644 --- a/README.md +++ b/README.md @@ -206,5 +206,4 @@ The library is generated by the following command Users are authenticated by loopback built in user accounts and by accounts, which are connected via any of the passport supported strategies, in particular OpenID connected and a direct AD connection ## Policy Configuration for Archiving and Retrieving - /images/policy1.png or ![model diagram](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/images/policy1.png) From d89a672e68e4c80212731cc015f1899dc6716f5d Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 16:58:25 +0100 Subject: [PATCH 129/147] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6028b7d4..575db561 100644 --- a/README.md +++ b/README.md @@ -206,4 +206,4 @@ The library is generated by the following command Users are authenticated by loopback built in user accounts and by accounts, which are connected via any of the passport supported strategies, in particular OpenID connected and a direct AD connection ## Policy Configuration for Archiving and Retrieving -![model diagram](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/images/policy1.png) +![policy_table](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/images/policy1.png) From e983fd38a02aad6f613fe09bc01a8c0579a04e61 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 11 Dec 2018 17:00:24 +0100 Subject: [PATCH 130/147] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 575db561..f1595584 100644 --- a/README.md +++ b/README.md @@ -207,3 +207,4 @@ Users are authenticated by loopback built in user accounts and by accounts, whic ## Policy Configuration for Archiving and Retrieving ![policy_table](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/images/policy1.png) +![policy_edit](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/images/policy2.png) From ec40a5724ae96cc037a169185115bc1c3e609c88 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Tue, 11 Dec 2018 22:08:45 +0100 Subject: [PATCH 131/147] add to thumbnail --- common/models/dataset.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 1ea88b2a..ccaf2c85 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -435,8 +435,16 @@ module.exports = function(Dataset) { }; Dataset.thumbnail = function( id, cb) { - console.log("get thumbnail"); - const base64string ="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; + // console.log("get thumbnail"); + const base64string= Dataset.findById(id, options, function (err, da) { + const attach = da.datasetattachments; + let base64string ="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; + if (attach === undefined) { + } else { + base64string = attach[0].thumbnail; + } + return base64string; + }); cb(null, base64string); return base64string; } From 496f4fd6db533b2eeec513bee862f9efa23841f6 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Tue, 11 Dec 2018 22:10:50 +0100 Subject: [PATCH 132/147] add options to arg --- common/models/dataset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index ccaf2c85..962c6091 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -434,7 +434,7 @@ module.exports = function(Dataset) { }); }; - Dataset.thumbnail = function( id, cb) { + Dataset.thumbnail = function( id, options, cb) { // console.log("get thumbnail"); const base64string= Dataset.findById(id, options, function (err, da) { const attach = da.datasetattachments; From ffcf463312de25bd0c09a7e15ffff0175ab8181c Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 12 Dec 2018 09:43:24 +0100 Subject: [PATCH 133/147] move screen dumps to catanie --- CI/ESS/images/policy1.png | Bin 29147 -> 0 bytes CI/ESS/images/policy2.png | Bin 75835 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 CI/ESS/images/policy1.png delete mode 100644 CI/ESS/images/policy2.png diff --git a/CI/ESS/images/policy1.png b/CI/ESS/images/policy1.png deleted file mode 100644 index 3f17ff0b52a32085135c3686410ade037b77ee4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29147 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 From d534dd623ca59176c8fb5d04eeedaea677b57cb5 Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 12 Dec 2018 09:57:13 +0100 Subject: [PATCH 134/147] Update README.md --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index f1595584..76e75413 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,3 @@ The library is generated by the following command ## Authentication Users are authenticated by loopback built in user accounts and by accounts, which are connected via any of the passport supported strategies, in particular OpenID connected and a direct AD connection -## Policy Configuration for Archiving and Retrieving -![policy_table](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/images/policy1.png) -![policy_edit](https://github.com/SciCatProject/catamel/blob/develop/CI/ESS/images/policy2.png) From edf50eb3ad15c790e7e826dc32696b3e6bb50cc4 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 12 Dec 2018 10:19:15 +0100 Subject: [PATCH 135/147] update thumbnail --- common/models/dataset.js | 105 +- package-lock.json | 2166 +++++++++++++++++++++++++++++++++++++- package.json | 1 + 3 files changed, 2214 insertions(+), 58 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 962c6091..68818a8d 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -9,26 +9,26 @@ var dsr = require('./raw-dataset.json'); var dsd = require('./derived-dataset.json'); var own = require('./ownable.json'); -module.exports = function(Dataset) { +module.exports = function (Dataset) { var app = require('../../server/server'); // make sure that all times are UTC Dataset.validatesUniquenessOf('pid'); // put - Dataset.beforeRemote('replaceOrCreate', function(ctx, instance, next) { + Dataset.beforeRemote('replaceOrCreate', function (ctx, instance, next) { utils.updateTimesToUTC(['creationTime'], ctx.args.data); next(); }); // patch - Dataset.beforeRemote('patchOrCreate', function(ctx, instance, next) { + Dataset.beforeRemote('patchOrCreate', function (ctx, instance, next) { utils.updateTimesToUTC(['creationTime'], ctx.args.data); next(); }); // post - Dataset.beforeRemote('create', function(ctx, unused, next) { + Dataset.beforeRemote('create', function (ctx, unused, next) { utils.updateTimesToUTC(['creationTime'], ctx.args.data); next(); }); @@ -44,7 +44,7 @@ module.exports = function(Dataset) { } ctx.instance.version = p.version; - + // auto fill classification if (!ctx.instance.ownerGroup) { return next("No owner group defined"); @@ -53,11 +53,11 @@ module.exports = function(Dataset) { if (!ctx.instance.classification) { // classification undefined Policy.findOne({ - where: { - ownerGroup: ctx.instance.ownerGroup - } - }, - function(err, policyInstance) { + where: { + ownerGroup: ctx.instance.ownerGroup + } + }, + function (err, policyInstance) { if (err) { var msg = "Error when looking for Policy of pgroup " + ctx.instance.ownerGroup + " " + err; console.log(msg); @@ -104,11 +104,11 @@ module.exports = function(Dataset) { // clean up data connected to a dataset, e.g. if archiving failed // TODO obsolete this code, replaced by code in datasetLifecycle - Dataset.reset = function(id, options, next) { + Dataset.reset = function (id, options, next) { // console.log('resetting ' + id); var Datablock = app.models.Datablock; var DatasetLifecycle = app.models.DatasetLifecycle; - DatasetLifecycle.findById(id, options, function(err, l) { + DatasetLifecycle.findById(id, options, function (err, l) { if (err) { next(err); } else { @@ -121,12 +121,12 @@ module.exports = function(Dataset) { // console.log('Dataset Lifecycle reset'); Datablock.destroyAll({ datasetId: id, - }, options, function(err, b) { + }, options, function (err, b) { if (err) { next(err); } else { // console.log('Deleted blocks', b); - Dataset.findById(id, options, function(err, instance) { + Dataset.findById(id, options, function (err, instance) { if (err) { next(err); } else { @@ -148,15 +148,15 @@ module.exports = function(Dataset) { // add user Groups information of the logged in user to the fields object - Dataset.beforeRemote('facet', function(ctx, userDetails, next) { + Dataset.beforeRemote('facet', function (ctx, userDetails, next) { utils.handleOwnerGroups(ctx, next); }); - Dataset.beforeRemote('fullfacet', function(ctx, userDetails, next) { + Dataset.beforeRemote('fullfacet', function (ctx, userDetails, next) { utils.handleOwnerGroups(ctx, next); }); - Dataset.beforeRemote('fullquery', function(ctx, userDetails, next) { + Dataset.beforeRemote('fullquery', function (ctx, userDetails, next) { utils.handleOwnerGroups(ctx, next); }); @@ -202,7 +202,7 @@ module.exports = function(Dataset) { } } - Dataset.fullfacet = function(fields, facets = [], cb) { + Dataset.fullfacet = function (fields, facets = [], cb) { // keep the full aggregation pipeline definition let pipeline = [] let match = {} @@ -212,7 +212,7 @@ module.exports = function(Dataset) { // Since a match condition on usergroups is alway prepended at the start // this effectively yields the intersection handling of the two sets (ownerGroup condition and userGroups) - Object.keys(fields).map(function(key) { + Object.keys(fields).map(function (key) { if (facets.indexOf(key) < 0) { if (key === "text") { match["$or"] = [{ @@ -243,7 +243,7 @@ module.exports = function(Dataset) { // append all facet pipelines let facetObject = {}; - facets.forEach(function(facet) { + facets.forEach(function (facet) { if (facet in ds.properties) { facetObject[facet] = utils.createNewFacetPipeline(facet, ds.properties[facet].type, facetMatch); } else if (facet in dsr.properties) { @@ -267,11 +267,11 @@ module.exports = function(Dataset) { $facet: facetObject, }); // console.log("Resulting aggregate query:", JSON.stringify(pipeline, null, 4)); - Dataset.getDataSource().connector.connect(function(err, db) { + Dataset.getDataSource().connector.connect(function (err, db) { var collection = db.collection('Dataset'); var res = collection.aggregate(pipeline, - function(err, cursor) { - cursor.toArray(function(err, res) { + function (err, cursor) { + cursor.toArray(function (err, res) { if (err) { console.log("Facet err handling:", err); } @@ -289,13 +289,13 @@ module.exports = function(Dataset) { // - paging of results // - merging DatasetLifecycle Fields for fields not contained in Dataset - Dataset.fullquery = function(fields, limits, cb) { + Dataset.fullquery = function (fields, limits, cb) { // keep the full aggregation pipeline definition let pipeline = [] let match = {} let matchJoin = {} // construct match conditions from fields value, excluding facet material - Object.keys(fields).map(function(key) { + Object.keys(fields).map(function (key) { if (fields[key] && fields[key] !== 'null') { if (key === "text") { match["$or"] = [{ @@ -318,7 +318,7 @@ module.exports = function(Dataset) { // otherwise create intersection of userGroups and ownerGroup // this is needed here since no extra match step is done but all // filter conditions are applied in one match step - const intersect = fields['ownerGroup'].filter(function(n) { + const intersect = fields['ownerGroup'].filter(function (n) { return fields['userGroups'].indexOf(n) !== -1; }); match["ownerGroup"] = searchExpression('ownerGroup', intersect) @@ -374,7 +374,7 @@ module.exports = function(Dataset) { // input format: "creationTime:desc,creationLocation:asc" const sortExpr = {} const sortFields = limits.order.split(',') - sortFields.map(function(sortField) { + sortFields.map(function (sortField) { const parts = sortField.split(':') const dir = (parts[1] == 'desc') ? -1 : 1 sortExpr[parts[0]] = dir @@ -397,11 +397,11 @@ module.exports = function(Dataset) { } } // console.log("Resulting aggregate query:", JSON.stringify(pipeline, null, 4)); - Dataset.getDataSource().connector.connect(function(err, db) { + Dataset.getDataSource().connector.connect(function (err, db) { var collection = db.collection('Dataset'); var res = collection.aggregate(pipeline, - function(err, cursor) { - cursor.toArray(function(err, res) { + function (err, cursor) { + cursor.toArray(function (err, res) { if (err) { console.log("Facet err handling:", err); } @@ -418,9 +418,9 @@ module.exports = function(Dataset) { }); }; - Dataset.isValid = function(dataset, next) { + Dataset.isValid = function (dataset, next) { var ds = new Dataset(dataset); - ds.isValid(function(valid) { + ds.isValid(function (valid) { if (!valid) { next(null, { 'errors': ds.errors, @@ -434,19 +434,34 @@ module.exports = function(Dataset) { }); }; - Dataset.thumbnail = function( id, options, cb) { - // console.log("get thumbnail"); - const base64string= Dataset.findById(id, options, function (err, da) { - const attach = da.datasetattachments; - let base64string ="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; - if (attach === undefined) { + Dataset.thumbnail = function (id, callback) { + console.log("Entering thumbnail endpoint"); + var DatasetAttachment = app.models.DatasetAttachment; + let base64string = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; + const filter = { where: { datasetId: id } }; + DatasetAttachment.findOne(filter, function (err, instance) { + if (err) { + console.log("Error finding dataset attachment", err); + return callback(err) + }; + + let base64string2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; + if (instance && instance.__data) { + console.log("gm thumbnail found for", instance.__data.datasetId); + if (instance.__data.thumbnail === undefined) { + console.log("undefined gm, ", instance.__data.id); + } else { + console.log("thumbnail found for ", instance.__data.id); + base64string2 = instance.__data.thumbnail; + } } else { - base64string = attach[0].thumbnail; + console.log("no thumbnail found"); } - return base64string; - }); - cb(null, base64string); - return base64string; + + return base64string2; + }); + callback(null, base64string); + return base64string; } Dataset.remoteMethod("thumbnail", { @@ -457,8 +472,8 @@ module.exports = function(Dataset) { required: true } ], - http: {path: "/:id/thumbnail", verb: "get"}, - returns: {type: "string", root: true} + http: { path: "/:id/thumbnail", verb: "get" }, + returns: { type: "string", root: true } }); diff --git a/package-lock.json b/package-lock.json index 2254f54d..7ec169da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -200,8 +200,7 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accept-language": { "version": "3.0.18", @@ -292,6 +291,15 @@ "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -310,6 +318,16 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, "are-we-there-yet": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", @@ -328,6 +346,24 @@ "sprintf-js": "~1.0.2" } }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -343,6 +379,12 @@ "es6-symbol": "^3.0.2" } }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -359,6 +401,12 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", @@ -367,11 +415,23 @@ "lodash": "^4.17.10" } }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -404,6 +464,61 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", @@ -438,6 +553,12 @@ "chainsaw": "~0.1.0" } }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true + }, "bindings": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", @@ -513,6 +634,21 @@ } } }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -522,6 +658,35 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "bson": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", @@ -583,6 +748,23 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -598,6 +780,12 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, "camelize": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", @@ -608,6 +796,12 @@ "resolved": "https://registry.npmjs.org/canonical-json/-/canonical-json-0.0.4.tgz", "integrity": "sha1-ZXnAcsPbXEd+xB3JePvyuPQQdKM=" }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -768,17 +962,73 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "cldrjs": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.4.8.tgz", "integrity": "sha1-O5lMRk0qMrWsp8XeF6YKh+RdxPk=" }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -799,6 +1049,16 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -884,6 +1144,20 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -915,6 +1189,12 @@ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", @@ -934,6 +1214,15 @@ "vary": "^1" } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "cross-fetch": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-0.0.8.tgz", @@ -958,6 +1247,12 @@ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -987,6 +1282,12 @@ "ms": "2.0.0" } }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -1012,6 +1313,47 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1090,6 +1432,15 @@ "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, "dtrace-provider": { "version": "0.8.7", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz", @@ -1109,6 +1460,12 @@ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.0.4.tgz", "integrity": "sha1-r8t/H4uNdPggcmFx1dZKyeSo/yA=" }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -1418,6 +1775,41 @@ "strip-eof": "^1.0.0" } }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "expect-ct": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.1.tgz", @@ -1477,6 +1869,27 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "external-editor": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", @@ -1508,6 +1921,71 @@ "underscore": ">= 1.4 < 2" } }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1566,6 +2044,29 @@ "object-assign": "^4.0.1" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", @@ -1599,6 +2100,12 @@ "write": "^0.2.1" } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -1625,6 +2132,15 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "frameguard": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", @@ -1640,18 +2156,547 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "functional-red-black-tree": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", @@ -1689,6 +2734,12 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1710,6 +2761,36 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "globalize": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.3.0.tgz", @@ -1724,6 +2805,25 @@ "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", "dev": true }, + "got": { + "version": "6.7.1", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", @@ -1764,6 +2864,38 @@ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -1899,6 +3031,18 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -1924,6 +3068,12 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "inquirer": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", @@ -1966,29 +3116,199 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -1999,6 +3319,12 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2014,6 +3340,12 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "isomorphic-form-data": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-0.0.1.tgz", @@ -2152,6 +3484,21 @@ } } }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -2219,6 +3566,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", @@ -2628,6 +3981,12 @@ } } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", @@ -2652,6 +4011,30 @@ } } }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, "md5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", @@ -2691,6 +4074,27 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", @@ -2727,6 +4131,27 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -3007,6 +4432,25 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.0.0.tgz", "integrity": "sha512-SG2qscLE3iM4C0CNzGrsAojJHSVHMS1J8NnvJ31P1lH8P0hGHOiafmniNJz6w6q7vuoDlV7RdySlJgtqkFEVtQ==" }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3174,6 +4618,50 @@ "resolved": "https://registry.npmjs.org/nodemailer-stub-transport/-/nodemailer-stub-transport-1.1.0.tgz", "integrity": "sha1-EUIdLWa07m9AU1T5FMH0ZB6ySw0=" }, + "nodemon": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.8.tgz", + "integrity": "sha512-CgC/JdCf+CT7Z+K6wWaV30t8GU1DPtXpr/6PuXC1/LboXCmUQNKOaz0AEMjoWDTt2AdHOBFxgv41dyC0i79SbA==", + "dev": true, + "requires": { + "chokidar": "^2.0.4", + "debug": "^3.1.0", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.3", + "semver": "^5.5.0", + "supports-color": "^5.2.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -3183,6 +4671,15 @@ "abbrev": "1" } }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -3217,6 +4714,55 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -3325,11 +4871,29 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "passport": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", @@ -3383,6 +4947,12 @@ "array-index": "^1.0.0" } }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3420,6 +4990,12 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, "platform": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", @@ -3431,6 +5007,12 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "posix-getopt": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/posix-getopt/-/posix-getopt-1.2.0.tgz", @@ -3455,6 +5037,12 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -3480,6 +5068,12 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "pstree.remy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.4.tgz", + "integrity": "sha512-3kSyTN/iTJMxtL87idnFgTyOp2vQ6B/49QcHUO26kh2M2qahlUivFI1zWJ9FRFPoB+KgcP820JMOuIhkBJAP3Q==", + "dev": true + }, "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", @@ -3538,6 +5132,32 @@ "unpipe": "1.0.0" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -3552,6 +5172,17 @@ "util-deprecate": "~1.0.1" } }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, "referrer-policy": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", @@ -3562,12 +5193,59 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, "request": { "version": "2.87.0", "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", @@ -3639,6 +5317,12 @@ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -3649,6 +5333,12 @@ "signal-exit": "^3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "retry": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz", @@ -3707,6 +5397,15 @@ "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", "optional": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3731,6 +5430,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -3788,6 +5496,29 @@ "send": "0.16.2" } }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -3843,6 +5574,113 @@ "nodemailer-shared": "1.1.0" } }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "snappy": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/snappy/-/snappy-4.1.2.tgz", @@ -3862,6 +5700,31 @@ } } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -3871,6 +5734,15 @@ "memory-pager": "^1.0.2" } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3905,6 +5777,27 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -4216,6 +6109,15 @@ "inherits": "2" } }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4227,6 +6129,12 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -4236,6 +6144,48 @@ "os-tmpdir": "~1.0.2" } }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "to-utf8": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", @@ -4246,6 +6196,26 @@ "resolved": "https://registry.npmjs.org/toposort/-/toposort-0.2.12.tgz", "integrity": "sha1-x9KYTz1IwhcxXMMtdwiIt3lJHoE=" }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", @@ -4315,6 +6285,15 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "undefsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, "underscore": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", @@ -4339,11 +6318,125 @@ "util-deprecate": "^1.0.2" } }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -4361,6 +6454,12 @@ } } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -4370,6 +6469,21 @@ "querystring": "0.2.0" } }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "utf8-bytes": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/utf8-bytes/-/utf8-bytes-0.0.1.tgz", @@ -4532,6 +6646,15 @@ } } }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, "word-count": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/word-count/-/word-count-0.2.2.tgz", @@ -4557,11 +6680,28 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "x-xss-protection": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.1.0.tgz", "integrity": "sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg==" }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", diff --git a/package.json b/package.json index 9b703f08..09a5d43c 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "eslint": "^5.9.0", "eslint-config-loopback": "^12.0.0", "mocha": "^5.2.0", + "nodemon": "^1.18.8", "supertest": "^3.3.0" }, "repository": { From a1979525baad54eceef6b256ee5186eb0c026957 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 12 Dec 2018 11:24:59 +0100 Subject: [PATCH 136/147] change to async --- common/models/dataset.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 68818a8d..59a14557 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -434,7 +434,7 @@ module.exports = function (Dataset) { }); }; - Dataset.thumbnail = function (id, callback) { + Dataset.thumbnail = async function(id) { console.log("Entering thumbnail endpoint"); var DatasetAttachment = app.models.DatasetAttachment; let base64string = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; @@ -457,10 +457,8 @@ module.exports = function (Dataset) { } else { console.log("no thumbnail found"); } - return base64string2; }); - callback(null, base64string); return base64string; } From 1d15abae2358efa7b993e827c1a3e8ae5d4272f3 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 12 Dec 2018 11:49:55 +0100 Subject: [PATCH 137/147] change to promises --- common/models/dataset.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 59a14557..c7233ed5 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -437,13 +437,8 @@ module.exports = function (Dataset) { Dataset.thumbnail = async function(id) { console.log("Entering thumbnail endpoint"); var DatasetAttachment = app.models.DatasetAttachment; - let base64string = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; const filter = { where: { datasetId: id } }; - DatasetAttachment.findOne(filter, function (err, instance) { - if (err) { - console.log("Error finding dataset attachment", err); - return callback(err) - }; + return DatasetAttachment.findOne(filter).then( instance => { let base64string2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; if (instance && instance.__data) { @@ -459,7 +454,6 @@ module.exports = function (Dataset) { } return base64string2; }); - return base64string; } Dataset.remoteMethod("thumbnail", { From 1cabd52ace84039d35cd0414f049636773f9480f Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 12 Dec 2018 12:03:11 +0100 Subject: [PATCH 138/147] remove all dbug print statements --- common/models/dataset.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index c7233ed5..9445d9d2 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -434,23 +434,20 @@ module.exports = function (Dataset) { }); }; - Dataset.thumbnail = async function(id) { - console.log("Entering thumbnail endpoint"); + Dataset.thumbnail = async function (id) { var DatasetAttachment = app.models.DatasetAttachment; const filter = { where: { datasetId: id } }; - return DatasetAttachment.findOne(filter).then( instance => { + return DatasetAttachment.findOne(filter).then(instance => { - let base64string2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; + const base64string_example = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; + let base64string2 = "" if (instance && instance.__data) { - console.log("gm thumbnail found for", instance.__data.datasetId); if (instance.__data.thumbnail === undefined) { - console.log("undefined gm, ", instance.__data.id); } else { - console.log("thumbnail found for ", instance.__data.id); base64string2 = instance.__data.thumbnail; } } else { - console.log("no thumbnail found"); + base64string2 = base64string_example; } return base64string2; }); From 55c4d8a7533557d8fe165777feecebd1e0f00145 Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 12 Dec 2018 12:15:05 +0100 Subject: [PATCH 139/147] change default to scicat --- common/models/dataset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 9445d9d2..d04e65c5 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -439,7 +439,7 @@ module.exports = function (Dataset) { const filter = { where: { datasetId: id } }; return DatasetAttachment.findOne(filter).then(instance => { - const base64string_example = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFklEQVR42mP8v0DxPwMRgHFUIX0VAgD6BxuBmjKJqgAAAABJRU5ErkJggg=="; + const base64string_example = "data:image/png;base64,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"; let base64string2 = "" if (instance && instance.__data) { if (instance.__data.thumbnail === undefined) { From 2b8621df0b342dc68306f2a133739bfee2f5f88c Mon Sep 17 00:00:00 2001 From: Gareth Murphy Date: Wed, 12 Dec 2018 13:04:13 +0100 Subject: [PATCH 140/147] make smaller png --- common/models/dataset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index d04e65c5..09285b9c 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -439,7 +439,7 @@ module.exports = function (Dataset) { const filter = { where: { datasetId: id } }; return DatasetAttachment.findOne(filter).then(instance => { - const base64string_example = "data:image/png;base64,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"; + const base64string_example = "data:image/png;base64,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"; let base64string2 = "" if (instance && instance.__data) { if (instance.__data.thumbnail === undefined) { From 4ec62aeabe98ec8badb66c678f42f8f3ca57916a Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Tue, 18 Dec 2018 16:25:46 +0100 Subject: [PATCH 141/147] Issue #135 endpoint wrapping update for policy --- common/models/policy.js | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/common/models/policy.js b/common/models/policy.js index 6e6f46e6..96f33f18 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -25,7 +25,12 @@ module.exports = function(Policy) { userId: userId } }, function(err, instance) { - var email = instance.profile.email; + // need to handle functional user case + var email = ""; + if (!instance && Object.keys(ctx.options.authorizedRoles)[0]) { + return next(); + } + //console.log("email:", email); //console.log("manager: ", ctx.currentInstance.manager); if (!ctx.currentInstance.manager.includes(email)) { @@ -69,5 +74,30 @@ module.exports = function(Policy) { Policy.findOrCreate(filter, defaultPolicy); }; + Policy.updatewhere = async function(where, data) { + // where should look like {"or": [{"id":"5c0fe54ed8cc493d4b259989"},{"id": "5c110c90f1e2772bdb1dd868"}]} + return Policy.update(where, data); + } + + Policy.remoteMethod("updatewhere", { + accepts: [{ + arg: "where", + type: "object", + required: true + }, { + arg: "data", + type: "object", + required: true + }], + http: { + path: "/updatewhere", + verb: "post" + }, + returns: { + type: "string", + root: true + } + }); + Policy.validatesUniquenessOf('ownerGroup'); }; From a5a23958ebd0f097620d86851d8fc16618f146bd Mon Sep 17 00:00:00 2001 From: Luke Gorman Date: Wed, 19 Dec 2018 15:25:27 +0100 Subject: [PATCH 142/147] Issue #81 add sci meta to derived datasets model --- common/models/derived-dataset.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/models/derived-dataset.json b/common/models/derived-dataset.json index cf1c3c39..2cf9923a 100644 --- a/common/models/derived-dataset.json +++ b/common/models/derived-dataset.json @@ -38,6 +38,10 @@ "jobLogData": { "type": "string", "description": "The output job logfile. Keep the size of this log data well below 15 MB " + }, + "scientificMetadata": { + "type": "object", + "description": "JSON object containing the scientific meta data" } }, "validations": [], From c0e21a41931ffb46cdc087900229d54179d277d0 Mon Sep 17 00:00:00 2001 From: egli Date: Fri, 21 Dec 2018 11:55:28 +0100 Subject: [PATCH 143/147] Added default definition for datasetName --- common/models/dataset.js | 14 ++++++++++++++ common/models/dataset.json | 4 ++-- test/Dataset.js | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 09285b9c..05931e1a 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -44,6 +44,20 @@ module.exports = function (Dataset) { } ctx.instance.version = p.version; + // sourceFolder handling + if(ctx.instance.sourceFolder){ + // remove trailing slashes + ctx.instance.sourceFolder = ctx.instance.sourceFolder.replace(/\/$/, ""); + // autofill datasetName + if (!ctx.instance.datasetName){ + var arr=ctx.instance.sourceFolder.split("/") + if(arr.length == 1){ + ctx.instance.datasetName=arr[0] + } else { + ctx.instance.datasetName=arr[arr.length-2]+"/"+arr[arr.length-1] + } + } + } // auto fill classification if (!ctx.instance.ownerGroup) { diff --git a/common/models/dataset.json b/common/models/dataset.json index e5c3c776..fb4a11cd 100644 --- a/common/models/dataset.json +++ b/common/models/dataset.json @@ -41,7 +41,7 @@ "type": "string", "required": true, "index": true, - "description": "Absolute file path on file server containing the files of this dataset, optionally including protocol and file server hostname, e.g. nfs://fileserver1.example.com/some/path/to/sourcefolder. In case of a single file dataset, e.g. HDF5 data it contains the path up to, but excluding the filename." + "description": "Absolute file path on file server containing the files of this dataset, optionally including protocol and file server hostname, e.g. nfs://fileserver1.example.com/some/path/to/sourcefolder. In case of a single file dataset, e.g. HDF5 data, it contains the path up to, but excluding the filename. Trailing slashes are removed." }, "size": { "type": "number", @@ -80,7 +80,7 @@ }, "datasetName": { "type": "string", - "description": "A name for the dataset, given by the creator to carry some semantic meaning. Useful for display purposes e.g. instead of displaying the pid" + "description": "A name for the dataset, given by the creator to carry some semantic meaning. Useful for display purposes e.g. instead of displaying the pid. Will be autofilled if missing using info from sourceFolder" }, "userTargetLocation": { "type": "string", diff --git a/test/Dataset.js b/test/Dataset.js index be26927d..7c805aa2 100644 --- a/test/Dataset.js +++ b/test/Dataset.js @@ -62,6 +62,7 @@ describe('Simple Dataset tests', () => { res.body.should.have.property('version').and.be.string; res.body.should.have.property('type').and.equal('raw'); res.body.should.have.property('pid').and.be.string; + res.body.should.have.property('datasetName').and.be.string; pid = encodeURIComponent(res.body['pid']); done(); }); From 3be076e51e9772b7afc3c0101cdb7ea862285827 Mon Sep 17 00:00:00 2001 From: egli Date: Fri, 21 Dec 2018 16:29:57 +0100 Subject: [PATCH 144/147] Bugfix for test cases: wrong asynch handling for tests with 2 different users --- test/DatasetLifecycle.js | 17 ++++++------ test/MessageHistory.js | 58 ++++++++++++++++++++-------------------- test/ResetDataset.js | 17 ++++++------ 3 files changed, 47 insertions(+), 45 deletions(-) diff --git a/test/DatasetLifecycle.js b/test/DatasetLifecycle.js index 4c6d75b3..d4f6fed9 100644 --- a/test/DatasetLifecycle.js +++ b/test/DatasetLifecycle.js @@ -116,17 +116,18 @@ describe('Test DatasetLifecycle and the relation to Datasets', () => { }, (tokenVal) => { accessTokenIngestor = tokenVal; - }); - utils.getToken(app, { - 'username': 'archiveManager', - 'password': 'aman' - }, - (tokenVal) => { - accessTokenArchiveManager = tokenVal; - done(); + utils.getToken(app, { + 'username': 'archiveManager', + 'password': 'aman' + }, + (tokenVal) => { + accessTokenArchiveManager = tokenVal; + done(); + }); }); }); + it('adds a new raw dataset', function(done) { request(app) .post('/api/v2/RawDatasets?access_token=' + accessTokenIngestor) diff --git a/test/MessageHistory.js b/test/MessageHistory.js index c46ff68f..5299deb9 100644 --- a/test/MessageHistory.js +++ b/test/MessageHistory.js @@ -116,9 +116,9 @@ var testjob = { "type": "retrieve", "jobStatusMessage": "jobForwarded", "datasetList": [{ - "pid": "dummy", - "files": [] - }], + "pid": "dummy", + "files": [] + }], "archiveReturnMessage": "will move to messageList", "MessageHistory": [] } @@ -135,11 +135,11 @@ var newMessage = { } var app -before( function(){ +before(function() { app = require('../server/server') }); -describe('Test DatasetLifecycle and the relation to Datasets', () => { +describe('Test MessageHistory in jobs', () => { before((done) => { utils.getToken(app, { 'username': 'ingestor', @@ -147,14 +147,14 @@ describe('Test DatasetLifecycle and the relation to Datasets', () => { }, (tokenVal) => { accessTokenIngestor = tokenVal; - }); - utils.getToken(app, { - 'username': 'archiveManager', - 'password': 'aman' - }, - (tokenVal) => { - accessTokenArchiveManager = tokenVal; - done(); + utils.getToken(app, { + 'username': 'archiveManager', + 'password': 'aman' + }, + (tokenVal) => { + accessTokenArchiveManager = tokenVal; + done(); + }); }); }); @@ -172,10 +172,10 @@ describe('Test DatasetLifecycle and the relation to Datasets', () => { res.body.should.have.property('type').and.equal('raw'); res.body.should.have.property('pid').and.be.string; // store link to this dataset in datablocks - var pidtest=res.body['pid'] + var pidtest = res.body['pid'] testDatasetLifecycle.id = pidtest testDatasetLifecycle.datasetId = pidtest - testjob.datasetList[0].pid= pidtest + testjob.datasetList[0].pid = pidtest pid = encodeURIComponent(res.body['pid']); done(); }); @@ -237,7 +237,7 @@ describe('Test DatasetLifecycle and the relation to Datasets', () => { return done(err); res.body.should.have.property('type').and.be.string; idJob = res.body['id'] - console.log("Jobid:",idJob) + console.log("Jobid:", idJob) done(); }); }); @@ -252,24 +252,24 @@ describe('Test DatasetLifecycle and the relation to Datasets', () => { .end(function(err, res) { if (err) return done(err); - console.log(res.body) + console.log(res.body) done(); }); }); -it('should delete the Job', function(done) { - request(app) - .delete('/api/v2/Jobs/' + idJob+ '?access_token=' + accessTokenIngestor) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) - .end((err, res) => { - if (err) - return done(err); - done(); - }); -}); + it('should delete the Job', function(done) { + request(app) + .delete('/api/v2/Jobs/' + idJob + '?access_token=' + accessTokenIngestor) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); it('should delete the DatasetLifecycle', function(done) { request(app) diff --git a/test/ResetDataset.js b/test/ResetDataset.js index 9ca31db0..78e53313 100644 --- a/test/ResetDataset.js +++ b/test/ResetDataset.js @@ -173,17 +173,18 @@ describe('Create Dataset and its Datablocks DatasetLifecycle, then reset Datablo }, (tokenVal) => { accessTokenIngestor = tokenVal; - }); - utils.getToken(app, { - 'username': 'archiveManager', - 'password': 'aman' - }, - (tokenVal) => { - accessTokenArchiveManager = tokenVal; - done(); + utils.getToken(app, { + 'username': 'archiveManager', + 'password': 'aman' + }, + (tokenVal) => { + accessTokenArchiveManager = tokenVal; + done(); + }); }); }); + // first get existing datasets with the test archieId to allow to delete them From 576ca9254c98a3f5fd936cc514ce7a544145ce99 Mon Sep 17 00:00:00 2001 From: egli Date: Mon, 7 Jan 2019 13:55:52 +0100 Subject: [PATCH 145/147] New Jobs return error message when something wrong with archivable/retrievable bits --- common/models/dataset.js | 80 +++++----- common/models/job.js | 310 ++++++++++++++++++++++++--------------- common/models/policy.js | 9 +- common/models/utils.js | 105 ++----------- test/MessageHistory.js | 52 +++++-- 5 files changed, 296 insertions(+), 260 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 05931e1a..4efeecbe 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -45,38 +45,34 @@ module.exports = function (Dataset) { ctx.instance.version = p.version; // sourceFolder handling - if(ctx.instance.sourceFolder){ + if (ctx.instance.sourceFolder) { // remove trailing slashes ctx.instance.sourceFolder = ctx.instance.sourceFolder.replace(/\/$/, ""); // autofill datasetName - if (!ctx.instance.datasetName){ - var arr=ctx.instance.sourceFolder.split("/") - if(arr.length == 1){ - ctx.instance.datasetName=arr[0] + if (!ctx.instance.datasetName) { + var arr = ctx.instance.sourceFolder.split("/") + if (arr.length == 1) { + ctx.instance.datasetName = arr[0] } else { - ctx.instance.datasetName=arr[arr.length-2]+"/"+arr[arr.length-1] + ctx.instance.datasetName = arr[arr.length - 2] + "/" + arr[arr.length - 1] } } } - - // auto fill classification if (!ctx.instance.ownerGroup) { - return next("No owner group defined"); + next("No owner group defined"); } + + // auto fill classification and add policy if missing + var Policy = app.models.Policy; - if (!ctx.instance.classification) { - // classification undefined - Policy.findOne({ - where: { - ownerGroup: ctx.instance.ownerGroup - } - }, - function (err, policyInstance) { - if (err) { - var msg = "Error when looking for Policy of pgroup " + ctx.instance.ownerGroup + " " + err; - console.log(msg); - return next(msg); - } else if (policyInstance) { + Policy.findOne(function (err, policyInstance) { + if (err) { + var msg = "Error when looking for Policy of pgroup " + ctx.instance.ownerGroup + " " + err; + console.log(msg); + next(msg); + } else if (policyInstance) { + if (!ctx.instance.classification) { + // Case 1: classification undefined but policy defined:, define classification via policy var classification = ""; switch (policyInstance.tapeRedundancy) { case "low": @@ -92,27 +88,33 @@ module.exports = function (Dataset) { classification = "IN=medium,AV=low,CO=low"; } ctx.instance.classification = classification; - } else { - // neither a policy or a classification exist + } + // case 2: classification defined and policy defined: do nothing + return next() + } else { + let tapeRedundancy = "low" + if (!ctx.instance.classification) { + // case 3: neither a policy nor a classification exist: define default classification and create default policy ctx.instance.classification = "IN=medium,AV=low,CO=low"; - Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail, ""); + } else { + // case 4: classification exists but no policy: create policy from classification + var classification = ctx.instance.classification; + if (classification.includes("AV=low")) { + tapeRedundancy = "low"; + } else if (classification.includes("AV=medium")) { + tapeRedundancy = "medium"; + } else if (classification.includes("AV=high")) { + tapeRedundancy = "high"; + } } - }); - } else { - // create policy from classification - var classification = ctx.instance.classification; - var tapeRedundancy = ""; - if (classification.includes("AV=low")) { - tapeRedundancy = "low"; - } else if (classification.includes("AV=medium")) { - tapeRedundancy = "medium"; - } else if (classification.includes("AV=high")) { - tapeRedundancy = "high"; + Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail, tapeRedundancy, next); + } } - Policy.addDefault(ctx.instance.ownerGroup, ctx.instance.ownerEmail, tapeRedundancy); - } + ); + } else { + // no instance, continue + return next() } - return next(); }); // clean up data connected to a dataset, e.g. if archiving failed diff --git a/common/models/job.js b/common/models/job.js index f38dd5d9..9f283a12 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -6,6 +6,171 @@ var nodemailer = require('nodemailer'); var config = require('../../server/config.local'); var app = require('../../server/server'); + +function sendMail(to, subjectText, mailText, next) { + if ('smtpSettings' in config && 'smtpMessage' in config) { + let transporter = nodemailer.createTransport(config.smtpSettings); + transporter.verify(function (error, success) { + if (error) { + console.log(error); + next(); + } else { + console.log('Server is ready to send message to ', to); + var message = Object.assign({}, config.smtpMessage); + message['to'] = to; + message['subject'] += subjectText + message['text'] = mailText + transporter.sendMail(message, function (err, info) { + if (err) { + console.log(err); + } else { + console.log('Email sent'); + } + next(); + }); + } + }); + } else { + next() + } +} + +function publishJob(job, ctx, next) { + if ('queue' in config && config.queue === 'rabbitmq') { + job.publishJob(ctx.instance, "jobqueue") + console.log('Saved Job %s#%s and published to message broker', ctx.Model.modelName, ctx.instance.id); + } + + let subjectText = ' ' + ctx.instance.type + ' job submitted successfully'; + let mailText = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n' + JSON.stringify(ctx.instance, null, 4); + let to = ctx.instance.emailJobInitiator + sendMail(to, subjectText, mailText, next) +} + +function MarkDatasetsAsScheduled(job, ctx, idList, next) { + //console.log('Searching for datasetlifecycle with ids:', idList) + let DatasetLifecycle = app.models.DatasetLifecycle; + DatasetLifecycle.updateAll( + { + datasetId: { + inq: idList + } + }, + { + archivable: false, + retrievable: false, + archiveStatusMessage: "scheduledForArchiving" + } + , ctx.options, function (err, p) { + // console.log("============= DatasetLifecycle Result:", JSON.stringify(p)) + if (err) { + var e = new Error(); + e.statusCode = 400; + e.message = 'Can not find all needed DatasetLifecycle entries - no archive job sent:\n' + JSON.stringify(err) + next(e); + } else { + publishJob(job, ctx, next) + } + }); +} +// for archive jobs all datasets must be in state archivable +function TestArchiveJobs(job, ctx, idList, next) { + let Dataset = app.models.Dataset; + Dataset.find({ + where: { + archivable: false, + pid: { + inq: idList + } + } + }, ctx.options, function (err, p) { + //console.log("============= Archive Result:", JSON.stringify(p)) + if (p.length > 0) { + var e = new Error(); + e.statusCode = 400; + e.message = 'The following datasets are not in archivable state - no archive job sent:\n' + JSON.stringify(p) + next(e); + } else { + // mark all Datasets as in state scheduledForArchiving, archivable=false + MarkDatasetsAsScheduled(job, ctx, idList, next) + } + }); + +} + +// for retrieve jobs all datasets must be in state retrievable +// ownerGroup is tested implicitly via Ownable + +function TestRetrieveJobs(job, ctx, idList, next) { + let Dataset = app.models.Dataset; + Dataset.find({ + where: { + retrievable: true, + pid: { + inq: idList + } + } + }, ctx.options, function (err, p) { + // console.log("============= Retrieve Result:",JSON.stringify(p)) + if (err) { + return next(err) + } else if (p.length != idList.length) { + Dataset.find({ + where: { + retrievable: false, + pid: { + inq: idList + } + } + }, ctx.options, function (err2, pmiss) { + if (err2) { + return next(err2) + } else { + var e = new Error(); + e.statusCode = 400; + e.message = 'The following datasets are not in retrievable state - no retrieve job sent:\n' + JSON.stringify(pmiss) + return next(e); + } + }) + } else { + publishJob(job, ctx, next); + } + }); +} + +function TestAllDatasets(job, ctx, idList, next) { + //console.log(" ====== find datasets with id", idList) + let Dataset = app.models.Dataset; + Dataset.find({ + where: { + pid: { + inq: idList + } + } + }, ctx.options, function (err, p) { + let to = ctx.instance.emailJobInitiator + if (err || (p.length != idList.length)) { + var e = new Error(); + e.statusCode = 400; + e.message = 'At least one of the datasets could not be found - no Job sent'; + // TODO should I send an email here ? Only if triggered by autoarchive option ? + // subjectText = + // mailText= + // sendMail(to, subjectText, mailText, next) + return next(e) + } else { + //test if all datasets are in archivable state + if (ctx.instance.type == "archive") { + TestArchiveJobs(job, ctx, idList, next) + } else if (ctx.instance.type == "retrieve") { + TestRetrieveJobs(job, ctx, idList, next) + } else { + publishJob(job, ctx, next) + } + } + }); +} + module.exports = function (Job) { // Attach job submission to Kafka @@ -16,134 +181,49 @@ module.exports = function (Job) { var dataSource = new DataSource('kafka', options); Job.attachTo(dataSource); } + Job.observe('before save', (ctx, next) => { - // replace email with that from userIdentity - var UserIdentity = app.models.UserIdentity; - var userId = ctx.options.accessToken.userId; - //PersistedModel Static Method call - UserIdentity.findOne({ - //json filter - where: { - userId: userId - } - }, function(err, instance) { - if(!!instance) - { - ctx.instance.emailJobInitiator = instance.profile.email; - } - }); if (ctx.instance) { - // auto fill dateOfLastMessage - var now = new Date(); - if (!ctx.instance.dateOfLastMessage) { - ctx.instance.dateOfLastMessage = now.toISOString(); - } - // make some consistency checks: - // - ensure that all wanted datasets exist already - // - TODO: for archive jobs all datasetslifecycle should be in an "archiveable" state - // TODO ensure that job is created by user who has read access to all datasets in case of retrieve JOBS - var Dataset = app.models.Dataset; - // create array of all pids - // console.log("Verifying datasets:",ctx.options) - const idList=ctx.instance.datasetList.map(x => x.pid) - Dataset.find({where: {pid: {inq: idList}}}, ctx.options, function (err, p){ - //console.log("JOBS:lengths",err,p.length,idList.length,p) - if (err || (p.length != idList.length)){ - var e = new Error(); - e.statusCode = 400; - e.message = 'At least one of the datasets could not be found'; - next(e); - } else { - next(); - } - }); - //test for datasets already archived - /*var Lifecycle = app.models.DatasetLifecycle; - Lifecycle.find({ + + // replace email with that from userIdentity + var UserIdentity = app.models.UserIdentity; + var userId = ctx.options.accessToken.userId; + //PersistedModel Static Method call + UserIdentity.findOne({ + //json filter where: { - archivable: false, - datasetId: { - inq: idList - } + userId: userId } - }, ctx.options, function(err, p) { - console.log("LifeCycle: ", p, idList); - if (p.length > 0) { - var e = new Error(); - e.statusCode = 400; - e.message = 'At least one of the datasets is already archived'; - next(e); + }, function (err, u) { + if (!!u) { + ctx.instance.emailJobInitiator = u.profile.email; } - else { - next(); + // auto fill dateOfLastMessage + var now = new Date(); + if (!ctx.instance.dateOfLastMessage) { + ctx.instance.dateOfLastMessage = now.toISOString(); } - });*/ + next() + }) } else { - next(); + next() } }); Job.observe('after save', (ctx, next) => { if (ctx.instance && ctx.isNewInstance) { - - if ('queue' in config && config.queue === 'rabbitmq') { - Job.publishJob(ctx.instance, "jobqueue") - console.log('Saved Job %s#%s and published to message broker', ctx.Model.modelName, ctx.instance.id); - } - if ('smtpSettings' in config && 'smtpMessage' in config) { - let transporter = nodemailer.createTransport(config.smtpSettings); - transporter.verify(function (error, success) { - if (error) { - console.log(error); - next(); - } else { - console.log('Server is ready to take our messages'); - var message = Object.assign({}, config.smtpMessage); - message['to'] = ctx.instance.emailJobInitiator; - message['subject'] += ' ' + ctx.instance.type + ' job submitted successfully'; - let text = 'Hello, \n\n You created a job to ' + ctx.instance.type + ' datasets. Your job was received and will be completed as soon as possible. \n\n Many Thanks.\n\n'+JSON.stringify(ctx.instance, null, 4); - message['text'] = text; - transporter.sendMail(message, function (err, info) { - if (err) { - console.log(err); - } else { - console.log('Email sent'); - } - next(); - }); - } - }); - } else { - next() - } + // first create array of all pids + const idList = ctx.instance.datasetList.map(x => x.pid) + // this is a new job, make some consistency checks concerning the datasets + TestAllDatasets(Job, ctx, idList, next) } else { - if ('smtpSettings' in config && 'smtpMessage' in config) { - if (ctx.instance.jobStatusMessage.startsWith("finish")) { - let transporter = nodemailer.createTransport(config.smtpSettings); - transporter.verify(function(error, success) { - if (error) { - console.log(error); - next(); - } else { - console.log('Server is ready to send message to ', ctx.instance.emailJobInitiator); - var message = Object.assign({}, config.smtpMessage); - message['to'] = ctx.instance.emailJobInitiator; - message['subject'] += ' '+ctx.instance.type + ' job from ' + ctx.instance.creationTime.toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' (UTC) finished with status ' + ctx.instance.jobStatusMessage; - let text = 'Hello, \n\n Your Job from ' + ctx.instance.creationTime + ' is now finished. \n\n The resulting job description is.\n\n' + JSON.stringify(ctx.instance, null, 4); - message['text'] = text; - transporter.sendMail(message, function(err, info) { - if (err) { - console.log(err); - } else { - console.log('Email sent'); - } - next(); - }); - } - }); - } else { - next() - } + // An existing job got some updates - check if you want to send an email + if (ctx.instance.jobStatusMessage.startsWith("finish")) { + // TODO add infos about which Datasets failed if this info is not yet in historyMessages of the Job + let subjectText = ' ' + ctx.instance.type + ' job from ' + ctx.instance.creationTime.toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' (UTC) finished with status ' + ctx.instance.jobStatusMessage; + let mailText = 'Hello, \n\n Your Job from ' + ctx.instance.creationTime + ' is now finished. \n\n The resulting job description is.\n\n' + JSON.stringify(ctx.instance, null, 4); + let to = ctx.instance.emailJobInitiator + sendMail(to, subjectText, mailText, next) } else { next() } diff --git a/common/models/policy.js b/common/models/policy.js index 96f33f18..24a251b7 100644 --- a/common/models/policy.js +++ b/common/models/policy.js @@ -46,8 +46,8 @@ module.exports = function(Policy) { } }); - Policy.addDefault = function(ownerGroup, ownerEmail, tapeRedundancy) { - // TODO: move the deault definition somewhere more sensible + Policy.addDefault = function(ownerGroup, ownerEmail, tapeRedundancy, next) { + // TODO: move the default definition somewhere more sensible var defaultPolicy = Object(); defaultPolicy.ownerGroup = ownerGroup; if (config && !ownerEmail) { @@ -69,11 +69,10 @@ module.exports = function(Policy) { defaultPolicy.archiveEmailsToBeNotified = defaultPolicy.manager; defaultPolicy.retrieveEmailsToBeNotified = defaultPolicy.manager; defaultPolicy.embargoPeriod = 3; - //filter must be an object - var filter = JSON.parse('{"where": {"ownerGroup":"' + ownerGroup + '"}}'); - Policy.findOrCreate(filter, defaultPolicy); + Policy.findOrCreate(defaultPolicy, next); }; + // TODO: understand the following method Policy.updatewhere = async function(where, data) { // where should look like {"or": [{"id":"5c0fe54ed8cc493d4b259989"},{"id": "5c110c90f1e2772bdb1dd868"}]} return Policy.update(where, data); diff --git a/common/models/utils.js b/common/models/utils.js index fd1d3781..8ae4595f 100644 --- a/common/models/utils.js +++ b/common/models/utils.js @@ -12,7 +12,7 @@ var exports = module.exports = {}; // Note: Depending on the request PUT/POST etc either ctx.instance or ctx.currentInstance is set -exports.transferSizeToDataset = function(obj, sizeField, ctx, next) { +exports.transferSizeToDataset = function (obj, sizeField, ctx, next) { var instance = ctx.instance if (!instance) { instance = ctx.currentInstance @@ -31,7 +31,7 @@ exports.transferSizeToDataset = function(obj, sizeField, ctx, next) { } } obj.find(filter, ctx.options).then(instances => { - var total = instances.reduce(function(sum, value) { + var total = instances.reduce(function (sum, value) { return sum + value[sizeField] }, 0); @@ -40,9 +40,9 @@ exports.transferSizeToDataset = function(obj, sizeField, ctx, next) { if (instance) { // important to pass options here, otherwise context gets lost instance.updateAttributes({ - [sizeField]: total - }, ctx.options, - function(err, instance) { + [sizeField]: total + }, ctx.options, + function (err, instance) { if (err) { var error = new Error(); error.statusCode = 403; @@ -73,7 +73,7 @@ exports.transferSizeToDataset = function(obj, sizeField, ctx, next) { } // add ownerGroup field from linked Datasets -exports.addOwnerGroup = function(ctx, next) { +exports.addOwnerGroup = function (ctx, next) { var instance = ctx.instance if (!instance) { instance = ctx.currentInstance @@ -114,8 +114,8 @@ exports.addOwnerGroup = function(ctx, next) { // transform date strings in all fields with key dateKeys to updateTimesToUTC // do nothing if input values are already UTC -exports.updateTimesToUTC = function(dateKeys, instance) { - dateKeys.map(function(dateKey) { +exports.updateTimesToUTC = function (dateKeys, instance) { + dateKeys.map(function (dateKey) { if (instance[dateKey]) { // console.log("Updating old ", dateKey, instance[dateKey]) instance[dateKey] = moment.tz(instance[dateKey], moment.tz.guess()).format(); @@ -124,7 +124,7 @@ exports.updateTimesToUTC = function(dateKeys, instance) { }); } -exports.createNewFacetPipeline = function(name, type, query) { +exports.createNewFacetPipeline = function (name, type, query) { const pipeline = []; if (type.constructor === Array) { @@ -175,10 +175,10 @@ exports.createNewFacetPipeline = function(name, type, query) { // dito but for array of instances -exports.updateAllTimesToUTC = function(dateKeys, instances) { - dateKeys.map(function(dateKey) { +exports.updateAllTimesToUTC = function (dateKeys, instances) { + dateKeys.map(function (dateKey) { // console.log("Updating all time field %s to UTC for %s instances:", dateKey, instances.length) - instances.map(function(instance) { + instances.map(function (instance) { if (instance[dateKey]) { // console.log("Updating old ",dateKey,instance[dateKey]) instance[dateKey] = moment.tz(instance[dateKey], moment.tz.guess()).format() @@ -188,7 +188,7 @@ exports.updateAllTimesToUTC = function(dateKeys, instances) { }); } -exports.handleOwnerGroups = function(ctx, next) { +exports.handleOwnerGroups = function (ctx, next) { if (!ctx.args.fields) ctx.args.fields = {}; let userId = ctx.req.accessToken && ctx.req.accessToken.userId; @@ -203,7 +203,7 @@ exports.handleOwnerGroups = function(ctx, next) { next(e); } - User.findById(userId, function(err, user) { + User.findById(userId, function (err, user) { if (err) { next(err); } else if (user['username'].indexOf('.') === -1) { @@ -215,7 +215,7 @@ exports.handleOwnerGroups = function(ctx, next) { where: { userId: userId } - }, function(err, instance) { + }, function (err, instance) { console.log("UserIdentity Instance:", instance) if (instance && instance.profile) { var foundGroups = instance.profile.accessGroups; @@ -238,78 +238,3 @@ exports.handleOwnerGroups = function(ctx, next) { } }); } - - -exports.createArchiveJob = function(UserIdentity, Policy, Job, ctx) { - var instance = ctx.instance - if (!instance) { - instance = ctx.currentInstance - } - console.log("Instance:", JSON.stringify(instance)) - - const token = ctx.options && ctx.options.accessToken; - const userId = token && token.userId; - - console.log("options, userid:", ctx.options, userId) - //const user = userId ? 'user#' + userId : ''; - UserIdentity.findOne({ - where: { - userId: userId - } - }, function(err, user) { - console.log("UserIdentity Instance:", user) - // TODO: get it from User models - // TODO get proper emails in case of unctional accounts - // TODO remove console.log messages - // TODO add test cases - // TODO add creationTime (should not be needed any more) - var email - var login - if (user && user.profile) { - login = user.profile.login - email = user.profile.email - } else { - login = Object.keys(ctx.options.authorizedRoles)[0] - email = login - } - console.log("Email:", email) // check if a normal user or an internal ROLE - Policy.findOne({ - where: { - ownerGroup: instance.ownerGroup - } - }, function(err2, policyInstance) { - // get policy values for the instance.ownerGroups - if (err2) { - console.log("Error when looking for Policy of pgroup ", instance.ownerGroup, err2) - } else { - var jobParams = {} - jobParams.username = login - if (policyInstance) { - jobParams.autoArchive = (autoArchive in policyInstance) ? policyInstance.autoArchive : false - jobParams.tapeCopies = (tapeCopies in policyInstance) ? policyInstance.tapeCopies : "one" - } else { - console.log("No policy settings found for ownerGroup", instance.ownerGroup) - console.log("Assuming default values") - jobParams.autoArchive = false - jobParams.tapeCopies = "one" - } - var body = { - emailJobInitiator: email, - type: "archive", - jobParams: jobParams, - datasetList: [{ - pid: instance.datasetId, - files: [] - }] - } - console.log("Job body:", body) - if (jobParams.autoArchive) { - Job.create(body, function(err, jobmodel) { - console.log("Created Job:", err, jobmodel) - }) - } - } - - }) - }) -}; diff --git a/test/MessageHistory.js b/test/MessageHistory.js index 5299deb9..3d90e0c3 100644 --- a/test/MessageHistory.js +++ b/test/MessageHistory.js @@ -101,19 +101,21 @@ var testDatasetLifecycle = { "retrieveStatusMessage": "", "isExported": false, "archivable": true, - "retrievable": false, + "retrievable": true, "MessageHistory": [{ "shortMessage": "datasetCreated", - "sender": "stephan.egli@psi.ch", + "sender": "scicatarchivemanager@psi.ch", "payload": { "text": "Nothing special to report" } }] } -var testjob = { +//TODO test to retrieve datasets where you are NOT the owner + +var testArchiveJob = { "emailJobInitiator": "scicatarchivemanger@psi.ch", - "type": "retrieve", + "type": "archive", "jobStatusMessage": "jobForwarded", "datasetList": [{ "pid": "dummy", @@ -124,11 +126,21 @@ var testjob = { } +var testRetrieveJob = { + "emailJobInitiator": "scicatarchivemanger@psi.ch", + "type": "retrieve", + "jobStatusMessage": "jobForwarded", + "datasetList": [{ + "pid": "dummy", + "files": [] + }], + "archiveReturnMessage": "will move to messageList", + "MessageHistory": [] +} -// TODO do I need to pass id explicitly ? var newMessage = { "shortMessage": "JustAnExample", - "sender": "stephan.egli@psi.ch", + "sender": "ingestor", "payload": { "text": "whatever" } @@ -175,7 +187,8 @@ describe('Test MessageHistory in jobs', () => { var pidtest = res.body['pid'] testDatasetLifecycle.id = pidtest testDatasetLifecycle.datasetId = pidtest - testjob.datasetList[0].pid = pidtest + testArchiveJob.datasetList[0].pid = pidtest + testRetrieveJob.datasetList[0].pid = pidtest pid = encodeURIComponent(res.body['pid']); done(); }); @@ -225,10 +238,27 @@ describe('Test MessageHistory in jobs', () => { }); - it('Adds a new job request', function(done) { + it('Adds a new archive job request', function(done) { + request(app) + .post('/api/v2/Jobs?access_token=' + accessTokenIngestor) + .send(testArchiveJob) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function(err, res) { + if (err) + return done(err); + res.body.should.have.property('type').and.be.string; + idJob = res.body['id'] + //console.log("Jobid:", idJob) + done(); + }); + }); + + it('Adds a new retrieve job request', function(done) { request(app) .post('/api/v2/Jobs?access_token=' + accessTokenIngestor) - .send(testjob) + .send(testRetrieveJob) .set('Accept', 'application/json') .expect(200) .expect('Content-Type', /json/) @@ -237,7 +267,7 @@ describe('Test MessageHistory in jobs', () => { return done(err); res.body.should.have.property('type').and.be.string; idJob = res.body['id'] - console.log("Jobid:", idJob) + //console.log("Jobid:", idJob) done(); }); }); @@ -252,7 +282,7 @@ describe('Test MessageHistory in jobs', () => { .end(function(err, res) { if (err) return done(err); - console.log(res.body) + //console.log(res.body) done(); }); }); From 4caf8a554a5b67f7631c3f7c2f34a791dc9abae1 Mon Sep 17 00:00:00 2001 From: egli Date: Tue, 8 Jan 2019 14:44:18 +0100 Subject: [PATCH 146/147] Now the flags are explicitly transferred to dataset directly --- common/models/dataset-lifecycle.js | 3 ++- common/models/job.js | 39 ++++++++++++++++++++++-------- test/MessageHistory.js | 25 +++++++++++++------ test/config/tests.json | 2 +- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/common/models/dataset-lifecycle.js b/common/models/dataset-lifecycle.js index c6fc1da4..f7706586 100644 --- a/common/models/dataset-lifecycle.js +++ b/common/models/dataset-lifecycle.js @@ -48,7 +48,8 @@ module.exports = function(Datasetlifecycle) { utils.addOwnerGroup(ctx, next) }) - // transfer status flags to linked dataset + // transfer status flags to linked dataset. + // Warning: when using the updateAll API endpoint the context is missing ! Datasetlifecycle.observe('after save', (ctx, next) => { var Dataset = app.models.Dataset var instance = ctx.instance diff --git a/common/models/job.js b/common/models/job.js index 9f283a12..76d1ec21 100644 --- a/common/models/job.js +++ b/common/models/job.js @@ -48,7 +48,7 @@ function publishJob(job, ctx, next) { } function MarkDatasetsAsScheduled(job, ctx, idList, next) { - //console.log('Searching for datasetlifecycle with ids:', idList) + let DatasetLifecycle = app.models.DatasetLifecycle; DatasetLifecycle.updateAll( { @@ -62,14 +62,35 @@ function MarkDatasetsAsScheduled(job, ctx, idList, next) { archiveStatusMessage: "scheduledForArchiving" } , ctx.options, function (err, p) { - // console.log("============= DatasetLifecycle Result:", JSON.stringify(p)) if (err) { var e = new Error(); - e.statusCode = 400; + e.statusCode = 404; e.message = 'Can not find all needed DatasetLifecycle entries - no archive job sent:\n' + JSON.stringify(err) next(e); } else { - publishJob(job, ctx, next) + // since updateAll does not send context and therefore the DatasetLifecycle updates are not copied over + // to Dataset one has to do the update here on Dataset in addition + let Dataset = app.models.Dataset; + Dataset.updateAll( + { + pid: { + inq: idList + } + }, + { + archivable: false, + retrievable: false + } + , ctx.options, function (err, p) { + if (err) { + var e = new Error(); + e.statusCode = 404; + e.message = 'Can not find all needed Dataset entries - no archive job sent:\n' + JSON.stringify(err) + next(e); + } else { + publishJob(job, ctx, next) + } + }); } }); } @@ -84,14 +105,14 @@ function TestArchiveJobs(job, ctx, idList, next) { } } }, ctx.options, function (err, p) { - //console.log("============= Archive Result:", JSON.stringify(p)) if (p.length > 0) { var e = new Error(); - e.statusCode = 400; + e.statusCode = 409; e.message = 'The following datasets are not in archivable state - no archive job sent:\n' + JSON.stringify(p) next(e); } else { // mark all Datasets as in state scheduledForArchiving, archivable=false + // console.log("mark datasets as to be archived: ctx.options,idlist",ctx.options,idList) MarkDatasetsAsScheduled(job, ctx, idList, next) } }); @@ -127,7 +148,7 @@ function TestRetrieveJobs(job, ctx, idList, next) { return next(err2) } else { var e = new Error(); - e.statusCode = 400; + e.statusCode = 409; e.message = 'The following datasets are not in retrievable state - no retrieve job sent:\n' + JSON.stringify(pmiss) return next(e); } @@ -139,7 +160,6 @@ function TestRetrieveJobs(job, ctx, idList, next) { } function TestAllDatasets(job, ctx, idList, next) { - //console.log(" ====== find datasets with id", idList) let Dataset = app.models.Dataset; Dataset.find({ where: { @@ -151,7 +171,7 @@ function TestAllDatasets(job, ctx, idList, next) { let to = ctx.instance.emailJobInitiator if (err || (p.length != idList.length)) { var e = new Error(); - e.statusCode = 400; + e.statusCode = 404; e.message = 'At least one of the datasets could not be found - no Job sent'; // TODO should I send an email here ? Only if triggered by autoarchive option ? // subjectText = @@ -184,7 +204,6 @@ module.exports = function (Job) { Job.observe('before save', (ctx, next) => { if (ctx.instance) { - // replace email with that from userIdentity var UserIdentity = app.models.UserIdentity; var userId = ctx.options.accessToken.userId; diff --git a/test/MessageHistory.js b/test/MessageHistory.js index 3d90e0c3..cff12d6d 100644 --- a/test/MessageHistory.js +++ b/test/MessageHistory.js @@ -255,19 +255,28 @@ describe('Test MessageHistory in jobs', () => { }); }); - it('Adds a new retrieve job request', function(done) { + it('Adds a new archive job request for same data which should fail', function(done) { + request(app) + .post('/api/v2/Jobs?access_token=' + accessTokenIngestor) + .send(testArchiveJob) + .set('Accept', 'application/json') + .expect(409) + .expect('Content-Type', /json/) + .end((err, res) => { + res.body.should.have.property('error'); + done(); + }); + }); + + it('Adds a new retrieve job request on same dataset, which should fail as well because not yet retrievable', function(done) { request(app) .post('/api/v2/Jobs?access_token=' + accessTokenIngestor) .send(testRetrieveJob) .set('Accept', 'application/json') - .expect(200) + .expect(409) .expect('Content-Type', /json/) - .end(function(err, res) { - if (err) - return done(err); - res.body.should.have.property('type').and.be.string; - idJob = res.body['id'] - //console.log("Jobid:", idJob) + .end((err, res) => { + res.body.should.have.property('error'); done(); }); }); diff --git a/test/config/tests.json b/test/config/tests.json index 64a3e316..518cf66a 100644 --- a/test/config/tests.json +++ b/test/config/tests.json @@ -89,7 +89,7 @@ { "method": "POST", "route": "Jobs", - "expect": 400, + "expect": 404, "authenticate": "admin", "body": { "emailJobInitiator": "scicatingestor@psi.ch", From 4b5ab89366e8075b860f4212d859d4a54379f8b0 Mon Sep 17 00:00:00 2001 From: egli Date: Tue, 8 Jan 2019 16:06:32 +0100 Subject: [PATCH 147/147] If no proposal is linked to rawdataset try to fill one by common ownership --- common/models/dataset.js | 4 +- common/models/raw-dataset.js | 17 +++++++- test/RawDataset.js | 76 ++++++++++++++++++++++++++++++------ 3 files changed, 81 insertions(+), 16 deletions(-) diff --git a/common/models/dataset.js b/common/models/dataset.js index 4efeecbe..b61d9152 100644 --- a/common/models/dataset.js +++ b/common/models/dataset.js @@ -38,9 +38,9 @@ module.exports = function (Dataset) { if (ctx.instance) { if (ctx.isNewInstance) { ctx.instance.pid = config.pidPrefix + '/' + ctx.instance.pid; - console.log(' new pid:', ctx.instance.pid); + console.log('New pid:', ctx.instance.pid); } else { - console.log(' unmodified pid:', ctx.instance.pid); + console.log('Unmodified pid:', ctx.instance.pid); } ctx.instance.version = p.version; diff --git a/common/models/raw-dataset.js b/common/models/raw-dataset.js index 9a94a596..aaf06e0f 100644 --- a/common/models/raw-dataset.js +++ b/common/models/raw-dataset.js @@ -2,6 +2,8 @@ var utils = require('./utils'); module.exports = function(Rawdataset) { + var app = require('../../server/server'); + Rawdataset.validatesUniquenessOf('pid'); // filter on dataset type (raw, derived etc) @@ -25,7 +27,20 @@ module.exports = function(Rawdataset) { if (ctx.instance) { ctx.instance.type = 'raw'; } - next(); + // check if proposal is linked, if not try to add one + if(!ctx.instance.proposalId){ + var Proposal = app.models.Proposal + const filter = { where: { ownerGroup: ctx.instance.ownerGroup } }; + Proposal.findOne(filter,ctx.options).then(instance => { + if(instance){ + console.log("Appended Proposal "+instance.proposalId+" to rawdataset "+ctx.instance.pid) + ctx.instance.proposalId=instance.proposalId + } + return next() + }) + } else { + return next() + } }); // put diff --git a/test/RawDataset.js b/test/RawDataset.js index 4fd7e67f..025a9654 100644 --- a/test/RawDataset.js +++ b/test/RawDataset.js @@ -10,8 +10,17 @@ var request = require('supertest'); var should = chai.should(); var utils = require('./LoginUtils'); -var accessToken = null, - pid = null; +var accessToken = null; +var pid = null; +var accessProposalToken = null; + +var testproposal = { + "proposalId": "someprefix/20170266", + "email": "proposer%40uni.edu", + "title": "A test proposal", + "abstract": "Abstract of test proposal", + "ownerGroup": "p10029" +} var testraw = { "principalInvestigator": "bertram.astor@grumble.com", @@ -80,12 +89,13 @@ var testraw = { "doi": "not yet defined", "isPublished": false, "ownerGroup": "p10029", - "accessGroups": [], - "proposalId": "10.540.16635/20110123" + "accessGroups": [] } var app -before( function(){ +var proposalId = null; + +before(function () { app = require('../server/server') }); @@ -97,17 +107,42 @@ describe('RawDatasets', () => { }, (tokenVal) => { accessToken = tokenVal; + utils.getToken(app, { + 'username': 'proposalIngestor', + 'password': 'aman' + }, + (tokenVal) => { + accessProposalToken = tokenVal; + done(); + }); + }); + }); + + it('adds a new proposal', function (done) { + request(app) + .post('/api/v2/Proposals?access_token=' + accessProposalToken) + .send(testproposal) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end(function (err, res) { + if (err) + return done(err); + res.body.should.have.property('ownerGroup').and.be.string; + res.body.should.have.property('proposalId').and.be.string; + proposalId = encodeURIComponent(res.body['proposalId']); done(); }); }); - it('adds a new raw dataset', function(done) { + + it('adds a new raw dataset', function (done) { request(app) .post('/api/v2/RawDatasets?access_token=' + accessToken) .send(testraw) .set('Accept', 'application/json') .expect(200) .expect('Content-Type', /json/) - .end(function(err, res) { + .end(function (err, res) { if (err) return done(err); res.body.should.have.property('owner').and.be.string; @@ -119,7 +154,7 @@ describe('RawDatasets', () => { }); - it('should fetch several raw datasets', function(done) { + it('should fetch several raw datasets', function (done) { request(app) .get('/api/v2/RawDatasets?filter=%7B%22limit%22%3A2%7D&access_token=' + accessToken) .set('Accept', 'application/json') @@ -133,7 +168,7 @@ describe('RawDatasets', () => { }); }); - it('should fetch this raw dataset', function(done) { + it('should fetch this raw dataset', function (done) { request(app) .get('/api/v2/RawDatasets/' + pid + '?access_token=' + accessToken) .set('Accept', 'application/json') @@ -146,7 +181,7 @@ describe('RawDatasets', () => { }); }); - it('should delete this raw dataset', function(done) { + it('should delete this raw dataset', function (done) { request(app) .delete('/api/v2/RawDatasets/' + pid + '?access_token=' + accessToken) .set('Accept', 'application/json') @@ -159,20 +194,35 @@ describe('RawDatasets', () => { }); }); - it('should contain an array of facets', function(done) { + + it('should contain an array of facets', function (done) { request(app) .get('/api/v2/RawDatasets/fullfacet?access_token=' + accessToken) .set('Accept', 'application/json') - .send({'ownerGroup': ['p11114']}) + .send({ + 'ownerGroup': ['p11114'] + }) .expect(200) .expect('Content-Type', /json/) .end((err, res) => { res.body.should.be.an('array'); - if(err) + if (err) done(err); done(); }); }); + it('should delete this proposal', function(done) { + request(app) + .delete('/api/v2/Proposals/' + proposalId + '?access_token=' + accessProposalToken) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) + .end((err, res) => { + if (err) + return done(err); + done(); + }); + }); });