⚡ Zero-dependency plcbundle library exclusively for Bun
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}