UNPKG

sanity-delete-unused-assets

Version:

Asset cleanup utility for Sanity Studio - remove unused assets and optimize storage with safety features

258 lines (206 loc) 6.73 kB
# Sanity Delete Unused Assets A comprehensive asset cleanup utility for Sanity Studio that identifies and removes unused assets to optimize storage and improve performance. Features advanced scanning, filtering, and safety mechanisms. ## Features - 🔍 **Smart Asset Scanning**: Automatically detects unused images, videos, and files - 📊 **Storage Analysis**: Shows file sizes, storage savings, and detailed metrics - 🎯 **Advanced Filtering**: Filter by file type, size, age, and custom patterns - 🛡️ **Safety First**: Dry-run mode, confirmation dialogs, and exclude patterns - 📈 **Progress Tracking**: Real-time scanning progress with detailed feedback - 🔄 **Batch Processing**: Handles large asset collections efficiently - 📱 **Responsive UI**: Seamless integration with Sanity Studio ## Installation ```bash npm install sanity-delete-unused-assets ``` ## Quick Start ### Basic Usage ```tsx import React from 'react' import { DeleteUnusedAssets } from 'sanity-delete-unused-assets' import { useClient } from 'sanity' const AssetCleanup = () => { const client = useClient({ apiVersion: '2023-01-01' }) return ( <DeleteUnusedAssets client={client} onComplete={(results) => { console.log(`Cleaned up ${results.deleted} assets, saved ${results.spaceSaved} MB`) }} /> ) } ``` ### As a Sanity Studio Tool ```tsx // sanity.config.ts import { defineConfig } from 'sanity' import { DeleteUnusedAssetsTool } from 'sanity-delete-unused-assets' export default defineConfig({ // ... other config tools: [ DeleteUnusedAssetsTool() ] }) ``` ### With Custom Filters ```tsx <DeleteUnusedAssets client={client} fileTypes={['image/jpeg', 'image/png']} minFileSize={1024} // 1KB minimum maxFileSize={10485760} // 10MB maximum olderThanDays={30} excludePatterns={['hero-*', 'logo-*']} /> ``` ## Props | Prop | Type | Default | Description | |------|------|---------|-------------| | `client` | `SanityClient` | **required** | Sanity client instance | | `fileTypes` | `string[]` | `[]` | Specific MIME types to scan (empty = all types) | | `minFileSize` | `number` | `0` | Minimum file size in bytes | | `maxFileSize` | `number` | `Infinity` | Maximum file size in bytes | | `olderThanDays` | `number` | `0` | Only scan assets older than X days | | `excludePatterns` | `string[]` | `[]` | Filename patterns to exclude from deletion | | `onComplete` | `function` | `undefined` | Callback when cleanup completes | | `onError` | `function` | `undefined` | Error handling callback | | `batchSize` | `number` | `10` | Number of assets to process per batch | | `dryRun` | `boolean` | `false` | Preview mode without actual deletion | ## Usage Examples ### 1. Basic Asset Cleanup ```tsx import { DeleteUnusedAssets } from 'sanity-delete-unused-assets' const BasicCleanup = () => { const client = useClient({ apiVersion: '2023-01-01' }) return ( <DeleteUnusedAssets client={client} onComplete={(results) => { console.log(`Cleanup complete:`, { deleted: results.deleted, spaceSaved: `${results.spaceSaved} MB`, errors: results.errors.length }) }} /> ) } ``` ### 2. Image-Only Cleanup with Size Limits ```tsx <DeleteUnusedAssets client={client} fileTypes={['image/jpeg', 'image/png', 'image/webp']} minFileSize={1024} // Skip tiny files maxFileSize={5242880} // Skip files larger than 5MB onComplete={(results) => { console.log(`Cleaned ${results.deleted} images`) }} /> ``` ### 3. Safe Mode with Exclusions ```tsx <DeleteUnusedAssets client={client} dryRun={true} excludePatterns={[ 'hero-*', 'logo-*', 'favicon*', '*-backup' ]} onComplete={(results) => { console.log(`Would delete ${results.deleted} assets (${results.spaceSaved} MB)`) }} /> ``` ### 4. Old Asset Cleanup ```tsx <DeleteUnusedAssets client={client} olderThanDays={90} // Only assets older than 3 months onComplete={(results) => { console.log(`Cleaned up old assets: ${results.deleted} files`) }} /> ``` ## Asset Detection ### How It Works The utility performs a comprehensive scan to identify unused assets: 1. **Asset Inventory**: Scans all assets in your Sanity dataset 2. **Reference Analysis**: Checks all documents for asset references 3. **Usage Detection**: Identifies assets not referenced by any document 4. **Filter Application**: Applies your specified filters (type, size, age, etc.) 5. **Safe Deletion**: Removes only confirmed unused assets ### Supported Asset Types - **Images**: JPEG, PNG, WebP, GIF, SVG - **Videos**: MP4, WebM, MOV - **Documents**: PDF, DOC, DOCX - **Audio**: MP3, WAV, OGG - **Archives**: ZIP, RAR - **Custom**: Any MIME type ## Safety Features ### Dry Run Mode ```tsx <DeleteUnusedAssets client={client} dryRun={true} /> ``` - Preview what would be deleted without making changes - Test filters and exclusion patterns safely - Validate storage savings estimates ### Exclude Patterns ```tsx excludePatterns={[ 'hero-*', // Exclude hero images 'logo-*', // Exclude logos '*-backup', // Exclude backup files 'temp/*' // Exclude temp folder ]} ``` ### Confirmation Dialogs - All delete operations require explicit confirmation - Clear warnings for destructive actions - Detailed summary before deletion ### Batch Processing - Large cleanup operations are processed in batches - Prevents timeout issues with large asset collections - Progress feedback during long operations ## Storage Analysis The component provides detailed storage metrics: - **Total Assets**: Count of all assets in dataset - **Unused Assets**: Count of assets not referenced - **Storage Used**: Total storage consumed by unused assets - **Potential Savings**: Storage that would be freed - **File Size Distribution**: Breakdown by file size ranges - **File Type Analysis**: Usage by MIME type ## Performance Tips ### Large Datasets - Use `batchSize` to control processing speed - Apply filters to reduce scan scope - Run during off-peak hours for large cleanups ### Incremental Cleanup ```tsx // Clean up assets older than 30 days <DeleteUnusedAssets client={client} olderThanDays={30} batchSize={5} /> ``` ### Memory Optimization ```tsx // Process smaller batches for memory efficiency <DeleteUnusedAssets client={client} batchSize={3} maxFileSize={10485760} // 10MB limit /> ``` ## Requirements - Sanity Studio v3+ - React 18+ - @sanity/ui v1+ - TypeScript 4.5+ (optional) ## License MIT License - see [LICENSE](LICENSE) file for details. ## Contributing Contributions are welcome! Please read our contributing guidelines and submit pull requests to help improve this utility.