diff --git a/.gitignore b/.gitignore index 426e25f..0ceefe4 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ node_modules npm-debug.log *.DS_Store +.idea/ \ No newline at end of file diff --git a/README.md b/README.md index f555487..9b47e2f 100644 --- a/README.md +++ b/README.md @@ -67,17 +67,29 @@ For more information see [example](example/index.js) ## Supported calls: -Accepts a subset of StatusPage.io collections or elements. +Accepts a subset of StatusPage.io collections or elements, not ALL. * GET * `pages` * `components` * `incidents`, `incidents/unresolved`, `incidents/scheduled` * `subscribers` + * `metrics_providers` * POST: * `incidents` * `subscribers` + * `metrics/data` + * `page_access_users` + +* PATCH: + * `pages` + * `components` + * `incidents` + * `page_access_users` + +* PUT: + * `components-groups` Read more about the statuspage.io API [here](http://doers.statuspage.io/api/v1/) diff --git a/lib/statuspage/index.js b/lib/statuspage/index.js index 8f33b7b..b0d29b6 100644 --- a/lib/statuspage/index.js +++ b/lib/statuspage/index.js @@ -24,4 +24,19 @@ StatusPageAPI.prototype.post = function (element, args, callback) { return statuspageRequest.sendRequest("POST", element, args, callback); }; +StatusPageAPI.prototype.patch = function (element, args, callback) { + var statuspageRequest = new StatusPageRequest(this); + return statuspageRequest.sendRequest("PATCH", element, args, callback); +}; + +StatusPageAPI.prototype.put = function (element, args, callback) { + var statuspageRequest = new StatusPageRequest(this); + return statuspageRequest.sendRequest("PUT", element, args, callback); +}; + +StatusPageAPI.prototype.delete = function (element, args, callback) { + var statuspageRequest = new StatusPageRequest(this); + return statuspageRequest.sendRequest("DELETE", element, args, callback); +}; + exports.StatusPageAPI = StatusPageAPI; diff --git a/lib/statuspage/statuspage-request.js b/lib/statuspage/statuspage-request.js index cb9a58e..d817361 100644 --- a/lib/statuspage/statuspage-request.js +++ b/lib/statuspage/statuspage-request.js @@ -1,7 +1,7 @@ /*jslint node: true, nomen: false, sloppy: true, vars: true, indent: 4, todo: true */ if (global.GENTLY_HIJACK) { - require = GENTLY_HIJACK.hijack(require); + require = GENTLY_HIJACK.hijack(require); } var https = require('https'), @@ -12,184 +12,201 @@ var https = require('https'), // Array of valid API elements that can be used for POST requests var ELEMENTS_POST = [ - 'incidents', - 'subscribers' + 'incidents', + 'subscribers', + 'metrics/data', + 'page_access_users' ]; // Array of valid API elements that can be used for GET requests var ELEMENTS_GET = [ - 'pages', - 'components', - 'incidents', 'incidents/unresolved', 'incidents/scheduled', - 'subscribers' + 'pages', + 'components', + 'incidents', 'incidents/unresolved', 'incidents/scheduled', + 'subscribers', + 'metrics_providers' ]; -// var ELEMENTS_DELETE = [ -// 'incidents', -// 'subscribers' -// ] +var ELEMENTS_PATCH = [ + 'pages', + 'components', + 'incidents', + 'page_access_users' +]; + +var ELEMENTS_PUT = [ + 'components-groups' +]; + +var ELEMENTS_DELETE = [ + 'incidents', + 'subscribers', + 'components-groups', + 'page_access_users' +]; var isValidOperation = function (method, element) { - // Validate Request method and element. - var validity = false; - switch (method) { + // Validate Request method and element. + var validity = false; + switch (method) { case 'GET': - validity = element && _(ELEMENTS_GET).include(element.toLowerCase()); - break; + validity = element && _(ELEMENTS_GET).include(element.toLowerCase()); + break; case 'POST': - validity = element && _(ELEMENTS_POST).include(element.toLowerCase()); - break; - // TODO: Not implemented - // case 'PATCH': - // validity = method && _(ELEMENTS_PATCH).include(method.toLowerCase()); - // break; - // case 'PUT': - // validity = method && _(ELEMENTS_PUT).include(method.toLowerCase()); - // break; - // case 'DELETE': - // validity = method && _(ELEMENTS_DELETE).include(method.toLowerCase()); - // break; - } - logger.log('debug', 'Validity(' + method + ', ' + element + '): ' + validity); - return validity; + validity = element && _(ELEMENTS_POST).include(element.toLowerCase()); + break; + case 'PATCH': + validity = method && ELEMENTS_PATCH.filter(e => element.indexOf(e) >= 0).length > 0 + break; + case 'PUT': + validity = method && ELEMENTS_PUT.filter(e => element.indexOf(e) >= 0).length > 0 + break; + case 'DELETE': + validity = method && ELEMENTS_DELETE.filter(e => element.indexOf(e) >= 0).length > 0; + break; + } + logger.log('debug', 'Validity(' + method + ', ' + element + '): ' + validity); + return validity; }; var isWriteOperation = function (httpVerb) { - return httpVerb === 'POST' || httpVerb === 'PATCH' || httpVerb === 'PUT'; + return httpVerb === 'POST' || httpVerb === 'PATCH' || httpVerb === 'PUT'; }; var requestHeaders = function (httpVerb, data, statuspage) { - var headers = { - 'User-Agent': statuspage.useragent, - 'Authorization': statuspage.apikey - }; - - if (isWriteOperation(httpVerb)) { - headers['Content-Type'] = 'application/x-www-form-urlencoded'; - headers['Content-Length'] = Buffer.byteLength(data); - } - return headers; + var headers = { + 'User-Agent': statuspage.useragent, + 'Authorization': statuspage.apikey + }; + + if (isWriteOperation(httpVerb)) { + headers['Content-Type'] = 'application/x-www-form-urlencoded'; + headers['Content-Length'] = Buffer.byteLength(data); + } + return headers; }; -var makeUrl = function (pageId, element) { - // Combine page ID and element to form request URI - // TODO: This function will need to be updated to support - // additional elements and operations - var url = '/v1/pages/' + pageId; - if (element === 'pages') { - url += '.json'; - } else { - url += '/' + element + '.json'; - } - return url; +var makeUrl = function (pageId, element, identifier) { + // Combine page ID and element to form request URI + // TODO: This function will need to be updated to support + // additional elements and operations + var url = '/v1/pages/' + pageId; + if (element === 'pages') { + url += '.json'; + } else if ( identifier ) { + url += '/' + element + '/' + identifier + '.json'; + } else { + url += '/' + element + '.json'; + } + return url; }; var StatusPageRequest = function (statuspage) { - StatusPageBase.call(this); - this.statuspage = statuspage; - logger.debugLevel = statuspage.debuglevel; - // Register handlers with base - // TODO: This has been replaced with callbacks, but could fairly easily - // be re-implemented if needed - // this.registerHandlers(handlers); + StatusPageBase.call(this); + this.statuspage = statuspage; + logger.debugLevel = statuspage.debuglevel; + // Register handlers with base + // TODO: This has been replaced with callbacks, but could fairly easily + // be re-implemented if needed + // this.registerHandlers(handlers); }; StatusPageRequest.prototype = Object.create(StatusPageBase.prototype); StatusPageRequest.prototype.chunkedResponse = function (res, callback) { - var self = this, - data = '', - result = {}; - - res.on('data', function (chunk) { - data += chunk.toString('utf8'); - }); - res.on('end', function () { - // Package response data - var json = { - data: {}, - response: { - statusCode: res.statusCode, - statusMessage: res.statusMessage, - headers: res.headers - } - }; + var self = this, + data = '', + result = {}; + + res.on('data', function (chunk) { + data += chunk.toString('utf8'); + }); + res.on('end', function () { + // Package response data + var json = { + data: {}, + response: { + statusCode: res.statusCode, + statusMessage: res.statusMessage, + headers: res.headers + } + }; - try { - logger.log('debug', ['Raw Response data: ', data]); - json.data = JSON.parse(data); - // Error parsing JSON response - if (json.error) { - result.status = 'error'; - result.error = json; - self.emit('error', json); - } - // Status OK, so return success - if (res.statusCode === 200 || res.statusCode === 201) { - result.status = 'success'; - result.error = null; - result.data = json.data; - // Something went wrong - } else { - var message = 'Unexpected response: ' + - json.response.statusCode + ' ' + - json.response.statusMessage; - result.status = 'failure'; - result.error = message; - } - self.emit('success', json); - } catch (e) { - result.status = 'error'; - result.error = e; - self.emit('error', e); - } - if (typeof callback === 'function') { - callback(result); - } else { - return result; - } - }); + try { + logger.log('debug', ['Raw Response data: ', data]); + json.data = JSON.parse(data); + // Error parsing JSON response + if (json.error) { + result.status = 'error'; + result.error = json; + self.emit('error', json); + } + // Status OK, so return success + if (res.statusCode === 200 || res.statusCode === 201) { + result.status = 'success'; + result.error = null; + result.data = json.data; + // Something went wrong + } else { + var message = 'Unexpected response: ' + + json.response.statusCode + ' ' + + json.response.statusMessage; + result.status = 'failure'; + result.error = message; + } + self.emit('success', json); + } catch (e) { + result.status = 'error'; + result.error = e; + self.emit('error', e); + } + if (typeof callback === 'function') { + callback(result); + } else { + return result; + } + }); }; StatusPageRequest.prototype.sendRequest = function (method, element, args, callback) { - var self = this, - statuspage = this.statuspage; - - args = args || {}; - if (isValidOperation(method, element)) { - // Prepare data to be sent to API - var host = statuspage.host, - port = statuspage.port, - url = makeUrl(statuspage.pageid, element), - httpVerb = method, - data = qs.stringify(args, {arrayFormat: 'brackets'}), - options = { - host: host, - port: port, - path: url, - method: httpVerb, - headers: requestHeaders(httpVerb, data, statuspage) - }; - logger.log('debug', ['Query String: ', data]); - logger.log('debug', ['Request options: ', options]); - // Send API request - var req = https.request(options, function (res) { - self.chunkedResponse(res, callback); - }); - req.on('error', function (error) { - self.emit('error', error); - }); - if (isWriteOperation(httpVerb)) { - req.write(data, 'utf8'); - } - req.end(); - } else { - // Emit warning - var warningMessage = 'Request is not supported. ' + method + ': ' + element; - this.on('warning', function () { - logger.log('warn', warningMessage); - }); - this.emit('warning', warningMessage); + var self = this, + statuspage = this.statuspage; + + args = args || {}; + if (isValidOperation(method, element)) { + // Prepare data to be sent to API + var host = statuspage.host, + port = statuspage.port, + url = makeUrl(statuspage.pageid, element), + httpVerb = method, + data = qs.stringify(args, {arrayFormat: 'brackets'}), + options = { + host: host, + port: port, + path: url, + method: httpVerb, + headers: requestHeaders(httpVerb, data, statuspage) + }; + logger.log('debug', ['Query String: ', data]); + logger.log('debug', ['Request options: ', options]); + // Send API request + var req = https.request(options, function (res) { + self.chunkedResponse(res, callback); + }); + req.on('error', function (error) { + self.emit('error', error); + }); + if (isWriteOperation(httpVerb)) { + req.write(data, 'utf8'); } + req.end(); + } else { + // Emit warning + var warningMessage = 'Request is not supported. ' + method + ': ' + element; + this.on('warning', function () { + logger.log('warn', warningMessage); + }); + this.emit('warning', warningMessage); + } }; // Export diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3a108f4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,904 @@ +{ + "name": "statuspage-api", + "version": "0.5.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "statuspage-api", + "version": "0.5.1", + "license": "MIT", + "dependencies": { + "qs": "6.7.2", + "underscore": "^1.13.4" + }, + "devDependencies": { + "chai": "^2.1.2", + "gently": "0.9.2", + "jslint": "", + "mocha": "^2.2.1", + "semver": "" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/assertion-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", + "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "node_modules/chai": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-2.3.0.tgz", + "integrity": "sha1-ii9qNHSNqAEJD9cyh7Kqc5pOkJo=", + "dev": true, + "dependencies": { + "assertion-error": "1.0.0", + "deep-eql": "0.1.3" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/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=", + "dev": true + }, + "node_modules/debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "dependencies": { + "type-detect": "0.1.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha512-VzVc42hMZbYU9Sx/ltb7KYuQ6pqAw+cbFWVy4XKdkuEL2CFaRLGEnISPs7YdzaUGpi+CpIqvRmu7hPQ4T7EQ5w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/gently": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/gently/-/gently-0.9.2.tgz", + "integrity": "sha1-N6oHK6CJQnTN5Sh+E+7oof/C+1g=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha512-RTBwDHhNuOx4F0hqzItc/siXCasGfC4DeWcBamclWd+6jWtBaeB/SGbMkGf0eiQoW7ib8JpvOgnUsmgMHI3Mfw==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", + "dev": true, + "dependencies": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "bin": { + "jade": "bin/jade" + } + }, + "node_modules/jade/node_modules/commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true, + "engines": { + "node": ">= 0.4.x" + } + }, + "node_modules/jade/node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/jslint": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/jslint/-/jslint-0.12.1.tgz", + "integrity": "sha512-q5iHswjOmJffbsGVq/1umGh4YBxb5pCArNHCZeHpkuVDDKM6IldqUn4hLehKSwQr7Bn07VXjD34Lx3nw+6j8eA==", + "dev": true, + "dependencies": { + "exit": "~0.1.2", + "glob": "~7.1.3", + "nopt": "~4.0.1", + "readable-stream": "~2.1.5" + }, + "bin": { + "jslint": "bin/jslint.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha512-jNt2iEk9FPmZLzL+sm4FNyOIDYXf2wUU6L4Cc8OIKK/kzgMHKPi4YhTZqG4bW4kQVdIv6wutDybRhXfdnujA1Q==", + "dev": true, + "dependencies": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", + "dev": true, + "dependencies": { + "inherits": "2", + "minimatch": "0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dev": true + }, + "node_modules/qs": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.2.tgz", + "integrity": "sha512-pIxa8oGRlwdn9r+PfxMWAa27MPUvZV8+FU9m7VKkC9Ppe0Mi789ge1lDwqYiMFb3ZS7SBZMtII9dTs0UGqHvNA==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "dev": true, + "dependencies": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "deprecated": "to-iso-string has been deprecated, use @segment/to-iso-string instead.", + "dev": true + }, + "node_modules/type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "assertion-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", + "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "chai": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-2.3.0.tgz", + "integrity": "sha1-ii9qNHSNqAEJD9cyh7Kqc5pOkJo=", + "dev": true, + "requires": { + "assertion-error": "1.0.0", + "deep-eql": "0.1.3" + } + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "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=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha512-VzVc42hMZbYU9Sx/ltb7KYuQ6pqAw+cbFWVy4XKdkuEL2CFaRLGEnISPs7YdzaUGpi+CpIqvRmu7hPQ4T7EQ5w==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "gently": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/gently/-/gently-0.9.2.tgz", + "integrity": "sha1-N6oHK6CJQnTN5Sh+E+7oof/C+1g=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha512-RTBwDHhNuOx4F0hqzItc/siXCasGfC4DeWcBamclWd+6jWtBaeB/SGbMkGf0eiQoW7ib8JpvOgnUsmgMHI3Mfw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "jslint": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/jslint/-/jslint-0.12.1.tgz", + "integrity": "sha512-q5iHswjOmJffbsGVq/1umGh4YBxb5pCArNHCZeHpkuVDDKM6IldqUn4hLehKSwQr7Bn07VXjD34Lx3nw+6j8eA==", + "dev": true, + "requires": { + "exit": "~0.1.2", + "glob": "~7.1.3", + "nopt": "~4.0.1", + "readable-stream": "~2.1.5" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha512-jNt2iEk9FPmZLzL+sm4FNyOIDYXf2wUU6L4Cc8OIKK/kzgMHKPi4YhTZqG4bW4kQVdIv6wutDybRhXfdnujA1Q==", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "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 + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^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", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "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=", + "dev": true + }, + "qs": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.2.tgz", + "integrity": "sha512-pIxa8oGRlwdn9r+PfxMWAa27MPUvZV8+FU9m7VKkC9Ppe0Mi789ge1lDwqYiMFb3ZS7SBZMtII9dTs0UGqHvNA==" + }, + "readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "dev": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + }, + "underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index fe6c68b..23e72ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "statuspage-api", - "version": "0.4.0", + "version": "0.5.4", "description": "A wrapper for select statuspage.io API commands", "main": "index.js", "scripts": { @@ -18,13 +18,13 @@ "license": "MIT", "devDependencies": { "chai": "^2.1.2", - "mocha": "^2.2.1", "gently": "0.9.2", - "semver": "", - "jslint": "" + "jslint": "", + "mocha": "^2.2.1", + "semver": "" }, "dependencies": { - "underscore": "1.8.2", - "qs": "2.4.1" + "qs": "6.7.2", + "underscore": "^1.13.4" } } diff --git a/tests/statuspage-request-test.js b/tests/statuspage-request-test.js index b114b13..445ede5 100644 --- a/tests/statuspage-request-test.js +++ b/tests/statuspage-request-test.js @@ -123,6 +123,104 @@ describe('Request (POST:incidents)', function () { }); }); +describe('Request (PATCH:incidents)', function () { + + var statuspage, connection, url, gently, request, params, statuspageRequest; + + var before = function () { + statuspage = new StatusPageAPI(); + connection = new fakes.Client(80, statuspage.host); + request = new fakes.ClientRequest(); + gently = new Gently(); + var params = { foo:"bar" }; + statuspageRequest = new StatusPageRequest(statuspage); + }; + + it("should create the update the incident", function () { + before(); + var element = "incidents/w73483838", + correctPath = "/v1/pages/" + statuspage["pageid"] + "/" + element + ".json"; + gently.expect(GENTLY_HIJACK.hijacked.https, "request", function (options) { + assert.equal(options["method"], "PATCH"); + assert.equal(options["path"], correctPath); + assert.equal(options["host"], "api.statuspage.io"); + assert.equal(options["port"], 443); + assert.equal(options["headers"]["Content-Type"], 'application/x-www-form-urlencoded'); + return request; + }); + statuspageRequest.sendRequest("PATCH", element); + }); + + it("should have the correct Content-Length", function () { + before(); + var args = { key: "value" }, + dataLength = Buffer.byteLength(querystring.stringify(args)); + gently.expect(GENTLY_HIJACK.hijacked.https, "request", function (options) { + assert.equal(options["headers"]["Content-Type"], 'application/x-www-form-urlencoded'); + assert.equal(options["headers"]["Content-Length"], dataLength); + return request; + }); + statuspageRequest.sendRequest("PATCH", "incidents/w73483838", args); + }); + + it("should emit warning with invalid Element", function () { + before(); + gently.expect(statuspageRequest, "emit", function (event) { + assert.equal(event, "warning"); + }); + statuspageRequest.sendRequest("PATCH", "bad-element"); + }); +}); + +describe('Request (PUT:component-groups)', function () { + + var statuspage, connection, url, gently, request, params, statuspageRequest; + + var before = function () { + statuspage = new StatusPageAPI(); + connection = new fakes.Client(80, statuspage.host); + request = new fakes.ClientRequest(); + gently = new Gently(); + var params = { foo:"bar" }; + statuspageRequest = new StatusPageRequest(statuspage); + }; + + it("should create the update the component group", function () { + before(); + var element = "components-groups/w73463sdw2", + correctPath = "/v1/pages/" + statuspage["pageid"] + "/" + element + ".json"; + gently.expect(GENTLY_HIJACK.hijacked.https, "request", function (options) { + assert.equal(options["method"], "PUT"); + assert.equal(options["path"], correctPath); + assert.equal(options["host"], "api.statuspage.io"); + assert.equal(options["port"], 443); + assert.equal(options["headers"]["Content-Type"], 'application/x-www-form-urlencoded'); + return request; + }); + statuspageRequest.sendRequest("PUT", element); + }); + + it("should have the correct Content-Length", function () { + before(); + var args = { key: "value" }, + dataLength = Buffer.byteLength(querystring.stringify(args)); + gently.expect(GENTLY_HIJACK.hijacked.https, "request", function (options) { + assert.equal(options["headers"]["Content-Type"], 'application/x-www-form-urlencoded'); + assert.equal(options["headers"]["Content-Length"], dataLength); + return request; + }); + statuspageRequest.sendRequest("PUT", "components-groups/w73463sdw2", args); + }); + + it("should emit warning with invalid Element", function () { + before(); + gently.expect(statuspageRequest, "emit", function (event) { + assert.equal(event, "warning"); + }); + statuspageRequest.sendRequest("PUT", "bad-element"); + }); +}); + describe('Request Events', function () { var statuspage, connection, url, gently, request, receivedData, statuspageRequest;