s3-cli-js
Version:
A TypeScript-based npm package that replaces AWS CLI for S3 operations using presigned URLs
107 lines • 3.98 kB
JavaScript
;
/**
* Remove S3 objects command implementation
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.removeCommand = removeCommand;
const chalk_1 = __importDefault(require("chalk"));
const progress_1 = require("../utils/progress");
/**
* Remove S3 objects
*/
async function removeCommand(client, path, options = {}) {
try {
if (!(0, progress_1.isS3Uri)(path)) {
throw new Error('Path must be an S3 URI (s3://bucket/key)');
}
const { bucket, key } = (0, progress_1.parseS3Uri)(path);
if (key === '' || key.endsWith('/')) {
// Remove directory/prefix
if (!options.recursive) {
throw new Error('Use --recursive flag to remove directories');
}
await removeDirectory(client, bucket, key, options);
}
else {
// Remove single object
await removeSingleObject(client, bucket, key, options);
}
}
catch (error) {
console.error(chalk_1.default.red(`Error: ${error.message}`));
process.exit(1);
}
}
/**
* Remove a single object from S3
*/
async function removeSingleObject(client, bucket, key, options) {
const filename = key.split('/').pop() || key;
if (!(0, progress_1.shouldIncludeFile)(filename, options.include, options.exclude)) {
return;
}
// Check if object exists
const exists = await client.objectExists(bucket, key);
if (!exists) {
console.log(chalk_1.default.yellow(`Object does not exist: s3://${bucket}/${key}`));
return;
}
if (options.dryRun) {
console.log(chalk_1.default.blue(`[DRY RUN] delete: s3://${bucket}/${key}`));
return;
}
console.log(chalk_1.default.blue(`delete: s3://${bucket}/${key}`));
await client.deleteObject(bucket, key);
console.log(chalk_1.default.green(`✓ Deleted: s3://${bucket}/${key}`));
}
/**
* Remove all objects with a given prefix (directory)
*/
async function removeDirectory(client, bucket, keyPrefix, options) {
let continuationToken;
let totalDeleted = 0;
console.log(chalk_1.default.blue(`Removing objects with prefix: s3://${bucket}/${keyPrefix}`));
do {
const result = await client.listObjects({
bucket,
prefix: keyPrefix,
continuationToken,
});
if (result.objects.length === 0) {
break;
}
for (const object of result.objects) {
const filename = object.key.split('/').pop() || object.key;
if (!(0, progress_1.shouldIncludeFile)(filename, options.include, options.exclude)) {
continue;
}
if (options.dryRun) {
console.log(chalk_1.default.blue(`[DRY RUN] delete: s3://${bucket}/${object.key}`));
totalDeleted++;
}
else {
console.log(chalk_1.default.blue(`delete: s3://${bucket}/${object.key}`));
try {
await client.deleteObject(bucket, object.key);
console.log(chalk_1.default.green(`✓ Deleted: s3://${bucket}/${object.key}`));
totalDeleted++;
}
catch (error) {
console.error(chalk_1.default.red(`✗ Failed to delete s3://${bucket}/${object.key}: ${error.message}`));
}
}
}
continuationToken = result.nextContinuationToken;
} while (continuationToken);
if (totalDeleted === 0) {
console.log(chalk_1.default.yellow('No objects found to delete.'));
}
else {
const action = options.dryRun ? 'Would delete' : 'Deleted';
console.log(chalk_1.default.green(`${action} ${totalDeleted} object(s)`));
}
}
//# sourceMappingURL=rm.js.map