⚡ Zero-dependency plcbundle library exclusively for Bun
at main 3.0 kB view raw
1import { parseArgs } from 'util'; 2import { PLCBundle } from '../plcbundle'; 3 4export async function verify(args: string[]) { 5 if (args.includes('-h') || args.includes('--help')) { 6 console.log(` 7verify - Verify bundle integrity 8 9OPTIONS: 10 --dir <path> Bundle directory (default: ./) 11 --bundle <num> Bundle number to verify (required unless --chain is used) 12 --chain Verify entire chain instead of single bundle 13 --start <num> Start bundle for chain verification (default: 1) 14 --end <num> End bundle for chain verification (default: last bundle) 15 16EXAMPLES: 17 plcbundle-bun verify --bundle 42 18 plcbundle-bun verify --chain 19 plcbundle-bun verify --chain --start 1 --end 100 20 `); 21 return; 22 } 23 24 const { values } = parseArgs({ 25 args, 26 options: { 27 dir: { type: 'string', default: './' }, 28 bundle: { type: 'string' }, 29 chain: { type: 'boolean', default: false }, 30 start: { type: 'string' }, 31 end: { type: 'string' }, 32 }, 33 strict: false, 34 }); 35 36 const dir = (values.dir as string) || './'; 37 const bundleInstance = new PLCBundle(dir); 38 39 // Chain verification 40 if (values.chain) { 41 const stats = await bundleInstance.getStats(); 42 const start = values.start ? parseInt(values.start as string) : 1; 43 const end = values.end ? parseInt(values.end as string) : stats.lastBundle; 44 45 console.log(`Verifying chain: bundles ${start}-${end}\n`); 46 47 const startTime = Date.now(); 48 49 const result = await bundleInstance.verifyChain({ 50 start, 51 end, 52 onProgress: (current, total) => { 53 process.stdout.write(`Verified ${current}/${total} bundles\r`); 54 }, 55 }); 56 57 const elapsed = (Date.now() - startTime) / 1000; 58 59 console.log('\n'); 60 61 if (result.valid) { 62 console.log(`✓ Chain verification passed`); 63 console.log(` Verified bundles: ${result.validBundles}`); 64 console.log(` Time elapsed: ${elapsed.toFixed(2)}s`); 65 } else { 66 console.error(`✗ Chain verification failed`); 67 console.error(` Valid bundles: ${result.validBundles}`); 68 console.error(` Invalid bundles: ${result.invalidBundles}`); 69 console.error(''); 70 71 result.errors.forEach(({ bundleNum, errors }) => { 72 console.error(`Bundle ${bundleNum}:`); 73 errors.forEach(e => console.error(` - ${e}`)); 74 }); 75 76 process.exit(1); 77 } 78 79 return; 80 } 81 82 // Single bundle verification 83 if (!values.bundle || typeof values.bundle !== 'string') { 84 console.error('Error: --bundle is required (or use --chain)'); 85 process.exit(1); 86 } 87 88 const num = parseInt(values.bundle); 89 const result = await bundleInstance.verifyBundle(num); 90 91 if (result.valid) { 92 console.log(`✓ Bundle ${num} is valid`); 93 } else { 94 console.error(`✗ Bundle ${num} verification failed:`); 95 result.errors.forEach(e => console.error(` ${e}`)); 96 process.exit(1); 97 } 98}