UNPKG

s3-cli-js

Version:

A TypeScript-based npm package that replaces AWS CLI for S3 operations using presigned URLs

107 lines 3.98 kB
"use strict"; /** * 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