Comparing version 0.0.9 to 0.1.0
{ | ||
"name": "grunt-s3", | ||
"description": "A grunt task to automate moving files to/from Amazon S3.", | ||
"version": "0.0.9", | ||
"version": "0.1.0", | ||
"author": "Aaron Forsander (https://github.com/pifantastic)", | ||
@@ -12,3 +12,3 @@ "homepage": "https://github.com/pifantastic/grunt-s3", | ||
"bugs": { | ||
"url" : "https://github.com/pifantastic/grunt-s3/issues" | ||
"url": "https://github.com/pifantastic/grunt-s3/issues" | ||
}, | ||
@@ -21,3 +21,3 @@ "licenses": [ | ||
], | ||
"main": "grunt.js", | ||
"main": "Gruntfile.js", | ||
"bin": "bin/grunt-s3", | ||
@@ -28,3 +28,3 @@ "scripts": { | ||
"engines": { | ||
"node": ">= 0.6.0" | ||
"node": ">= 0.8.0" | ||
}, | ||
@@ -37,5 +37,3 @@ "keywords": [ | ||
"dependencies": { | ||
"grunt": "~0.3.9", | ||
"async": "~0.1.18", | ||
"underscore": "~1.3.3", | ||
"grunt": "0.4.x", | ||
"underscore.deferred": "~0.1.4", | ||
@@ -46,4 +44,7 @@ "knox": "0.4.1", | ||
"devDependencies": { | ||
"nodeunit": "~0.7.4" | ||
"nodeunit": "~0.7.4", | ||
"grunt-contrib-jshint": "~0.1.0", | ||
"grunt-contrib-nodeunit": "~0.1.1", | ||
"libyaml": "~0.2.1" | ||
} | ||
} |
@@ -0,3 +1,4 @@ | ||
[![Build Status](https://secure.travis-ci.org/pifantastic/grunt-s3.png?branch=master)](https://travis-ci.org/pifantastic/grunt-s3) | ||
# Grunt + Amazon S3 | ||
# Grunt 0.4.x + Amazon S3 | ||
@@ -20,5 +21,12 @@ ## About | ||
1. `npm install grunt-s3` | ||
2. Add `grunt.loadNpmTasks('grunt-s3');` to your project's `grunt.js` file. | ||
```sh | ||
npm install grunt-s3 --save-dev | ||
``` | ||
Then add this line to your project's `Gruntfile.js`: | ||
```javascript | ||
grunt.loadNpmTasks('grunt-s3'); | ||
``` | ||
## Configuration | ||
@@ -29,2 +37,4 @@ | ||
* **bucket** - (*string*) An Amazon S3 bucket | ||
* **maxOperations** - (*number*) max number of concurrent transfers - if not specified or set to 0, will be unlimited. | ||
* **encodePaths** - (*boolean*) if set to true, will encode the uris of destinations to prevent 505 errors. Default: false | ||
* **headers** - (*object*) An object containing any headers you would like to send along with the | ||
@@ -41,2 +51,3 @@ transfers i.e. `{ 'X-Awesomeness': 'Out-Of-This-World', 'X-Stuff': 'And Things!' }` | ||
the above values may also be overriden. | ||
* **debug** - (*boolean*) If true, no transfers with S3 will occur, will print all actions for review by user | ||
@@ -172,3 +183,2 @@ ### Example | ||
### grunt.helper('s3.pull', src, dest, options) | ||
Download a file from s3. Returns a Promises/J-style Deferred object. | ||
@@ -228,2 +238,6 @@ | ||
#### v0.1.0 | ||
* Update to be compatible with `grunt` version `0.4.x`. | ||
#### v0.0.9 | ||
@@ -230,0 +244,0 @@ |
430
tasks/s3.js
@@ -10,3 +10,3 @@ /*jshint esnext:true*/ | ||
* Description: Move files to and from s3 | ||
* Dependencies: knox, async, underscore.deferred | ||
* Dependencies: knox, underscore.deferred | ||
* | ||
@@ -17,90 +17,13 @@ */ | ||
/** | ||
* Module dependencies. | ||
*/ | ||
// Core. | ||
const util = require('util'); | ||
const crypto = require('crypto'); | ||
const fs = require('fs'); | ||
const path = require('path'); | ||
const url = require('url'); | ||
const zlib = require('zlib'); | ||
const s3 = require('./lib/s3').init(grunt); | ||
// Npm. | ||
const knox = require('knox'); | ||
const mime = require('mime'); | ||
const async = require('async'); | ||
const _ = require('underscore'); | ||
const deferred = require('underscore.deferred'); | ||
_.mixin(deferred); | ||
const existsSync = ('existsSync' in fs) ? fs.existsSync : path.existsSync; | ||
/** | ||
* Grunt aliases. | ||
*/ | ||
var log = grunt.log; | ||
const _ = grunt.util._; | ||
const async = grunt.util.async; | ||
const log = grunt.log; | ||
/** | ||
* Success/error messages. | ||
*/ | ||
const MSG_UPLOAD_SUCCESS = '↗'.blue + ' Uploaded: %s (%s)'; | ||
const MSG_DOWNLOAD_SUCCESS = '↙'.yellow + ' Downloaded: %s (%s)'; | ||
const MSG_DELETE_SUCCESS = '✗'.red + ' Deleted: %s'; | ||
const MSG_COPY_SUCCESS = '→'.cyan + ' Copied: %s to %s'; | ||
const MSG_ERR_NOT_FOUND = '¯\\_(ツ)_/¯ File not found: %s'; | ||
const MSG_ERR_UPLOAD = 'Upload error: %s (%s)'; | ||
const MSG_ERR_DOWNLOAD = 'Download error: %s (%s)'; | ||
const MSG_ERR_DELETE = 'Delete error: %s (%s)'; | ||
const MSG_ERR_COPY = 'Copy error: %s to %s'; | ||
const MSG_ERR_CHECKSUM = 'Expected hash: %s but found %s for %s'; | ||
/** | ||
* Create an Error object based off of a formatted message. Arguments | ||
* are identical to those of util.format. | ||
* | ||
* @param {String} Format. | ||
* @param {...string|number} Values to insert into Format. | ||
* @returns {Error} | ||
*/ | ||
function makeError () { | ||
var msg = util.format.apply(util, _.toArray(arguments)); | ||
return new Error(msg); | ||
} | ||
/** | ||
* Get the grunt s3 configuration options, filling in options from | ||
* environment variables if present. Also supports grunt template strings. | ||
* | ||
* @returns {Object} The s3 configuration. | ||
*/ | ||
function getConfig () { | ||
var config = grunt.config('s3') || {}; | ||
// Look for and process grunt template stings | ||
var keys = ['key', 'secret', 'bucket']; | ||
keys.forEach(function(key) { | ||
if (config.hasOwnProperty(key)) { | ||
config[key] = grunt.template.process(config[key]); | ||
} | ||
}); | ||
return _.defaults(config, { | ||
key : process.env.AWS_ACCESS_KEY_ID, | ||
secret : process.env.AWS_SECRET_ACCESS_KEY | ||
}); | ||
} | ||
/** | ||
* Clone an object. | ||
* | ||
* @returns {Object} A clone of the original object. | ||
*/ | ||
function clone (obj) { | ||
return JSON.parse(JSON.stringify(obj)); | ||
} | ||
/** | ||
* Transfer files to/from s3. | ||
@@ -112,3 +35,3 @@ * | ||
var done = this.async(); | ||
var config = _.defaults(getConfig(), { | ||
var config = _.defaults(s3.getConfig(), { | ||
upload: [], | ||
@@ -122,5 +45,11 @@ download: [], | ||
if (config.debug) { | ||
log.writeln("Running in debug mode, no transfers will be made".yellow); | ||
log.writeln(); | ||
} | ||
config.upload.forEach(function(upload) { | ||
// Expand list of files to upload. | ||
var files = grunt.file.expandFiles(upload.src); | ||
var files = grunt.file.expand({ filter: "isFile" }, upload.src), | ||
destPath = grunt.template.process(upload.dest); | ||
@@ -134,7 +63,17 @@ files.forEach(function(file) { | ||
// the destination. | ||
var dest = (files.length === 1 && file === upload.src) ? | ||
upload.dest : | ||
path.join(upload.dest, path.basename(file)); | ||
var dest; | ||
if (files.length === 1 && file === upload.src) { | ||
dest = destPath; | ||
} | ||
else { | ||
if (upload.rel) { | ||
dest = path.join(destPath, path.relative(grunt.file.expand({ filter: "isDirectory" }, upload.rel)[0], file)); | ||
} | ||
else { | ||
dest = path.join(destPath, path.basename(file)); | ||
} | ||
} | ||
if(config.encodePaths === true) dest = encodeURIComponent(dest) | ||
transfers.push(grunt.helper('s3.put', file, dest, upload)); | ||
transfers.push(s3.upload.bind(s3,file, dest, upload)); | ||
}); | ||
@@ -144,313 +83,38 @@ }); | ||
config.download.forEach(function(download) { | ||
transfers.push(grunt.helper('s3.pull', download.src, download.dest, download)); | ||
transfers.push(s3.download.bind(s3,download.src, download.dest, download)); | ||
}); | ||
config.del.forEach(function(del) { | ||
transfers.push(grunt.helper('s3.delete', del.src, del)); | ||
transfers.push(s3.del.bind(s3,del.src, del)); | ||
}); | ||
config.copy.forEach(function(copy) { | ||
transfers.push(grunt.helper('s3.copy', copy.src, copy.dest, copy)); | ||
transfers.push(s3.copy.bind(s3,copy.src, copy.dest, copy)); | ||
}); | ||
var total = transfers.length; | ||
var errors = 0; | ||
// Keep a running total of errors/completions as the transfers complete. | ||
transfers.forEach(function(transfer) { | ||
var eachTransfer = config.maxOperations > 0 | ||
? async.forEachLimit.bind(async,transfers,config.maxOperations) | ||
: async.forEach.bind(async,transfers) | ||
eachTransfer(function(transferFn,completed){ | ||
var transfer = transferFn() | ||
transfer.done(function(msg) { | ||
log.ok(msg); | ||
}); | ||
completed() | ||
}) | ||
transfer.fail(function(msg) { | ||
log.error(msg); | ||
++errors; | ||
}); | ||
transfer.always(function() { | ||
// If this was the last transfer to complete, we're all done. | ||
if (--total === 0) { | ||
done(!errors); | ||
} | ||
}); | ||
}); | ||
completed() | ||
}) | ||
},function(){ | ||
// we're all done. | ||
done(!errors); | ||
}) | ||
}); | ||
/** | ||
* Publishes the local file at src to the s3 dest. | ||
* | ||
* Verifies that the upload was successful by comparing an md5 checksum of | ||
* the local and remote versions. | ||
* | ||
* @param {String} src The local path to the file to upload. | ||
* @param {String} dest The s3 path, relative to the bucket, to which the src | ||
* is uploaded. | ||
* @param {Object} [options] An object containing options which override any | ||
* option declared in the global s3 config. | ||
*/ | ||
grunt.registerHelper('s3.put', function (src, dest, opts) { | ||
var dfd = new _.Deferred(); | ||
var options = clone(opts || {}); | ||
// Make sure the local file exists. | ||
if (!existsSync(src)) { | ||
return dfd.reject(makeError(MSG_ERR_NOT_FOUND, src)); | ||
} | ||
var config = _.defaults(options || {}, getConfig()); | ||
var headers = options.headers || {}; | ||
if (options.access) { | ||
headers['x-amz-acl'] = options.access; | ||
} | ||
// Pick out the configuration options we need for the client. | ||
var client = knox.createClient(_(config).pick([ | ||
'endpoint', 'port', 'key', 'secret', 'access', 'bucket' | ||
])); | ||
// Encapsulate this logic to make it easier to gzip the file first if | ||
// necesssary. | ||
function upload(cb) { | ||
cb = cb || function () {}; | ||
// Upload the file to s3. | ||
client.putFile(src, dest, headers, function (err, res) { | ||
// If there was an upload error or any status other than a 200, we | ||
// can assume something went wrong. | ||
if (err || res.statusCode !== 200) { | ||
cb(makeError(MSG_ERR_UPLOAD, src, err || res.statusCode)); | ||
} | ||
else { | ||
// Read the local file so we can get its md5 hash. | ||
fs.readFile(src, function (err, data) { | ||
if (err) { | ||
cb(makeError(MSG_ERR_UPLOAD, src, err)); | ||
} | ||
else { | ||
// The etag head in the response from s3 has double quotes around | ||
// it. Strip them out. | ||
var remoteHash = res.headers.etag.replace(/"/g, ''); | ||
// Get an md5 of the local file so we can verify the upload. | ||
var localHash = crypto.createHash('md5').update(data).digest('hex'); | ||
if (remoteHash === localHash) { | ||
var msg = util.format(MSG_UPLOAD_SUCCESS, src, localHash); | ||
cb(null, msg); | ||
} | ||
else { | ||
cb(makeError(MSG_ERR_CHECKSUM, localHash, remoteHash, src)); | ||
} | ||
} | ||
}); | ||
} | ||
}); | ||
} | ||
// If gzip is enabled, gzip the file into a temp file and then perform the | ||
// upload. | ||
if (options.gzip) { | ||
headers['Content-Encoding'] = 'gzip'; | ||
headers['Content-Type'] = mime.lookup(src); | ||
var charset = mime.charsets.lookup(headers['Content-Type'], null); | ||
if (charset) { | ||
headers['Content-Type'] += '; charset=' + charset; | ||
} | ||
// Determine a unique temp file name. | ||
var tmp = src + '.gz'; | ||
var incr = 0; | ||
while (existsSync(tmp)) { | ||
tmp = src + '.' + (incr++) + '.gz'; | ||
} | ||
var input = fs.createReadStream(src); | ||
var output = fs.createWriteStream(tmp); | ||
// Gzip the file and upload when done. | ||
input.pipe(zlib.createGzip()).pipe(output) | ||
.on('error', function (err) { | ||
dfd.reject(makeError(MSG_ERR_UPLOAD, src, err)); | ||
}) | ||
.on('close', function () { | ||
// Update the src to point to the newly created .gz file. | ||
src = tmp; | ||
upload(function (err, msg) { | ||
// Clean up the temp file. | ||
fs.unlinkSync(tmp); | ||
if (err) { | ||
dfd.reject(err); | ||
} | ||
else { | ||
dfd.resolve(msg); | ||
} | ||
}); | ||
}); | ||
} | ||
else { | ||
// No need to gzip so go ahead and upload the file. | ||
upload(function (err, msg) { | ||
if (err) { | ||
dfd.reject(err); | ||
} | ||
else { | ||
dfd.resolve(msg); | ||
} | ||
}); | ||
} | ||
return dfd; | ||
}); | ||
/** | ||
* Download a file from s3. | ||
* | ||
* Verifies that the download was successful by downloading the file and | ||
* comparing an md5 checksum of the local and remote versions. | ||
* | ||
* @param {String} src The s3 path, relative to the bucket, of the file being | ||
* downloaded. | ||
* @param {String} dest The local path where the download will be saved. | ||
* @param {Object} [options] An object containing options which override any | ||
* option declared in the global s3 config. | ||
*/ | ||
grunt.registerHelper('s3.pull', function (src, dest, opts) { | ||
var dfd = new _.Deferred(); | ||
var options = clone(opts); | ||
var config = _.defaults(options || {}, getConfig()); | ||
// Create a local stream we can write the downloaded file to. | ||
var file = fs.createWriteStream(dest); | ||
// Pick out the configuration options we need for the client. | ||
var client = knox.createClient(_(config).pick([ | ||
'endpoint', 'port', 'key', 'secret', 'access', 'bucket' | ||
])); | ||
// Upload the file to s3. | ||
client.getFile(src, function (err, res) { | ||
// If there was an upload error or any status other than a 200, we | ||
// can assume something went wrong. | ||
if (err || res.statusCode !== 200) { | ||
return dfd.reject(makeError(MSG_ERR_DOWNLOAD, src, err || res.statusCode)); | ||
} | ||
res | ||
.on('data', function (chunk) { | ||
file.write(chunk); | ||
}) | ||
.on('error', function (err) { | ||
return dfd.reject(makeError(MSG_ERR_DOWNLOAD, src, err)); | ||
}) | ||
.on('end', function () { | ||
file.end(); | ||
// Read the local file so we can get its md5 hash. | ||
fs.readFile(dest, function (err, data) { | ||
if (err) { | ||
return dfd.reject(makeError(MSG_ERR_DOWNLOAD, src, err)); | ||
} | ||
else { | ||
// The etag head in the response from s3 has double quotes around | ||
// it. Strip them out. | ||
var remoteHash = res.headers.etag.replace(/"/g, ''); | ||
// Get an md5 of the local file so we can verify the download. | ||
var localHash = crypto.createHash('md5').update(data).digest('hex'); | ||
if (remoteHash === localHash) { | ||
var msg = util.format(MSG_DOWNLOAD_SUCCESS, src, localHash); | ||
dfd.resolve(msg); | ||
} | ||
else { | ||
dfd.reject(makeError(MSG_ERR_CHECKSUM, localHash, remoteHash, src)); | ||
} | ||
} | ||
}); | ||
}); | ||
}); | ||
return dfd; | ||
}); | ||
/** | ||
* Copy a file from s3 to s3. | ||
* | ||
* @param {String} src The s3 path, including the bucket, to the file to | ||
* copy. | ||
* @param {String} dest The s3 path, relative to the bucket, to the file to | ||
* create. | ||
* @param {Object} [options] An object containing options which override any | ||
* option declared in the global s3 config. | ||
*/ | ||
grunt.registerHelper('s3.copy', function (src, dest, opts) { | ||
var dfd = new _.Deferred(); | ||
var options = clone(opts); | ||
var config = _.defaults(options || {}, getConfig()); | ||
// Pick out the configuration options we need for the client. | ||
var client = knox.createClient(_(config).pick([ | ||
'endpoint', 'port', 'key', 'secret', 'access', 'bucket' | ||
])); | ||
var headers = { | ||
'Content-Length': 0, | ||
'x-amz-copy-source' : src | ||
}; | ||
if (options.headers) { | ||
_(headers).extend(options.headers); | ||
headers['x-amz-metadata-directive'] = 'REPLACE'; | ||
} | ||
// Copy the src file to dest. | ||
var req = client.put(dest, headers); | ||
req.on('response', function (res) { | ||
if (res.statusCode !== 200) { | ||
dfd.reject(makeError(MSG_ERR_COPY, src, dest)); | ||
} | ||
else { | ||
dfd.resolve(util.format(MSG_COPY_SUCCESS, src, dest)); | ||
} | ||
}); | ||
return dfd; | ||
}); | ||
/** | ||
* Delete a file from s3. | ||
* | ||
* @param {String} src The s3 path, relative to the bucket, to the file to | ||
* delete. | ||
* @param {Object} [options] An object containing options which override any | ||
* option declared in the global s3 config. | ||
*/ | ||
grunt.registerHelper('s3.delete', function (src, opts) { | ||
var dfd = new _.Deferred(); | ||
var options = clone(opts); | ||
var config = _.defaults(options || {}, getConfig()); | ||
// Pick out the configuration options we need for the client. | ||
var client = knox.createClient(_(config).pick([ | ||
'endpoint', 'port', 'key', 'secret', 'access', 'bucket' | ||
])); | ||
// Upload the file to this endpoint. | ||
client.deleteFile(src, function (err, res) { | ||
if (err || res.statusCode !== 204) { | ||
dfd.reject(makeError(MSG_ERR_DELETE, src, err || res.statusCode)); | ||
} | ||
else { | ||
dfd.resolve(util.format(MSG_DELETE_SUCCESS, src)); | ||
} | ||
}); | ||
return dfd; | ||
}); | ||
}; | ||
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
29286
4
17
556
246
4
1
+ Addedargparse@0.1.16(transitive)
+ Addedcoffee-script@1.3.3(transitive)
+ Addedesprima@1.0.4(transitive)
+ Addedeventemitter2@0.4.14(transitive)
+ Addedexit@0.1.2(transitive)
+ Addedfindup-sync@0.1.3(transitive)
+ Addedgetobject@0.1.0(transitive)
+ Addedglob@3.1.213.2.11(transitive)
+ Addedgraceful-fs@1.2.3(transitive)
+ Addedgrunt@0.4.5(transitive)
+ Addedgrunt-legacy-log@0.1.3(transitive)
+ Addedgrunt-legacy-log-utils@0.1.1(transitive)
+ Addedgrunt-legacy-util@0.2.0(transitive)
+ Addediconv-lite@0.2.11(transitive)
+ Addedinherits@1.0.22.0.4(transitive)
+ Addedjs-yaml@2.0.5(transitive)
+ Addedlodash@0.9.22.4.2(transitive)
+ Addedminimatch@0.3.0(transitive)
+ Addedrimraf@2.2.8(transitive)
+ Addedunderscore@1.7.0(transitive)
+ Addedunderscore.string@2.2.12.3.32.4.0(transitive)
+ Addedwhich@1.0.9(transitive)
- Removedasync@~0.1.18
- Removedunderscore@~1.3.3
- Removed@alcalzone/ansi-tokenize@0.1.3(transitive)
- Removed@base2/pretty-print-object@1.0.1(transitive)
- Removed@bcoe/v8-coverage@0.2.3(transitive)
- Removed@cspotcode/source-map-support@0.8.1(transitive)
- Removed@isaacs/cliui@8.0.2(transitive)
- Removed@isaacs/ts-node-temp-fork-for-pr-2009@10.9.7(transitive)
- Removed@istanbuljs/schema@0.1.3(transitive)
- Removed@jridgewell/resolve-uri@3.1.2(transitive)
- Removed@jridgewell/sourcemap-codec@1.5.0(transitive)
- Removed@jridgewell/trace-mapping@0.3.250.3.9(transitive)
- Removed@npmcli/agent@2.2.2(transitive)
- Removed@npmcli/fs@3.1.1(transitive)
- Removed@npmcli/git@5.0.8(transitive)
- Removed@npmcli/installed-package-contents@2.1.0(transitive)
- Removed@npmcli/node-gyp@3.0.0(transitive)
- Removed@npmcli/package-json@5.2.1(transitive)
- Removed@npmcli/promise-spawn@7.0.2(transitive)
- Removed@npmcli/redact@2.0.1(transitive)
- Removed@npmcli/run-script@8.1.0(transitive)
- Removed@pkgjs/parseargs@0.11.0(transitive)
- Removed@sigstore/bundle@2.3.2(transitive)
- Removed@sigstore/core@1.1.0(transitive)
- Removed@sigstore/protobuf-specs@0.3.2(transitive)
- Removed@sigstore/sign@2.3.2(transitive)
- Removed@sigstore/tuf@2.3.4(transitive)
- Removed@sigstore/verify@1.2.1(transitive)
- Removed@tapjs/after@3.0.0(transitive)
- Removed@tapjs/after-each@4.0.0(transitive)
- Removed@tapjs/asserts@4.0.0(transitive)
- Removed@tapjs/before@4.0.0(transitive)
- Removed@tapjs/before-each@4.0.0(transitive)
- Removed@tapjs/chdir@3.0.0(transitive)
- Removed@tapjs/config@5.0.0(transitive)
- Removed@tapjs/core@4.0.0(transitive)
- Removed@tapjs/error-serdes@4.0.0(transitive)
- Removed@tapjs/filter@4.0.0(transitive)
- Removed@tapjs/fixture@4.0.0(transitive)
- Removed@tapjs/intercept@4.0.0(transitive)
- Removed@tapjs/mock@4.0.0(transitive)
- Removed@tapjs/node-serialize@4.0.0(transitive)
- Removed@tapjs/processinfo@3.1.8(transitive)
- Removed@tapjs/reporter@4.0.1(transitive)
- Removed@tapjs/run@4.0.1(transitive)
- Removed@tapjs/snapshot@4.0.0(transitive)
- Removed@tapjs/spawn@4.0.0(transitive)
- Removed@tapjs/stack@4.0.0(transitive)
- Removed@tapjs/stdin@4.0.0(transitive)
- Removed@tapjs/test@4.0.0(transitive)
- Removed@tapjs/typescript@3.0.0(transitive)
- Removed@tapjs/worker@4.0.0(transitive)
- Removed@tsconfig/node14@14.1.2(transitive)
- Removed@tsconfig/node16@16.1.3(transitive)
- Removed@tsconfig/node18@18.2.4(transitive)
- Removed@tsconfig/node20@20.1.4(transitive)
- Removed@tufjs/canonical-json@2.0.0(transitive)
- Removed@tufjs/models@2.0.1(transitive)
- Removed@types/istanbul-lib-coverage@2.0.6(transitive)
- Removed@types/node@22.5.5(transitive)
- Removedabbrev@2.0.0(transitive)
- Removedacorn@8.12.1(transitive)
- Removedacorn-walk@8.3.4(transitive)
- Removedagent-base@7.1.1(transitive)
- Removedaggregate-error@3.1.0(transitive)
- Removedansi-escapes@7.0.0(transitive)
- Removedansi-regex@5.0.16.1.0(transitive)
- Removedansi-styles@4.3.06.2.1(transitive)
- Removedanymatch@3.1.3(transitive)
- Removedarg@4.1.3(transitive)
- Removedasync-hook-domain@4.0.1(transitive)
- Removedauto-bind@5.0.1(transitive)
- Removedbalanced-match@1.0.2(transitive)
- Removedbinary-extensions@2.3.0(transitive)
- Removedbrace-expansion@2.0.1(transitive)
- Removedbraces@3.0.3(transitive)
- Removedbytes@0.1.0(transitive)
- Removedc8@10.1.2(transitive)
- Removedcacache@18.0.4(transitive)
- Removedchalk@5.3.0(transitive)
- Removedchokidar@3.6.0(transitive)
- Removedchownr@2.0.0(transitive)
- Removedclean-stack@2.2.0(transitive)
- Removedcli@0.4.3(transitive)
- Removedcli-boxes@3.0.0(transitive)
- Removedcli-cursor@4.0.0(transitive)
- Removedcli-truncate@4.0.0(transitive)
- Removedcliui@8.0.1(transitive)
- Removedcode-excerpt@4.0.0(transitive)
- Removedcolor-convert@2.0.1(transitive)
- Removedcolor-name@1.1.4(transitive)
- Removedconnect@2.4.6(transitive)
- Removedconvert-source-map@2.0.0(transitive)
- Removedconvert-to-spaces@2.0.1(transitive)
- Removedcookie@0.0.4(transitive)
- Removedcrc@0.2.0(transitive)
- Removedcrc32@0.2.2(transitive)
- Removedcross-spawn@7.0.3(transitive)
- Removeddebug@4.3.7(transitive)
- Removeddeflate-js@0.2.3(transitive)
- Removeddiff@4.0.25.2.0(transitive)
- Removedeastasianwidth@0.2.0(transitive)
- Removedemoji-regex@10.4.08.0.09.2.2(transitive)
- Removedencoding@0.1.13(transitive)
- Removedenv-paths@2.2.1(transitive)
- Removedenvironment@1.1.0(transitive)
- Removederr-code@2.0.3(transitive)
- Removedescalade@3.2.0(transitive)
- Removedescape-string-regexp@2.0.0(transitive)
- Removedevents-to-array@2.0.3(transitive)
- Removedexponential-backoff@3.1.1(transitive)
- Removedeyes@0.1.8(transitive)
- Removedfill-range@7.1.1(transitive)
- Removedfind-up@5.0.0(transitive)
- Removedforeground-child@3.3.0(transitive)
- Removedformidable@1.0.11(transitive)
- Removedfresh@0.1.0(transitive)
- Removedfromentries@1.3.2(transitive)
- Removedfs-minipass@2.1.03.0.3(transitive)
- Removedfsevents@2.3.3(transitive)
- Removedfunction-loop@4.0.0(transitive)
- Removedget-caller-file@2.0.5(transitive)
- Removedget-east-asian-width@1.2.0(transitive)
- Removedglob@10.4.511.0.0(transitive)
- Removedglob-parent@5.1.2(transitive)
- Removedglob-whatev@0.1.8(transitive)
- Removedgraceful-fs@4.2.11(transitive)
- Removedgrunt@0.3.17(transitive)
- Removedgzip-js@0.3.2(transitive)
- Removedhas-flag@4.0.0(transitive)
- Removedhosted-git-info@7.0.2(transitive)
- Removedhtml-escaper@2.0.2(transitive)
- Removedhttp-cache-semantics@4.1.1(transitive)
- Removedhttp-proxy-agent@7.0.2(transitive)
- Removedhttps-proxy-agent@7.0.5(transitive)
- Removediconv-lite@0.6.3(transitive)
- Removedignore-walk@6.0.5(transitive)
- Removedimurmurhash@0.1.4(transitive)
- Removedindent-string@4.0.05.0.0(transitive)
- Removedini@4.1.3(transitive)
- Removedink@5.0.1(transitive)
- Removedip-address@9.0.5(transitive)
- Removedis-actual-promise@1.0.2(transitive)
- Removedis-binary-path@2.1.0(transitive)
- Removedis-extglob@2.1.1(transitive)
- Removedis-fullwidth-code-point@3.0.04.0.05.0.0(transitive)
- Removedis-glob@4.0.3(transitive)
- Removedis-in-ci@0.1.0(transitive)
- Removedis-lambda@1.0.1(transitive)
- Removedis-number@7.0.0(transitive)
- Removedis-plain-object@5.0.0(transitive)
- Removedisexe@2.0.03.1.1(transitive)
- Removedistanbul-lib-coverage@3.2.2(transitive)
- Removedistanbul-lib-report@3.0.1(transitive)
- Removedistanbul-reports@3.1.7(transitive)
- Removedjackspeak@3.4.34.0.1(transitive)
- Removedjs-tokens@4.0.0(transitive)
- Removedjsbn@1.1.0(transitive)
- Removedjshint@0.9.1(transitive)
- Removedjson-parse-even-better-errors@3.0.2(transitive)
- Removedjsonparse@1.3.1(transitive)
- Removedlocate-path@6.0.0(transitive)
- Removedlodash@4.17.21(transitive)
- Removedloggly@0.3.11(transitive)
- Removedloose-envify@1.4.0(transitive)
- Removedlru-cache@1.0.610.4.311.0.1(transitive)
- Removedmake-dir@4.0.0(transitive)
- Removedmake-error@1.3.6(transitive)
- Removedmake-fetch-happen@13.0.1(transitive)
- Removedmime@1.2.6(transitive)
- Removedmimic-fn@2.1.0(transitive)
- Removedminimatch@0.0.510.0.19.0.5(transitive)
- Removedminipass@3.3.65.0.07.1.2(transitive)
- Removedminipass-collect@2.0.1(transitive)
- Removedminipass-fetch@3.0.5(transitive)
- Removedminipass-flush@1.0.5(transitive)
- Removedminipass-pipeline@1.2.4(transitive)
- Removedminipass-sized@1.0.3(transitive)
- Removedminizlib@2.1.2(transitive)
- Removedmkdirp@1.0.43.0.1(transitive)
- Removedms@2.1.3(transitive)
- Removednegotiator@0.6.3(transitive)
- Removednode-gyp@10.2.0(transitive)
- Removednodeunit@0.7.4(transitive)
- Removednopt@7.2.1(transitive)
- Removednormalize-package-data@6.0.2(transitive)
- Removednormalize-path@3.0.0(transitive)
- Removednpm-bundled@3.0.1(transitive)
- Removednpm-install-checks@6.3.0(transitive)
- Removednpm-normalize-package-bin@3.0.1(transitive)
- Removednpm-package-arg@11.0.3(transitive)
- Removednpm-packlist@8.0.2(transitive)
- Removednpm-pick-manifest@9.1.0(transitive)
- Removednpm-registry-fetch@17.1.0(transitive)
- Removedonetime@5.1.2(transitive)
- Removedopener@1.5.2(transitive)
- Removedp-limit@3.1.0(transitive)
- Removedp-locate@5.0.0(transitive)
- Removedp-map@4.0.0(transitive)
- Removedpackage@1.0.1(transitive)
- Removedpackage-json-from-dist@1.0.0(transitive)
- Removedpacote@18.0.6(transitive)
- Removedpatch-console@2.0.0(transitive)
- Removedpath-exists@4.0.0(transitive)
- Removedpath-key@3.1.1(transitive)
- Removedpath-scurry@1.11.12.0.0(transitive)
- Removedpause@0.0.1(transitive)
- Removedpicomatch@2.3.1(transitive)
- Removedpirates@4.0.6(transitive)
- Removedpkginfo@0.2.30.4.1(transitive)
- Removedpolite-json@5.0.0(transitive)
- Removedprismjs@1.29.0(transitive)
- Removedprismjs-terminal@1.2.3(transitive)
- Removedproc-log@4.2.0(transitive)
- Removedprocess-on-spawn@1.0.0(transitive)
- Removedpromise-inflight@1.0.1(transitive)
- Removedpromise-retry@2.0.1(transitive)
- Removedprompt@0.1.12(transitive)
- Removedqs@0.5.1(transitive)
- Removedrange-parser@0.0.4(transitive)
- Removedreact@18.3.1(transitive)
- Removedreact-dom@18.3.1(transitive)
- Removedreact-element-to-jsx-string@15.0.0(transitive)
- Removedreact-is@18.1.0(transitive)
- Removedreact-reconciler@0.29.2(transitive)
- Removedreaddirp@3.6.0(transitive)
- Removedrequest@2.9.203(transitive)
- Removedrequire-directory@2.1.1(transitive)
- Removedresolve-import@2.0.0(transitive)
- Removedrestore-cursor@4.0.0(transitive)
- Removedretry@0.12.0(transitive)
- Removedrimraf@6.0.1(transitive)
- Removedsafer-buffer@2.1.2(transitive)
- Removedscheduler@0.23.2(transitive)
- Removedsemver@1.0.147.6.3(transitive)
- Removedsend@0.0.4(transitive)
- Removedshebang-command@2.0.0(transitive)
- Removedshebang-regex@3.0.0(transitive)
- Removedsignal-exit@3.0.74.1.0(transitive)
- Removedsigstore@2.3.1(transitive)
- Removedslice-ansi@5.0.07.1.0(transitive)
- Removedsmart-buffer@4.2.0(transitive)
- Removedsocks@2.8.3(transitive)
- Removedsocks-proxy-agent@8.0.4(transitive)
- Removedspdx-correct@3.2.0(transitive)
- Removedspdx-exceptions@2.5.0(transitive)
- Removedspdx-expression-parse@3.0.1(transitive)
- Removedspdx-license-ids@3.0.20(transitive)
- Removedsprintf-js@1.1.3(transitive)
- Removedssri@10.0.6(transitive)
- Removedstack-trace@0.0.10(transitive)
- Removedstack-utils@2.0.6(transitive)
- Removedstring-length@6.0.0(transitive)
- Removedstring-width@4.2.35.1.27.2.0(transitive)
- Removedstrip-ansi@6.0.17.1.0(transitive)
- Removedsupports-color@7.2.0(transitive)
- Removedsync-content@2.0.1(transitive)
- Removedtap@21.0.1(transitive)
- Removedtap-parser@18.0.0(transitive)
- Removedtap-yaml@4.0.0(transitive)
- Removedtar@6.2.1(transitive)
- Removedtcompare@9.0.0(transitive)
- Removedtemporary@0.0.8(transitive)
- Removedtest-exclude@7.0.1(transitive)
- Removedtimespan@2.3.0(transitive)
- Removedto-regex-range@5.0.1(transitive)
- Removedtrivial-deferred@2.0.0(transitive)
- Removedtshy@3.0.2(transitive)
- Removedtuf-js@2.2.1(transitive)
- Removedtype-fest@4.26.1(transitive)
- Removedtypescript@5.5.4(transitive)
- Removeduglify-js@1.3.5(transitive)
- Removedunderscore@1.2.41.3.3(transitive)
- Removedunderscore.string@2.1.1(transitive)
- Removedundici-types@6.19.8(transitive)
- Removedunique-filename@3.0.0(transitive)
- Removedunique-slug@4.0.0(transitive)
- Removeduuid@8.3.2(transitive)
- Removedv8-compile-cache-lib@3.0.1(transitive)
- Removedv8-to-istanbul@9.3.0(transitive)
- Removedvalidate-npm-package-license@3.0.4(transitive)
- Removedvalidate-npm-package-name@5.0.1(transitive)
- Removedwalk-up-path@4.0.0(transitive)
- Removedwhich@2.0.24.0.0(transitive)
- Removedwidest-line@5.0.0(transitive)
- Removedwinston@0.5.11(transitive)
- Removedwrap-ansi@7.0.08.1.09.0.0(transitive)
- Removedws@8.18.0(transitive)
- Removedy18n@5.0.8(transitive)
- Removedyallist@4.0.0(transitive)
- Removedyaml@2.5.1(transitive)
- Removedyaml-types@0.4.0(transitive)
- Removedyargs@17.7.2(transitive)
- Removedyargs-parser@21.1.1(transitive)
- Removedyocto-queue@0.1.0(transitive)
- Removedyoga-wasm-web@0.3.3(transitive)
Updatedgrunt@0.4.x