├── .gitignore ├── .jshintrc ├── .travis.yml ├── LICENSE.txt ├── README.md ├── index.js ├── lib ├── nupkg.js ├── pack.js └── push.js ├── package-lock.json ├── package.json └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | # npm 2 | node_modules 3 | npm-debug.log 4 | 5 | # Build artifacts 6 | bin 7 | 8 | # OS generated files 9 | .idea 10 | .DS_Store 11 | Thumbs.db 12 | 13 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "latedef": "nofunc", 3 | "quotmark": "single", 4 | "indent": 2, 5 | "camelcase": true, 6 | "eqeqeq": true, 7 | "curly": true, 8 | "unused": true, 9 | "strict": true, 10 | "trailing": true, 11 | "eqnull": true, 12 | "undef": true, 13 | "noarg": true, 14 | "node": true, 15 | "expr": true, 16 | "browser": false, 17 | "mocha": true 18 | } 19 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | matrix: 3 | include: 4 | - node_js: "0.12" 5 | - node_js: "4.0" 6 | - node_js: "5.0" 7 | - node_js: "6.0" 8 | - node_js: "node" 9 | sudo: required 10 | dist: trusty 11 | cache: 12 | directories: 13 | - node_modules 14 | script: 15 | - npm test -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) Octopus Deploy and contributors. All rights reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use 4 | these files except in compliance with the License. You may obtain a copy of the 5 | License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software distributed 10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the 12 | specific language governing permissions and limitations under the License. 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | octopack 2 | ==== 3 | > A nodejs tool for packaging and pushing projects to an Octopus Deploy instance. 4 | 5 | ## Installation 6 | Install with [npm](https://www.npmjs.com/package/@octopusdeploy/octopackjs) 7 | 8 | ```shell 9 | npm install @octopusdeploy/octopackjs --save-dev 10 | ``` 11 | 12 | ## API 13 | 14 | ### var package = octo.pack(type, options) 15 | 16 | #### type 17 | Optional parameter to define the package type. Valid values are `targz`, `tar` or `zip`. If not provided this defaults to `targz`. 18 | 19 | #### options.packagejson 20 | Path to the `package.json` containing project information used to provide required package metadata. 21 | 22 | #### options.id 23 | Defines the `Id` component of the created package. By default it will extract the name out of `package.json` if present. 24 | 25 | #### options.version 26 | Defines the `version` component of the created package. By default it will extract the version out of `package.json` if present. 27 | 28 | #### package.append(filePath, buff, options) 29 | Adds the `buff` Buffer instance to the package named using the provided `filePath` parameter as a relative path from the root of the archive. 30 | 31 | #### package.append(filePath, stream, options) 32 | Adds the `stream` Stream instance to the package named using the provided `filePath` parameter as a relative path from the root of the archive. 33 | 34 | #### package.append(filePath, file) 35 | Adds the `file` from disk to the package named using the provided `filePath` parameter as a relative path from the root of the archive. 36 | If the `filePath` parameter is missing, the provided path to the file on disk will be used as the filePath in the archive. 37 | If the `filePath` is a glob pattern, then the glob is used to append files to the package and the other arguments will be ignored. 38 | Supplying a folder path without being a glob will be ignored. 39 | 40 | #### package.appendSubDir(dir, toRoot) 41 | Adds the sub-directory `dir` to the archive. Adds the contents of `dir` to the root of the archive if `toRoot` is true (defaults to false). 42 | 43 | #### package.toStream(function callback(err, data){}) 44 | Completes the packaging of the files and invokes the provided callback, returning an object containing the stream instance and name. 45 | 46 | #### package.toFile(dir, function callback(err, data){}) 47 | Completes the packaging of the files, saves it to disk at the provided directory location and invokes the provided callback, returning an object containing the package path, name and size. 48 | 49 | ### octo.push(file, options, function callback(err, data){}) 50 | 51 | #### file 52 | Package file that is to be pushed to server. This can be an instance of a Stream, Buffer or file path string. 53 | 54 | #### options.host 55 | Required property that points to the Octopus Server instance the package should be pushed to. 56 | 57 | #### options.replace 58 | Flag to force overwrite of existing package if one already exists with the same ID and version. 59 | 60 | #### options.apiKey 61 | Key linked to account with `BuiltInFeedPush` permissions. 62 | If `options.replace` is set to true and a package with the same ID and version already exists then the `BuiltInFeedAdminister` permission is required. 63 | 64 | #### options.name 65 | If a Stream or Buffer object is provided in the `file` parameter, the package name needs is required to properly store and use in Octopus Deploy. If this value is not provided and a path has been provided in the `file` parameter then the name of the file itself will be used. 66 | 67 | #### callback 68 | Invoked when the HTTP request has completed. The `data` object contains the HTTP response body that was returned as a result of a successful push. 69 | 70 | ## Usage Examples 71 | 72 | #### Pack 73 | ```js 74 | var octo = require('@octopusdeploy/octopackjs'); 75 | octo.pack() 76 | .append('buffer files/hello.txt', Buffer.from('hello world'), {date: new Date(2011, 11, 11)}) 77 | .append('stream.txt', fs.createReadStream('./package.json')) 78 | .append('lib/myfile.js') 79 | .appendSubDir('dist/', true) 80 | .toFile('./bin', function (err, data) { 81 | console.log("Package Saved: "+ data.name); 82 | }); 83 | ``` 84 | 85 | #### Push 86 | ```js 87 | var octo = require('@octopusdeploy/octopackjs'); 88 | 89 | octo.push('./bin/Sample.Web.3.2.1.tar.gz', { 90 | host: 'http://octopus-server/', 91 | apikey: 'API-XXXXXXXXX', 92 | replace: true 93 | }, function(err, result) { 94 | if(!err) { 95 | console.log("Package Pushed:" + body.Title + " v"+ body.Version +" (" + fileSizeString(body.PackageSizeBytes) +"nytes)"); 96 | } 97 | }); 98 | ``` 99 | ```js 100 | var octo = require('@octopusdeploy/octopackjs'); 101 | 102 | octo.push('./bin/Sample.Web.3.2.1.tar.gz', { 103 | host: 'http://octopus-server/', 104 | apikey: 'API-XXXXXXXXX', 105 | replace: true, 106 | spaceId: 'Spaces-1' 107 | }, function(err, result) { 108 | if(!err) { 109 | console.log("Package Pushed:" + body.Title + " v"+ body.Version +" (" + fileSizeString(body.PackageSizeBytes) +"nytes)"); 110 | } 111 | }); 112 | 113 | ``` 114 | 115 | ## Tests 116 | ```shell 117 | npm test 118 | ``` 119 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | pack: require('./lib/pack.js'), 5 | push: require('./lib/push.js') 6 | }; -------------------------------------------------------------------------------- /lib/nupkg.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var engine = require('zip-stream'); 4 | var util = require('archiver-utils'); 5 | 6 | var XMLWriter = require('xml-writer'); 7 | var path = require('path'); 8 | var propsId = '7857dbf80735479b8ee19fa60cb8239e'; 9 | 10 | // MIT licensed by Sindre Sorhus https://github.com/sindresorhus/semver-regex 11 | var semVerRegex = /\bv?(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)(?:-[\da-z\-]+(?:\.[\da-z\-]+)*)?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?\b/ig; 12 | 13 | var Nupkg = module.exports = function(options) { 14 | if (!(this instanceof Nupkg)) { 15 | return new Nupkg(options); 16 | } 17 | 18 | options = this.options = util.defaults(options, { 19 | comment: '', 20 | forceUTC: false, 21 | store: false 22 | }); 23 | 24 | if (typeof options.nupkgOptions !== 'object') { 25 | options.nupkgOptions = {}; 26 | } 27 | 28 | this.supports = { 29 | directory: true 30 | }; 31 | 32 | this.engine = new engine(options); 33 | 34 | this._appending = 0; 35 | this._extensions = []; 36 | this._meta = options.nupkgOptions; 37 | 38 | verifyMeta(this._meta); 39 | }; 40 | 41 | Nupkg.prototype.append = function(source, data, callback) { 42 | var self = this; 43 | self._appending++; 44 | 45 | data.name = data.name 46 | .replace(/\\/g, '/') 47 | .replace(/\s/g,'%20'); 48 | 49 | this.engine.entry(source, data, function() { 50 | self._extensions[path.extname(data.name).substr(1)] = true; 51 | if(--self._appending === 0 && self.idle){ 52 | self.idle(); 53 | } 54 | if(callback) { 55 | callback.apply(this, callback, arguments); 56 | } 57 | }); 58 | }; 59 | 60 | Nupkg.prototype.finalize = function() { 61 | var self = this; 62 | this.idle = function () { 63 | delete self.idle; 64 | self.append(getContentTypesXml(self._extensions), { name: '[Content_Types].xml' }, function () { 65 | self.append(getNuSpecXml(self._meta), { name: self._meta.id + '.nuspec' }, function () { 66 | self.append(getCorePropertiesXml(self._meta), { name: 'package/services/metadata/core-properties/' + propsId + '.psmdcp' }, function () { 67 | self.append(getRelsXml(self._meta), { name: '_rels/.rels' }, function () { 68 | self.engine.finalize(); 69 | }); 70 | }); 71 | }); 72 | }); 73 | }; 74 | 75 | if (self._appending === 0) { 76 | this.idle(); 77 | } 78 | }; 79 | 80 | Nupkg.prototype.on = function() { 81 | return this.engine.on.apply(this.engine, arguments); 82 | }; 83 | 84 | Nupkg.prototype.pipe = function() { 85 | return this.engine.pipe.apply(this.engine, arguments); 86 | }; 87 | 88 | Nupkg.prototype.unpipe = function() { 89 | return this.engine.unpipe.apply(this.engine, arguments); 90 | }; 91 | 92 | function getNuSpecXml(meta) { 93 | var properties = [ 94 | 'id', 'title', 'version', 'authors', 'owners', 'licenseUrl', 95 | 'projectUrl', 'iconUrl', 'requireLicenseAcceptance', 96 | 'description', 'summary', 'releaseNotes', 'copyright', 97 | 'language', 'tags', 'dependencies' 98 | ]; 99 | 100 | function normalizeVersionDep(version) { 101 | version = version.replace(/\s+/, ''); 102 | 103 | if (!semVerRegex.test(version)) { 104 | throw new Error('Invalid version dependecy: ' + version); 105 | } 106 | 107 | if (semVerRegex.test(version)) { 108 | return version; 109 | } 110 | 111 | version = version[0] + version.substr(1, version.length - 2).split(',').join(', ') + version[version.length - 1]; 112 | 113 | return version; 114 | } 115 | 116 | var xw = new XMLWriter(true); 117 | 118 | xw.startDocument(); 119 | xw.startElement('package'); 120 | xw.writeAttribute('xmlns', 'http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd'); 121 | xw.startElement('metadata'); 122 | 123 | properties.forEach(function (property) { 124 | if (property in meta) { 125 | if (property === 'dependencies') { 126 | xw.startElement('dependencies'); 127 | 128 | meta[property].forEach(function (dep) { 129 | xw.startElement('dependency'); 130 | xw.writeAttribute('id', dep.id); 131 | 132 | if (dep.version) { 133 | xw.writeAttribute('version', normalizeVersionDep(dep.version)); 134 | } 135 | 136 | xw.endElement(); 137 | }); 138 | 139 | xw.endElement(); 140 | return; 141 | } 142 | 143 | xw.writeElement(property, meta[property].toString()); 144 | } 145 | }); 146 | 147 | xw.endDocument(); 148 | 149 | return xw.toString(); 150 | } 151 | 152 | function getCorePropertiesXml(meta) { 153 | var xw = new XMLWriter(true, 'utf-8'); 154 | 155 | function writeProp(name, value) { 156 | if (value) { 157 | xw.writeElement(name, value); 158 | } 159 | } 160 | 161 | xw.startDocument(); 162 | xw.startElement('coreProperties'); 163 | xw.writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); 164 | xw.writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/'); 165 | xw.writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); 166 | xw.writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'); 167 | 168 | writeProp('dc:creator', meta.authors); 169 | writeProp('dc:description', meta.description); 170 | writeProp('dc:identifier', meta.id); 171 | writeProp('version', meta.version); 172 | writeProp('dc:language', meta.language); 173 | writeProp('keywords', meta.tags); 174 | writeProp('lastModifiedBy', 'NuGet, Version=2.8.50320.36, Culture=neutral, PublicKeyToken=null;Microsoft Windows NT 6.2.9200.0;.NET Framework 4'); 175 | 176 | xw.endDocument(); 177 | 178 | return xw.toString(); 179 | } 180 | 181 | function getContentTypesXml(extensions) { 182 | var xw = new XMLWriter(true, 'utf-8'); 183 | xw.startDocument(); 184 | xw.startElement('Types'); 185 | xw.writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types'); 186 | 187 | addContentType('rels', 'application/vnd.openxmlformats-package.relationships+xml'); 188 | addContentType('nuspec', 'application/octet'); 189 | addContentType('psmdcp', 'application/vnd.openxmlformats-package.core-properties+xml'); 190 | 191 | for (var ext in extensions) { 192 | if(ext && ext !== '') { 193 | addContentType(ext, 'application/octet'); 194 | } 195 | } 196 | 197 | function addContentType(ext, type){ 198 | xw.startElement('Default'); 199 | xw.writeAttribute('Extension', ext); 200 | xw.writeAttribute('ContentType', type || 'application/octet'); 201 | xw.endElement(); 202 | } 203 | 204 | xw.endDocument(); 205 | return xw.toString(); 206 | } 207 | 208 | function getRelsXml(meta) { 209 | var xw = new XMLWriter(true, 'utf-8'); 210 | 211 | xw.startDocument(); 212 | xw.startElement('Relationships'); 213 | xw.writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); 214 | 215 | xw.startElement('Relationship'); 216 | xw.writeAttribute('Type', 'http://schemas.microsoft.com/packaging/2010/07/manifest'); 217 | xw.writeAttribute('Target', '/' + meta.id + '.nuspec'); 218 | xw.writeAttribute('Id', 'R569c48f3cf1b4b14'); 219 | xw.endElement(); 220 | 221 | xw.startElement('Relationship'); 222 | xw.writeAttribute('Type', 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties'); 223 | xw.writeAttribute('Target', '/package/services/metadata/core-properties/' + propsId + '.psmdcp'); 224 | xw.writeAttribute('Id', 'R9e8f0077d5174f67'); 225 | xw.endElement(); 226 | 227 | xw.endDocument(); 228 | 229 | return xw.toString(); 230 | } 231 | 232 | function verifyMeta(meta) { 233 | if (!meta.id) { 234 | throw new Error('Missing required package id.'); 235 | } 236 | 237 | if (!/^[a-z0-9\.\-]+$/i.test(meta.id)) { 238 | throw new Error('Package id isn\'t in a valid format.'); 239 | } 240 | 241 | if (!meta.version) { 242 | throw new Error('Missing required package version.'); 243 | } 244 | 245 | if (!semVerRegex.test(meta.version)) { 246 | throw new Error('Version isn\'t proper sem-ver "x.x.x".'); 247 | } 248 | 249 | if (!meta.authors) { 250 | throw new Error('Missing required package authors.'); 251 | } 252 | 253 | if (!meta.description) { 254 | throw new Error('Missing required package description.'); 255 | } 256 | } -------------------------------------------------------------------------------- /lib/pack.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var archiver = require('archiver'); 4 | var fs = require('fs'); 5 | var path = require('path'); 6 | var stream = require('stream'); 7 | var isGlob = require('is-glob'); 8 | 9 | archiver.registerFormat('nupkg', require('./nupkg')); 10 | 11 | module.exports = function(type, options) { 12 | if(typeof type === 'object' && !options){ 13 | options = type; 14 | type = null; 15 | } 16 | options = options || {}; 17 | type = type || 'tar.gz'; 18 | if(type[0] === '.'){ 19 | type = type.substring(1); 20 | } 21 | 22 | var methods = {}; 23 | var details = getPackageDetails(options || {}); 24 | var archive = createArchiver(type, details); 25 | 26 | archive.on('error', function (err) { 27 | throw err; 28 | }); 29 | 30 | methods.append = function append(name, file, options) { 31 | if (Buffer.isBuffer(file) || isReadableStream(file)) { 32 | name = name.replace(/\\/g, '/') + (!file ? '/' : ''); 33 | options = options || {}; 34 | archive.append(file, {name: name, date: options.date}); 35 | } else { 36 | name = name.replace(/\\/g, '/'); 37 | if (isGlob(name)) { 38 | archive.glob(name); 39 | } else{ 40 | var content = typeof file === 'string' ? file : name; 41 | archive.file(content, {name: name.replace(/\\/g, '/')}); 42 | } 43 | } 44 | 45 | return methods; 46 | }; 47 | 48 | methods.appendSubDir = function appendSubDir(dir, toRoot) { 49 | if (typeof toRoot == 'undefined') 50 | { 51 | toRoot = false; 52 | } 53 | dir = dir.replace(/\\/g, '/'); 54 | archive.directory(dir, !toRoot); 55 | return methods; 56 | }; 57 | 58 | methods.toFile = function toFile(dir, cb) { 59 | if(typeof dir === 'function') { 60 | cb = dir; 61 | dir = __dirname; 62 | } 63 | var fileName = getFileName(); 64 | 65 | fs.mkdir(dir, function(err) { 66 | if(err && err.code !== 'EEXIST') { 67 | cb(err); 68 | } else { 69 | var filePath = path.join(dir, fileName); 70 | var output = fs.createWriteStream(filePath); 71 | 72 | archive.pipe(output); 73 | archive.finalize(); 74 | 75 | output.on('close', function () { 76 | cb(null, { size: archive.pointer(), name: fileName, path: filePath}); 77 | }); 78 | } 79 | }); 80 | }; 81 | 82 | methods.toStream = function toStream(cb) { 83 | archive.finalize(); 84 | cb(null, { stream: archive, name: getFileName()}); 85 | }; 86 | 87 | function getFileName() { 88 | return details.id + '.' + details.version + getExtension(type); 89 | } 90 | 91 | return methods; 92 | }; 93 | 94 | function isReadableStream(obj) { 95 | return obj instanceof stream.Stream && typeof (obj._read) === 'function' && typeof (obj._readableState) === 'object'; 96 | } 97 | 98 | function createArchiver(type) { 99 | switch (type) { 100 | case 'targz': 101 | case 'tar.gz': 102 | return archiver('tar', {gzip: true}); 103 | case 'tar': 104 | return archiver('tar'); 105 | case 'zip': 106 | return archiver('zip'); 107 | case 'nupkg': 108 | case 'nuget': 109 | throw 'Currently unable to support .nupkg file. Please use .tar.gz or .zip'; 110 | //return archiver('nupkg', {nupkgOptions: details}); 111 | } 112 | throw 'Unknown archive type'; 113 | } 114 | 115 | function getExtension(type){ 116 | switch (type) { 117 | case 'targz': 118 | case 'tar.gz': 119 | return '.tar.gz'; 120 | case 'tar': 121 | return '.tar'; 122 | case 'zip': 123 | return '.zip'; 124 | case 'nupkg': 125 | case 'nuget': 126 | throw 'Currently unable to support .nupkg file. Please use .tar.gz or .zip'; 127 | //return '.nupkg'; 128 | } 129 | throw 'Unknown archive type'; 130 | } 131 | 132 | function getPackageDetails(options){ 133 | return { 134 | id: options.id || getPackageJson(options).name.replace('/', '.').replace('@',''), 135 | version: options.version || getPackageJson(options).version 136 | }; 137 | } 138 | 139 | function getPackageJson(options) { 140 | return require(options.packagejson || path.join(process.cwd(), 'package.json')); 141 | } -------------------------------------------------------------------------------- /lib/push.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var fs = require('fs'); 5 | var url = require('url'); 6 | var request = require('request'); 7 | var stream = require('stream'); 8 | var streamToBuffer = require('stream-to-buffer'); 9 | 10 | 11 | module.exports = function(file, options, callback) { 12 | var verbose = options.verbose; 13 | 14 | if(isReadableStream(file)) { 15 | streamToBuffer(file, function (err, buffer) { 16 | if(err){ 17 | callback(err); 18 | } else { 19 | performPost(buffer); 20 | } 21 | }); 22 | } else { 23 | performPost(file); 24 | } 25 | 26 | function performPost(fileBytes) { 27 | 28 | var requestOptions = { 29 | url: getUri(options), 30 | headers: { 31 | 'X-Octopus-ApiKey': options.apikey || options.apiKey 32 | }, 33 | formData: extractFormData(fileBytes, options), 34 | json: true 35 | }; 36 | 37 | if (verbose) { 38 | console.info('Pushing to: ' + requestOptions.url); 39 | } 40 | 41 | request.post(requestOptions, function (err, resp, body) { 42 | if (err) { 43 | callback(err); 44 | } else { 45 | if (verbose) { 46 | console.info('Push response: ' + resp.statusCode +" - "+ resp.statusMessage); 47 | } 48 | if (resp.statusCode === 200 || resp.statusCode === 201) { 49 | callback(null, body); 50 | } else { 51 | callback({ 52 | statusCode: resp.statusCode, 53 | statusMessage: resp.statusMessage, 54 | body: body, 55 | response: resp 56 | }); 57 | } 58 | } 59 | }); 60 | } 61 | 62 | function getUri(options) { 63 | var packageUri = options.host.replace(/\/?$/, '/'); 64 | 65 | // Check to see if a space id was provided 66 | if (options.hasOwnProperty('spaceId') == true) 67 | { 68 | packageUri = url.resolve(packageUri, ('api/' + options.spaceId + '/packages/raw')); 69 | } 70 | else 71 | { 72 | packageUri = url.resolve(packageUri, 'api/packages/raw'); 73 | } 74 | if (!!options.replace) { 75 | packageUri += '?replace=true'; 76 | } 77 | return packageUri; 78 | } 79 | 80 | function extractFormData(file, options) { 81 | 82 | var fileContents; 83 | var fileName = options.name; 84 | if (typeof file === 'string') { 85 | fileContents = fs.createReadStream(file); 86 | fileName = fileName || file; 87 | } else if (Buffer.isBuffer(file) || isReadableStream(file)) { 88 | fileContents = file; 89 | } 90 | 91 | if (!fileName) { 92 | throw new Error('Filename is missing from options'); 93 | } 94 | 95 | return { 96 | file: { 97 | value: fileContents, 98 | options: { 99 | filename: path.basename(fileName), 100 | contentType: 'application/octet-stream' 101 | } 102 | } 103 | }; 104 | } 105 | 106 | function isReadableStream(obj) { 107 | return obj instanceof stream.Stream && typeof (obj._read) === 'function' && typeof (obj._readableState) === 'object'; 108 | } 109 | }; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@octopusdeploy/octopackjs", 3 | "version": "0.2.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sinonjs/commons": { 8 | "version": "1.3.0", 9 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", 10 | "integrity": "sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==", 11 | "dev": true, 12 | "requires": { 13 | "type-detect": "4.0.8" 14 | }, 15 | "dependencies": { 16 | "type-detect": { 17 | "version": "4.0.8", 18 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 19 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 20 | "dev": true 21 | } 22 | } 23 | }, 24 | "@sinonjs/formatio": { 25 | "version": "3.0.0", 26 | "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.0.0.tgz", 27 | "integrity": "sha512-vdjoYLDptCgvtJs57ULshak3iJe4NW3sJ3g36xVDGff5AE8P30S6A093EIEPjdi2noGhfuNOEkbxt3J3awFW1w==", 28 | "dev": true, 29 | "requires": { 30 | "@sinonjs/samsam": "2.1.0" 31 | }, 32 | "dependencies": { 33 | "@sinonjs/samsam": { 34 | "version": "2.1.0", 35 | "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.0.tgz", 36 | "integrity": "sha512-5x2kFgJYupaF1ns/RmharQ90lQkd2ELS8A9X0ymkAAdemYHGtI2KiUHG8nX2WU0T1qgnOU5YMqnBM2V7NUanNw==", 37 | "dev": true, 38 | "requires": { 39 | "array-from": "^2.1.1" 40 | } 41 | } 42 | } 43 | }, 44 | "@sinonjs/samsam": { 45 | "version": "2.1.2", 46 | "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.2.tgz", 47 | "integrity": "sha512-ZwTHAlC9akprWDinwEPD4kOuwaYZlyMwVJIANsKNC3QVp0AHB04m7RnB4eqeWfgmxw8MGTzS9uMaw93Z3QcZbw==", 48 | "dev": true 49 | }, 50 | "@sinonjs/text-encoding": { 51 | "version": "0.7.1", 52 | "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", 53 | "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", 54 | "dev": true 55 | }, 56 | "ajv": { 57 | "version": "6.5.5", 58 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", 59 | "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", 60 | "requires": { 61 | "fast-deep-equal": "^2.0.1", 62 | "fast-json-stable-stringify": "^2.0.0", 63 | "json-schema-traverse": "^0.4.1", 64 | "uri-js": "^4.2.2" 65 | } 66 | }, 67 | "archiver": { 68 | "version": "2.1.1", 69 | "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", 70 | "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", 71 | "requires": { 72 | "archiver-utils": "^1.3.0", 73 | "async": "^2.0.0", 74 | "buffer-crc32": "^0.2.1", 75 | "glob": "^7.0.0", 76 | "lodash": "^4.8.0", 77 | "readable-stream": "^2.0.0", 78 | "tar-stream": "^1.5.0", 79 | "zip-stream": "^1.2.0" 80 | } 81 | }, 82 | "archiver-utils": { 83 | "version": "1.3.0", 84 | "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", 85 | "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", 86 | "requires": { 87 | "glob": "^7.0.0", 88 | "graceful-fs": "^4.1.0", 89 | "lazystream": "^1.0.0", 90 | "lodash": "^4.8.0", 91 | "normalize-path": "^2.0.0", 92 | "readable-stream": "^2.0.0" 93 | } 94 | }, 95 | "array-from": { 96 | "version": "2.1.1", 97 | "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", 98 | "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", 99 | "dev": true 100 | }, 101 | "asn1": { 102 | "version": "0.2.4", 103 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 104 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 105 | "requires": { 106 | "safer-buffer": "~2.1.0" 107 | } 108 | }, 109 | "assert-plus": { 110 | "version": "1.0.0", 111 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 112 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 113 | }, 114 | "assertion-error": { 115 | "version": "1.0.2", 116 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", 117 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", 118 | "dev": true 119 | }, 120 | "async": { 121 | "version": "2.6.0", 122 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", 123 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", 124 | "requires": { 125 | "lodash": "^4.14.0" 126 | } 127 | }, 128 | "asynckit": { 129 | "version": "0.4.0", 130 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 131 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 132 | }, 133 | "aws-sign2": { 134 | "version": "0.7.0", 135 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 136 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 137 | }, 138 | "aws4": { 139 | "version": "1.8.0", 140 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 141 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 142 | }, 143 | "balanced-match": { 144 | "version": "1.0.0", 145 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 146 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 147 | }, 148 | "bcrypt-pbkdf": { 149 | "version": "1.0.2", 150 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 151 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 152 | "requires": { 153 | "tweetnacl": "^0.14.3" 154 | } 155 | }, 156 | "bl": { 157 | "version": "1.2.1", 158 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", 159 | "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", 160 | "requires": { 161 | "readable-stream": "^2.0.5" 162 | } 163 | }, 164 | "brace-expansion": { 165 | "version": "1.1.8", 166 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 167 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 168 | "requires": { 169 | "balanced-match": "^1.0.0", 170 | "concat-map": "0.0.1" 171 | } 172 | }, 173 | "browser-stdout": { 174 | "version": "1.3.1", 175 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 176 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 177 | "dev": true 178 | }, 179 | "buffer-crc32": { 180 | "version": "0.2.13", 181 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 182 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 183 | }, 184 | "caseless": { 185 | "version": "0.12.0", 186 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 187 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 188 | }, 189 | "chai": { 190 | "version": "4.1.2", 191 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", 192 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", 193 | "dev": true, 194 | "requires": { 195 | "assertion-error": "^1.0.1", 196 | "check-error": "^1.0.1", 197 | "deep-eql": "^3.0.0", 198 | "get-func-name": "^2.0.0", 199 | "pathval": "^1.0.0", 200 | "type-detect": "^4.0.0" 201 | } 202 | }, 203 | "check-error": { 204 | "version": "1.0.2", 205 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 206 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 207 | "dev": true 208 | }, 209 | "combined-stream": { 210 | "version": "1.0.7", 211 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 212 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 213 | "requires": { 214 | "delayed-stream": "~1.0.0" 215 | } 216 | }, 217 | "commander": { 218 | "version": "2.15.1", 219 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 220 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 221 | "dev": true 222 | }, 223 | "compress-commons": { 224 | "version": "1.2.0", 225 | "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", 226 | "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", 227 | "requires": { 228 | "buffer-crc32": "^0.2.1", 229 | "crc32-stream": "^2.0.0", 230 | "normalize-path": "^2.0.0", 231 | "readable-stream": "^2.0.0" 232 | } 233 | }, 234 | "concat-map": { 235 | "version": "0.0.1", 236 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 237 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 238 | }, 239 | "core-util-is": { 240 | "version": "1.0.2", 241 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 242 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 243 | }, 244 | "crc": { 245 | "version": "3.4.4", 246 | "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", 247 | "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" 248 | }, 249 | "crc32-stream": { 250 | "version": "2.0.0", 251 | "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", 252 | "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", 253 | "requires": { 254 | "crc": "^3.4.4", 255 | "readable-stream": "^2.0.0" 256 | } 257 | }, 258 | "dashdash": { 259 | "version": "1.14.1", 260 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 261 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 262 | "requires": { 263 | "assert-plus": "^1.0.0" 264 | } 265 | }, 266 | "debug": { 267 | "version": "3.1.0", 268 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 269 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 270 | "dev": true, 271 | "requires": { 272 | "ms": "2.0.0" 273 | } 274 | }, 275 | "deep-eql": { 276 | "version": "3.0.1", 277 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 278 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 279 | "dev": true, 280 | "requires": { 281 | "type-detect": "^4.0.0" 282 | } 283 | }, 284 | "delayed-stream": { 285 | "version": "1.0.0", 286 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 287 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 288 | }, 289 | "diff": { 290 | "version": "3.5.0", 291 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 292 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 293 | "dev": true 294 | }, 295 | "ecc-jsbn": { 296 | "version": "0.1.2", 297 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 298 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 299 | "requires": { 300 | "jsbn": "~0.1.0", 301 | "safer-buffer": "^2.1.0" 302 | } 303 | }, 304 | "end-of-stream": { 305 | "version": "1.4.1", 306 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 307 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 308 | "requires": { 309 | "once": "^1.4.0" 310 | } 311 | }, 312 | "escape-string-regexp": { 313 | "version": "1.0.5", 314 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 315 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 316 | "dev": true 317 | }, 318 | "extend": { 319 | "version": "3.0.2", 320 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 321 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 322 | }, 323 | "extsprintf": { 324 | "version": "1.3.0", 325 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 326 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 327 | }, 328 | "fast-deep-equal": { 329 | "version": "2.0.1", 330 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 331 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 332 | }, 333 | "fast-json-stable-stringify": { 334 | "version": "2.0.0", 335 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 336 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 337 | }, 338 | "forever-agent": { 339 | "version": "0.6.1", 340 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 341 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 342 | }, 343 | "form-data": { 344 | "version": "2.3.3", 345 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 346 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 347 | "requires": { 348 | "asynckit": "^0.4.0", 349 | "combined-stream": "^1.0.6", 350 | "mime-types": "^2.1.12" 351 | } 352 | }, 353 | "fs.realpath": { 354 | "version": "1.0.0", 355 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 356 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 357 | }, 358 | "get-func-name": { 359 | "version": "2.0.0", 360 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 361 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 362 | "dev": true 363 | }, 364 | "getpass": { 365 | "version": "0.1.7", 366 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 367 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 368 | "requires": { 369 | "assert-plus": "^1.0.0" 370 | } 371 | }, 372 | "glob": { 373 | "version": "7.1.2", 374 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 375 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 376 | "requires": { 377 | "fs.realpath": "^1.0.0", 378 | "inflight": "^1.0.4", 379 | "inherits": "2", 380 | "minimatch": "^3.0.4", 381 | "once": "^1.3.0", 382 | "path-is-absolute": "^1.0.0" 383 | } 384 | }, 385 | "graceful-fs": { 386 | "version": "4.1.11", 387 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 388 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 389 | }, 390 | "growl": { 391 | "version": "1.10.5", 392 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 393 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 394 | "dev": true 395 | }, 396 | "har-schema": { 397 | "version": "2.0.0", 398 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 399 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 400 | }, 401 | "har-validator": { 402 | "version": "5.1.3", 403 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 404 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 405 | "requires": { 406 | "ajv": "^6.5.5", 407 | "har-schema": "^2.0.0" 408 | } 409 | }, 410 | "has-flag": { 411 | "version": "3.0.0", 412 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 413 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 414 | "dev": true 415 | }, 416 | "he": { 417 | "version": "1.1.1", 418 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 419 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 420 | "dev": true 421 | }, 422 | "http-signature": { 423 | "version": "1.2.0", 424 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 425 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 426 | "requires": { 427 | "assert-plus": "^1.0.0", 428 | "jsprim": "^1.2.2", 429 | "sshpk": "^1.7.0" 430 | } 431 | }, 432 | "inflight": { 433 | "version": "1.0.6", 434 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 435 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 436 | "requires": { 437 | "once": "^1.3.0", 438 | "wrappy": "1" 439 | } 440 | }, 441 | "inherits": { 442 | "version": "2.0.3", 443 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 444 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 445 | }, 446 | "is-extglob": { 447 | "version": "2.1.1", 448 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 449 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 450 | }, 451 | "is-glob": { 452 | "version": "4.0.0", 453 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", 454 | "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", 455 | "requires": { 456 | "is-extglob": "^2.1.1" 457 | } 458 | }, 459 | "is-typedarray": { 460 | "version": "1.0.0", 461 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 462 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 463 | }, 464 | "isarray": { 465 | "version": "1.0.0", 466 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 467 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 468 | }, 469 | "isstream": { 470 | "version": "0.1.2", 471 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 472 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 473 | }, 474 | "jsbn": { 475 | "version": "0.1.1", 476 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 477 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 478 | }, 479 | "json-schema": { 480 | "version": "0.2.3", 481 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 482 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 483 | }, 484 | "json-schema-traverse": { 485 | "version": "0.4.1", 486 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 487 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 488 | }, 489 | "json-stringify-safe": { 490 | "version": "5.0.1", 491 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 492 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 493 | }, 494 | "jsprim": { 495 | "version": "1.4.1", 496 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 497 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 498 | "requires": { 499 | "assert-plus": "1.0.0", 500 | "extsprintf": "1.3.0", 501 | "json-schema": "0.2.3", 502 | "verror": "1.10.0" 503 | } 504 | }, 505 | "just-extend": { 506 | "version": "4.0.2", 507 | "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", 508 | "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", 509 | "dev": true 510 | }, 511 | "lazystream": { 512 | "version": "1.0.0", 513 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", 514 | "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", 515 | "requires": { 516 | "readable-stream": "^2.0.5" 517 | } 518 | }, 519 | "lodash": { 520 | "version": "4.17.14", 521 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", 522 | "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" 523 | }, 524 | "lodash.get": { 525 | "version": "4.4.2", 526 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 527 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", 528 | "dev": true 529 | }, 530 | "lolex": { 531 | "version": "3.0.0", 532 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz", 533 | "integrity": "sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ==", 534 | "dev": true 535 | }, 536 | "mime-db": { 537 | "version": "1.37.0", 538 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 539 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 540 | }, 541 | "mime-types": { 542 | "version": "2.1.21", 543 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 544 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 545 | "requires": { 546 | "mime-db": "~1.37.0" 547 | } 548 | }, 549 | "minimatch": { 550 | "version": "3.0.4", 551 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 552 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 553 | "requires": { 554 | "brace-expansion": "^1.1.7" 555 | } 556 | }, 557 | "minimist": { 558 | "version": "0.0.8", 559 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 560 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 561 | "dev": true 562 | }, 563 | "mkdirp": { 564 | "version": "0.5.1", 565 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 566 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 567 | "dev": true, 568 | "requires": { 569 | "minimist": "0.0.8" 570 | } 571 | }, 572 | "mocha": { 573 | "version": "5.2.0", 574 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 575 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 576 | "dev": true, 577 | "requires": { 578 | "browser-stdout": "1.3.1", 579 | "commander": "2.15.1", 580 | "debug": "3.1.0", 581 | "diff": "3.5.0", 582 | "escape-string-regexp": "1.0.5", 583 | "glob": "7.1.2", 584 | "growl": "1.10.5", 585 | "he": "1.1.1", 586 | "minimatch": "3.0.4", 587 | "mkdirp": "0.5.1", 588 | "supports-color": "5.4.0" 589 | } 590 | }, 591 | "mocha-teamcity-reporter": { 592 | "version": "2.5.1", 593 | "resolved": "https://registry.npmjs.org/mocha-teamcity-reporter/-/mocha-teamcity-reporter-2.5.1.tgz", 594 | "integrity": "sha512-5TujBiEii+CupwwangLyidegwuUTOQR1TPWWG2RrYk17kVUlhd50D5oZlS/3MshGmTxqW7TCHuytOBeTs2gPRg==", 595 | "dev": true, 596 | "requires": { 597 | "mocha": ">=3.5.0" 598 | } 599 | }, 600 | "ms": { 601 | "version": "2.0.0", 602 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 603 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 604 | "dev": true 605 | }, 606 | "nise": { 607 | "version": "1.4.10", 608 | "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz", 609 | "integrity": "sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA==", 610 | "dev": true, 611 | "requires": { 612 | "@sinonjs/formatio": "^3.1.0", 613 | "@sinonjs/text-encoding": "^0.7.1", 614 | "just-extend": "^4.0.2", 615 | "lolex": "^2.3.2", 616 | "path-to-regexp": "^1.7.0" 617 | }, 618 | "dependencies": { 619 | "@sinonjs/formatio": { 620 | "version": "3.2.1", 621 | "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", 622 | "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", 623 | "dev": true, 624 | "requires": { 625 | "@sinonjs/commons": "^1", 626 | "@sinonjs/samsam": "^3.1.0" 627 | } 628 | }, 629 | "@sinonjs/samsam": { 630 | "version": "3.3.1", 631 | "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.1.tgz", 632 | "integrity": "sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw==", 633 | "dev": true, 634 | "requires": { 635 | "@sinonjs/commons": "^1.0.2", 636 | "array-from": "^2.1.1", 637 | "lodash": "^4.17.11" 638 | } 639 | }, 640 | "lolex": { 641 | "version": "2.7.5", 642 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", 643 | "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", 644 | "dev": true 645 | } 646 | } 647 | }, 648 | "normalize-path": { 649 | "version": "2.1.1", 650 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 651 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 652 | "requires": { 653 | "remove-trailing-separator": "^1.0.1" 654 | } 655 | }, 656 | "oauth-sign": { 657 | "version": "0.9.0", 658 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 659 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 660 | }, 661 | "once": { 662 | "version": "1.4.0", 663 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 664 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 665 | "requires": { 666 | "wrappy": "1" 667 | } 668 | }, 669 | "path-is-absolute": { 670 | "version": "1.0.1", 671 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 672 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 673 | }, 674 | "path-to-regexp": { 675 | "version": "1.7.0", 676 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", 677 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", 678 | "dev": true, 679 | "requires": { 680 | "isarray": "0.0.1" 681 | }, 682 | "dependencies": { 683 | "isarray": { 684 | "version": "0.0.1", 685 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 686 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 687 | "dev": true 688 | } 689 | } 690 | }, 691 | "pathval": { 692 | "version": "1.1.0", 693 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 694 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 695 | "dev": true 696 | }, 697 | "performance-now": { 698 | "version": "2.1.0", 699 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 700 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 701 | }, 702 | "process-nextick-args": { 703 | "version": "1.0.7", 704 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 705 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 706 | }, 707 | "psl": { 708 | "version": "1.1.29", 709 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 710 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" 711 | }, 712 | "punycode": { 713 | "version": "2.1.1", 714 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 715 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 716 | }, 717 | "qs": { 718 | "version": "6.5.2", 719 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 720 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 721 | }, 722 | "readable-stream": { 723 | "version": "2.3.3", 724 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 725 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 726 | "requires": { 727 | "core-util-is": "~1.0.0", 728 | "inherits": "~2.0.3", 729 | "isarray": "~1.0.0", 730 | "process-nextick-args": "~1.0.6", 731 | "safe-buffer": "~5.1.1", 732 | "string_decoder": "~1.0.3", 733 | "util-deprecate": "~1.0.1" 734 | } 735 | }, 736 | "remove-trailing-separator": { 737 | "version": "1.1.0", 738 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 739 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 740 | }, 741 | "request": { 742 | "version": "2.88.0", 743 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 744 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 745 | "requires": { 746 | "aws-sign2": "~0.7.0", 747 | "aws4": "^1.8.0", 748 | "caseless": "~0.12.0", 749 | "combined-stream": "~1.0.6", 750 | "extend": "~3.0.2", 751 | "forever-agent": "~0.6.1", 752 | "form-data": "~2.3.2", 753 | "har-validator": "~5.1.0", 754 | "http-signature": "~1.2.0", 755 | "is-typedarray": "~1.0.0", 756 | "isstream": "~0.1.2", 757 | "json-stringify-safe": "~5.0.1", 758 | "mime-types": "~2.1.19", 759 | "oauth-sign": "~0.9.0", 760 | "performance-now": "^2.1.0", 761 | "qs": "~6.5.2", 762 | "safe-buffer": "^5.1.2", 763 | "tough-cookie": "~2.4.3", 764 | "tunnel-agent": "^0.6.0", 765 | "uuid": "^3.3.2" 766 | }, 767 | "dependencies": { 768 | "safe-buffer": { 769 | "version": "5.1.2", 770 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 771 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 772 | } 773 | } 774 | }, 775 | "safe-buffer": { 776 | "version": "5.1.1", 777 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 778 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 779 | }, 780 | "safer-buffer": { 781 | "version": "2.1.2", 782 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 783 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 784 | }, 785 | "sinon": { 786 | "version": "7.1.1", 787 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.1.1.tgz", 788 | "integrity": "sha512-iYagtjLVt1vN3zZY7D8oH7dkjNJEjLjyuzy8daX5+3bbQl8gaohrheB9VfH1O3L6LKuue5WTJvFluHiuZ9y3nQ==", 789 | "dev": true, 790 | "requires": { 791 | "@sinonjs/commons": "^1.2.0", 792 | "@sinonjs/formatio": "^3.0.0", 793 | "@sinonjs/samsam": "^2.1.2", 794 | "diff": "^3.5.0", 795 | "lodash.get": "^4.4.2", 796 | "lolex": "^3.0.0", 797 | "nise": "^1.4.6", 798 | "supports-color": "^5.5.0", 799 | "type-detect": "^4.0.8" 800 | }, 801 | "dependencies": { 802 | "supports-color": { 803 | "version": "5.5.0", 804 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 805 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 806 | "dev": true, 807 | "requires": { 808 | "has-flag": "^3.0.0" 809 | } 810 | }, 811 | "type-detect": { 812 | "version": "4.0.8", 813 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 814 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 815 | "dev": true 816 | } 817 | } 818 | }, 819 | "sshpk": { 820 | "version": "1.15.2", 821 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", 822 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", 823 | "requires": { 824 | "asn1": "~0.2.3", 825 | "assert-plus": "^1.0.0", 826 | "bcrypt-pbkdf": "^1.0.0", 827 | "dashdash": "^1.12.0", 828 | "ecc-jsbn": "~0.1.1", 829 | "getpass": "^0.1.1", 830 | "jsbn": "~0.1.0", 831 | "safer-buffer": "^2.0.2", 832 | "tweetnacl": "~0.14.0" 833 | } 834 | }, 835 | "stream-to": { 836 | "version": "0.2.2", 837 | "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", 838 | "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=" 839 | }, 840 | "stream-to-buffer": { 841 | "version": "0.1.0", 842 | "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", 843 | "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", 844 | "requires": { 845 | "stream-to": "~0.2.0" 846 | } 847 | }, 848 | "string_decoder": { 849 | "version": "1.0.3", 850 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 851 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 852 | "requires": { 853 | "safe-buffer": "~5.1.0" 854 | } 855 | }, 856 | "supports-color": { 857 | "version": "5.4.0", 858 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 859 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 860 | "dev": true, 861 | "requires": { 862 | "has-flag": "^3.0.0" 863 | } 864 | }, 865 | "tar-stream": { 866 | "version": "1.5.5", 867 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", 868 | "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", 869 | "requires": { 870 | "bl": "^1.0.0", 871 | "end-of-stream": "^1.0.0", 872 | "readable-stream": "^2.0.0", 873 | "xtend": "^4.0.0" 874 | } 875 | }, 876 | "tough-cookie": { 877 | "version": "2.4.3", 878 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 879 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 880 | "requires": { 881 | "psl": "^1.1.24", 882 | "punycode": "^1.4.1" 883 | }, 884 | "dependencies": { 885 | "punycode": { 886 | "version": "1.4.1", 887 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 888 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 889 | } 890 | } 891 | }, 892 | "tunnel-agent": { 893 | "version": "0.6.0", 894 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 895 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 896 | "requires": { 897 | "safe-buffer": "^5.0.1" 898 | } 899 | }, 900 | "tweetnacl": { 901 | "version": "0.14.5", 902 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 903 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 904 | }, 905 | "type-detect": { 906 | "version": "4.0.3", 907 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", 908 | "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", 909 | "dev": true 910 | }, 911 | "uri-js": { 912 | "version": "4.2.2", 913 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 914 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 915 | "requires": { 916 | "punycode": "^2.1.0" 917 | } 918 | }, 919 | "util-deprecate": { 920 | "version": "1.0.2", 921 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 922 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 923 | }, 924 | "uuid": { 925 | "version": "3.3.2", 926 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 927 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 928 | }, 929 | "verror": { 930 | "version": "1.10.0", 931 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 932 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 933 | "requires": { 934 | "assert-plus": "^1.0.0", 935 | "core-util-is": "1.0.2", 936 | "extsprintf": "^1.2.0" 937 | } 938 | }, 939 | "wrappy": { 940 | "version": "1.0.2", 941 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 942 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 943 | }, 944 | "xml-writer": { 945 | "version": "1.7.0", 946 | "resolved": "https://registry.npmjs.org/xml-writer/-/xml-writer-1.7.0.tgz", 947 | "integrity": "sha1-t28dWRwWomNOvbcDx729D9aBkGU=" 948 | }, 949 | "xtend": { 950 | "version": "4.0.1", 951 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 952 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 953 | }, 954 | "zip-stream": { 955 | "version": "1.2.0", 956 | "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", 957 | "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", 958 | "requires": { 959 | "archiver-utils": "^1.3.0", 960 | "compress-commons": "^1.2.0", 961 | "lodash": "^4.8.0", 962 | "readable-stream": "^2.0.0" 963 | } 964 | } 965 | } 966 | } 967 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@octopusdeploy/octopackjs", 3 | "version": "0.2.4", 4 | "description": "A nodejs tool for packaging and pushing projects to an Octopus Deploy instance.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "\"\"node_modules/.bin/mocha\"\" -R spec", 8 | "test-teamcity": "\"\"node_modules/.bin/mocha\"\" -R spec --reporter mocha-teamcity-reporter", 9 | "version-teamcity": "node -e \"console.log('##teamcity[buildNumber \\''+ require('./package.json').version +'\\']')\"" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git://github.com/OctopusDeploy/octopackjs" 14 | }, 15 | "keywords": [ 16 | "octopus", 17 | "deploy", 18 | "octo", 19 | "package" 20 | ], 21 | "author": "Octopus Deploy (http://octopus.com/)", 22 | "license": "Apache-2.0", 23 | "devDependencies": { 24 | "chai": "^4.1.0", 25 | "mocha": "^5.2.0", 26 | "mocha-teamcity-reporter": "^2.5.1", 27 | "sinon": "^7.1.1" 28 | }, 29 | "dependencies": { 30 | "archiver": "^2.1.1", 31 | "archiver-utils": "^1.0.0", 32 | "is-glob": "^4.0.0", 33 | "lodash": "^4.17.14", 34 | "request": "^2.88.0", 35 | "stream-to-buffer": "^0.1.0", 36 | "xml-writer": "^1.6.0", 37 | "zip-stream": "^1.2.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var octo = require('./index'); 4 | var fs = require('fs'); 5 | var expect = require('chai').expect; 6 | var sinon = require('sinon'); 7 | var request = require('request'); 8 | 9 | describe('push', function() { 10 | var postStub; 11 | 12 | beforeEach(function(){ 13 | postStub = sinon.stub(request, 'post'); 14 | }); 15 | 16 | afterEach(function(){ 17 | postStub.restore(); 18 | }); 19 | 20 | it('should pass pkg stream', function() { 21 | octo.push(Buffer.from('hello world'), { 22 | apikey: 'KEY', 23 | host: 'http://localhost', 24 | name: 'package.tar' 25 | }); 26 | 27 | var req = postStub.firstCall.args[0]; 28 | expect(req.headers['X-Octopus-ApiKey']).to.equal('KEY'); 29 | expect(req.formData.file.value.toString()).to.equal('hello world'); 30 | expect(req.formData.file.options.filename).to.equal('package.tar'); 31 | }); 32 | 33 | describe('build url', function () { 34 | it('should include `replace` parameter if it is provided', function () { 35 | octo.push(Buffer.from('hello world'), { replace: true, host: 'http://myweb/', name: 'package.tar' }); 36 | var req = postStub.lastCall.args[0]; 37 | expect(req.url).to.equal('http://myweb/api/packages/raw?replace=true'); 38 | }); 39 | 40 | it('should include spaceid in url', function () { 41 | octo.push(Buffer.from('hello world'), {host: 'http://myweb', spaceId: 'Spaces-1', name: 'package.tar'}); 42 | var req = postStub.lastCall.args[0]; 43 | expect(req.url).to.equal('http://myweb/api/Spaces-1/packages/raw'); 44 | }); 45 | 46 | it('should build correct url regardless of trailing slash', function () { 47 | testUrl('http://myweb', 'http://myweb/api/packages/raw'); 48 | testUrl('http://myweb/', 'http://myweb/api/packages/raw'); 49 | }); 50 | 51 | it('should build correct url with port', function () { 52 | testUrl('http://myweb:3000/', 'http://myweb:3000/api/packages/raw'); 53 | }); 54 | 55 | it('should build correct url with relative path', function () { 56 | testUrl('http://myweb/path/to/octopus', 'http://myweb/path/to/octopus/api/packages/raw'); 57 | }); 58 | 59 | function testUrl(host, expected) { 60 | octo.push(Buffer.from('hello world'), { host: host, name: 'package.tar' }); 61 | var req = postStub.lastCall.args[0]; 62 | expect(req.url).to.equal(expected); 63 | } 64 | }); 65 | 66 | it('should return response body if request successful', function(done) { 67 | var body = { prop: 12 }; 68 | 69 | octo.push(Buffer.from('hello world'), { 70 | apikey: 'KEY', 71 | replace: true, 72 | host: 'http://localhost', 73 | name: 'package.tar', 74 | }, function(err, result) { 75 | expect(err).to.be.null; 76 | expect(result).to.eql(body); 77 | done(); 78 | }); 79 | 80 | var callback = postStub.firstCall.args[1]; 81 | callback(null, {statusCode: 200}, body); 82 | }); 83 | }); 84 | 85 | describe('pack', function() { 86 | 87 | it('can create a stream', function (done) { 88 | octo.pack() 89 | .append('buffer files/hello.txt', Buffer.from('hello world'), {date: new Date(2011, 11, 11)}) 90 | .append('stream.txt', fs.createReadStream('./package.json')) 91 | .append('lib/pack.js') 92 | .toStream(function (err, data) { 93 | expect(err).to.be.null; 94 | expect(data.stream.readable).to.be.true; 95 | done(); 96 | }); 97 | }); 98 | 99 | it('can create a file', function (done) { 100 | octo.pack() 101 | .append('buffer files/hello.txt', Buffer.from('hello world'), {date: new Date(2011, 11, 11)}) 102 | .append('stream.txt', fs.createReadStream('./package.json')) 103 | .append('lib/pack.js') 104 | .toFile('./bin/', function (err, data) { 105 | expect(err).to.be.null; 106 | expect(data.size).to.be.above(0); 107 | expect(data.name).not.to.be.null; 108 | expect(data.path.indexOf('bin')).to.equal(0); 109 | 110 | fs.exists(data.path, function (exists) { 111 | expect(exists).to.be.true; 112 | done(); 113 | }); 114 | }); 115 | }); 116 | 117 | it('can add files with glob', function (done) { 118 | octo.pack() 119 | .append('lib/*.js') 120 | .toFile('./bin/', function (err, data) { 121 | expect(err).to.be.null; 122 | expect(data.size).to.be.above(0); 123 | expect(data.name).not.to.be.null; 124 | expect(data.path.indexOf('bin')).to.equal(0); 125 | 126 | fs.exists(data.path, function (exists) { 127 | expect(exists).to.be.true; 128 | done(); 129 | }); 130 | }); 131 | }); 132 | 133 | it('defaults to tar.gz', function (done) { 134 | octo.pack() 135 | .append('file.txt', Buffer.from('hello world')) 136 | .toStream(function (err, data) { 137 | expect(data.name).not.to.be.null; 138 | expect(data.name.indexOf('.tar.gz', data.name.length - 7)).to.not.equal(-1); 139 | done(); 140 | }); 141 | }); 142 | 143 | it('can create zip', function (done) { 144 | octo.pack('zip') 145 | .append('file.txt', Buffer.from('hello world')) 146 | .toStream(function (err, data) { 147 | expect(data.name).not.to.be.null; 148 | expect(data.name.indexOf('.zip', data.name.length - 4)).to.not.equal(-1); 149 | done(); 150 | }); 151 | }); 152 | 153 | it('can\'t create nupkg', function () { 154 | expect(function(){ octo.pack('nupkg'); }).to 155 | .throw('Currently unable to support .nupkg file. Please use .tar.gz or .zip'); 156 | }); 157 | 158 | it('can pass through custom id and version', function (done) { 159 | octo.pack({id: 'MYAPP', version: '4.2'}) 160 | .append('file.txt',Buffer.from('hello world')) 161 | .toStream(function (err, data) { 162 | expect(data.name).not.to.be.null; 163 | expect(data.name.indexOf('MYAPP.4.2.')).to.equal(0); 164 | done(); 165 | }); 166 | }); 167 | 168 | it('can add subdirectories', function (done) { 169 | octo.pack({id: 'test-subdir'}) 170 | .appendSubDir('lib/') 171 | .toFile('./bin/', function (err, data) { 172 | expect(err).to.be.null; 173 | expect(data.size).to.be.above(0); 174 | expect(data.name).not.to.be.null; 175 | expect(data.path.indexOf('bin')).to.equal(0); 176 | 177 | fs.exists(data.path, function (exists) { 178 | expect(exists).to.be.true; 179 | done(); 180 | }); 181 | }); 182 | }); 183 | 184 | it('can add subdirectory content to root of archive', function (done) { 185 | octo.pack({id: 'test-subdir-root'}) 186 | .appendSubDir('lib/', true) 187 | .toFile('./bin/', function (err, data) { 188 | expect(err).to.be.null; 189 | expect(data.size).to.be.above(0); 190 | expect(data.name).not.to.be.null; 191 | expect(data.path.indexOf('bin')).to.equal(0); 192 | 193 | fs.exists(data.path, function (exists) { 194 | expect(exists).to.be.true; 195 | done(); 196 | }); 197 | }); 198 | }); 199 | 200 | }); 201 | --------------------------------------------------------------------------------