neozip-cli 0.75.2-beta → 0.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/DOCUMENTATION.md +9 -1
  3. package/README.md +22 -10
  4. package/dist/src/commands/mintTimestampProof.js +335 -0
  5. package/dist/src/commands/verifyEmail.js +146 -0
  6. package/dist/src/config/ConfigSetup.js +50 -20
  7. package/dist/src/config/ConfigStore.js +36 -3
  8. package/dist/src/index.js +1 -1
  9. package/dist/src/neolist.js +18 -10
  10. package/dist/src/neounzip.js +305 -60
  11. package/dist/src/neozip/blockchain.js +5 -5
  12. package/dist/src/neozip/createZip.js +207 -41
  13. package/dist/src/neozip/upgradeZip.js +182 -0
  14. package/dist/src/neozip.js +143 -8
  15. package/env.example +10 -0
  16. package/package.json +87 -81
  17. package/dist/neozipkit-bundles/blockchain.js +0 -13725
  18. package/dist/neozipkit-bundles/browser.js +0 -6186
  19. package/dist/neozipkit-bundles/core.js +0 -3839
  20. package/dist/neozipkit-bundles/node.js +0 -17730
  21. package/dist/neozipkit-wrappers/blockchain/core/contracts.js +0 -16
  22. package/dist/neozipkit-wrappers/blockchain/index.js +0 -2
  23. package/dist/neozipkit-wrappers/core/ZipDecompress.js +0 -2
  24. package/dist/neozipkit-wrappers/core/components/HashCalculator.js +0 -2
  25. package/dist/neozipkit-wrappers/core/components/Logger.js +0 -2
  26. package/dist/neozipkit-wrappers/core/constants/Errors.js +0 -2
  27. package/dist/neozipkit-wrappers/core/constants/Headers.js +0 -2
  28. package/dist/neozipkit-wrappers/core/encryption/ZipCrypto.js +0 -7
  29. package/dist/neozipkit-wrappers/core/index.js +0 -3
  30. package/dist/neozipkit-wrappers/index.js +0 -13
  31. package/dist/neozipkit-wrappers/node/index.js +0 -2
@@ -67,10 +67,19 @@ const user_interaction_1 = require("./neozip/user-interaction");
67
67
  const createZip_1 = require("./neozip/createZip");
68
68
  const file_operations_1 = require("./neozip/file-operations");
69
69
  // ConfigSetup is lazy-loaded only when needed (init/config commands)
70
- const blockchain_1 = require("neozipkit/blockchain");
70
+ const neozip_blockchain_1 = require("neozip-blockchain");
71
71
  const ConfigStore_1 = require("./config/ConfigStore");
72
72
  const exit_codes_1 = require("./exit-codes");
73
73
  const version_1 = require("./version");
74
+ /**
75
+ * Resolve dynamic import path so ts-node loads .ts and compiled dist loads .js
76
+ */
77
+ function resolveScriptPath(jsPath) {
78
+ if (typeof __filename !== 'undefined' && __filename.endsWith('.ts')) {
79
+ return jsPath.replace(/\.js$/, '.ts');
80
+ }
81
+ return jsPath;
82
+ }
74
83
  /**
75
84
  * Parse command line arguments
76
85
  */
@@ -85,6 +94,7 @@ function parseArgs(args) {
85
94
  blockchainMint: false, // Force mint new token disabled by default
86
95
  network: 'base-sepolia',
87
96
  walletPasskey: process.env.NEOZIP_WALLET_PASSKEY,
97
+ timestampEmail: process.env.NEOZIP_TIMESTAMP_EMAIL,
88
98
  compression: 'zstd',
89
99
  blockSize: 128 * 1024, // 128KB default
90
100
  enableProgress: true,
@@ -168,6 +178,17 @@ function parseArgs(args) {
168
178
  case '--opentimestamp':
169
179
  options.blockchainOts = true;
170
180
  break;
181
+ case '-ts':
182
+ case '--timestamp':
183
+ options.blockchainZipstamp = true;
184
+ break;
185
+ case '--timestamp-email':
186
+ options.timestampEmail = args[++i];
187
+ if (!options.timestampEmail) {
188
+ console.error('Error: --timestamp-email requires an email address');
189
+ (0, exit_codes_1.exitZip)(exit_codes_1.ZIP_EXIT_CODES.PARAMETER_ERROR);
190
+ }
191
+ break;
171
192
  case '-bt':
172
193
  case '--blockchain-token':
173
194
  options.blockchain = true;
@@ -185,8 +206,8 @@ function parseArgs(args) {
185
206
  case '-n':
186
207
  case '--network':
187
208
  const network = args[++i];
188
- if ((0, blockchain_1.getChainIdByName)(network) === null) {
189
- const supportedNetworks = (0, blockchain_1.getSupportedNetworkNames)();
209
+ if ((0, neozip_blockchain_1.getChainIdByName)(network) === null) {
210
+ const supportedNetworks = (0, neozip_blockchain_1.getSupportedNetworkNames)();
190
211
  console.error(`Error: Unsupported network: "${network}"`);
191
212
  console.error(`Supported networks: ${supportedNetworks.join(', ')}`);
192
213
  (0, exit_codes_1.exitZip)(exit_codes_1.ZIP_EXIT_CODES.PARAMETER_ERROR);
@@ -411,6 +432,12 @@ function parseArgs(args) {
411
432
  break;
412
433
  }
413
434
  }
435
+ // -ots and -ts are mutually exclusive (choose Bitcoin OTS or Zipstamp)
436
+ if (options.blockchainOts && options.blockchainZipstamp) {
437
+ console.error('Error: Cannot use both -ots (OpenTimestamps) and -ts (Zipstamp) in the same run');
438
+ console.error(' Use -ots for Bitcoin timestamping or -ts for Zipstamp timestamping');
439
+ (0, exit_codes_1.exitZip)(exit_codes_1.ZIP_EXIT_CODES.PARAMETER_ERROR);
440
+ }
414
441
  if (!archive) {
415
442
  console.error('Error: Archive name is required');
416
443
  showHelp();
@@ -450,6 +477,9 @@ Usage: neozip [options] <archive> <files...>
450
477
  Configuration Commands:
451
478
  neozip init Interactive wallet setup wizard
452
479
  neozip config Show current configuration and manage settings (interactive menu)
480
+ neozip upgrade <archive> [output] [--wait] Upgrade pending Zipstamp timestamp to confirmed
481
+ neozip mint <archive> [output] Mint TimestampProofNFT from confirmed timestamped ZIP
482
+ neozip verify-email [--email <email>] [--set-default] Configure email for Zipstamp timestamping
453
483
 
454
484
  Options:
455
485
  -h, --help Show this help message
@@ -478,6 +508,8 @@ Options:
478
508
  -bd, --blockchain-default Auto-select default token option (use existing or mint new)
479
509
  -bm, --blockchain-mint Force mint new token (skip existing token selection)
480
510
  -ots, --opentimestamp Enable OpenTimestamp proof on Bitcoin blockchain
511
+ -ts, --timestamp Enable Zipstamp timestamp (blockchain)
512
+ --timestamp-email <email> Email for Zipstamp server (some servers require verified email)
481
513
  -n, --network <network> Blockchain network (base-sepolia, base-mainnet, default: base-sepolia)
482
514
  -w, --wallet-key <key> Wallet private key (overrides NEOZIP_WALLET_PASSKEY)
483
515
  -c Add one-line comments for files
@@ -509,9 +541,9 @@ Arguments:
509
541
  <files...> Files and directories to compress
510
542
 
511
543
  Examples:
512
- neozip output/test.nzip file1.txt file2.txt
513
- neozip output/simple.nzip ./data/
514
- neozip -r output/recursive.nzip ./project/
544
+ neozip tests/output/test.nzip file1.txt file2.txt
545
+ neozip tests/output/simple.nzip ./data/
546
+ neozip -r tests/output/recursive.nzip ./project/
515
547
  `);
516
548
  }
517
549
  /**
@@ -671,7 +703,7 @@ async function main() {
671
703
  // Handle `neozip init` - interactive setup wizard
672
704
  if (command === 'init') {
673
705
  // Lazy-load ConfigSetup only when needed
674
- const { ConfigSetup } = await import('./config/ConfigSetup.js');
706
+ const { ConfigSetup } = await import(resolveScriptPath('./config/ConfigSetup.js'));
675
707
  const wizard = new ConfigSetup();
676
708
  const success = await wizard.run();
677
709
  process.exit(success ? exit_codes_1.ZIP_EXIT_CODES.SUCCESS : exit_codes_1.ZIP_EXIT_CODES.BAD_ARCHIVE_FORMAT);
@@ -679,10 +711,113 @@ async function main() {
679
711
  // Handle `neozip config` - show interactive menu
680
712
  if (command === 'config') {
681
713
  // Lazy-load ConfigSetup only when needed
682
- const { ConfigSetup } = await import('./config/ConfigSetup.js');
714
+ const { ConfigSetup } = await import(resolveScriptPath('./config/ConfigSetup.js'));
683
715
  await ConfigSetup.showAndManage();
684
716
  // showAndManage handles its own exit
685
717
  }
718
+ // Handle `neozip verify-email` - configure email for Zipstamp timestamping
719
+ if (command === 'verify-email') {
720
+ const verifyArgs = args.slice(1);
721
+ let email;
722
+ let setDefaultOnly = false;
723
+ let debug = false;
724
+ for (let i = 0; i < verifyArgs.length; i++) {
725
+ const arg = verifyArgs[i];
726
+ if (arg === '--email' && verifyArgs[i + 1]) {
727
+ email = verifyArgs[++i];
728
+ }
729
+ else if (arg === '--set-default') {
730
+ setDefaultOnly = true;
731
+ }
732
+ else if (arg === '--debug') {
733
+ debug = true;
734
+ }
735
+ }
736
+ const { runVerifyEmail } = await import(resolveScriptPath('./commands/verifyEmail.js'));
737
+ const success = await runVerifyEmail({ email, setDefaultOnly, debug });
738
+ process.exit(success ? exit_codes_1.ZIP_EXIT_CODES.SUCCESS : exit_codes_1.ZIP_EXIT_CODES.BAD_ARCHIVE_FORMAT);
739
+ }
740
+ // Handle `neozip upgrade` - upgrade pending Zipstamp timestamp to confirmed
741
+ if (command === 'upgrade') {
742
+ const upgradeArgs = args.slice(1);
743
+ let inputPath = '';
744
+ let outputPath;
745
+ let wait = false;
746
+ let verbose = false;
747
+ let debug = false;
748
+ for (let i = 0; i < upgradeArgs.length; i++) {
749
+ const arg = upgradeArgs[i];
750
+ if (arg === '--wait') {
751
+ wait = true;
752
+ }
753
+ else if (arg === '-v' || arg === '--verbose') {
754
+ verbose = true;
755
+ }
756
+ else if (arg === '--debug') {
757
+ debug = true;
758
+ }
759
+ else if (!arg.startsWith('-')) {
760
+ if (!inputPath) {
761
+ inputPath = arg;
762
+ }
763
+ else if (!outputPath) {
764
+ outputPath = arg;
765
+ }
766
+ }
767
+ }
768
+ if (!inputPath) {
769
+ console.error('Error: neozip upgrade requires an input archive path');
770
+ console.error(' Usage: neozip upgrade <archive> [output] [--wait]');
771
+ (0, exit_codes_1.exitZip)(exit_codes_1.ZIP_EXIT_CODES.PARAMETER_ERROR);
772
+ }
773
+ const { upgradeZipForTimestamp } = await import(resolveScriptPath('./neozip/upgradeZip.js'));
774
+ await upgradeZipForTimestamp(inputPath, outputPath, { wait, verbose, debug });
775
+ (0, utils_1.log)('✓ Upgrade completed successfully', { verbose, quiet: false });
776
+ process.exit(exit_codes_1.ZIP_EXIT_CODES.SUCCESS);
777
+ }
778
+ // Handle `neozip mint` - mint TimestampProofNFT from confirmed timestamped ZIP
779
+ if (command === 'mint') {
780
+ const mintArgs = args.slice(1);
781
+ let inputPath = '';
782
+ let outputPath;
783
+ let walletKey;
784
+ let network;
785
+ let debug = false;
786
+ for (let i = 0; i < mintArgs.length; i++) {
787
+ const arg = mintArgs[i];
788
+ if (arg === '-w' || arg === '--wallet-key') {
789
+ walletKey = mintArgs[++i];
790
+ }
791
+ else if (arg === '-n' || arg === '--network') {
792
+ network = mintArgs[++i];
793
+ }
794
+ else if (arg === '--debug') {
795
+ debug = true;
796
+ }
797
+ else if (!arg.startsWith('-')) {
798
+ if (!inputPath) {
799
+ inputPath = arg;
800
+ }
801
+ else if (outputPath === undefined) {
802
+ outputPath = arg;
803
+ }
804
+ }
805
+ }
806
+ if (!inputPath) {
807
+ console.error('Error: neozip mint requires an input archive path');
808
+ console.error(' Usage: neozip mint <archive> [output] [-w <wallet-key>] [-n <network>]');
809
+ (0, exit_codes_1.exitZip)(exit_codes_1.ZIP_EXIT_CODES.PARAMETER_ERROR);
810
+ }
811
+ const { runMintTimestampProof } = await import(resolveScriptPath('./commands/mintTimestampProof.js'));
812
+ const success = await runMintTimestampProof({
813
+ inputPath,
814
+ outputPath,
815
+ walletKey,
816
+ network,
817
+ debug
818
+ });
819
+ process.exit(success ? exit_codes_1.ZIP_EXIT_CODES.SUCCESS : exit_codes_1.ZIP_EXIT_CODES.BAD_ARCHIVE_FORMAT);
820
+ }
686
821
  }
687
822
  let { archive, files, options } = parseArgs(args);
688
823
  // If network not explicitly provided via CLI, use from ConfigStore (which reads from ENV or wallet.json)
package/env.example CHANGED
@@ -55,6 +55,16 @@ NEOZIP_WALLET_PASSKEY=0x1234567890abcdef1234567890abcdef1234567890abcdef12345678
55
55
  # - Arbitrum One: https://arb1.arbitrum.io/rpc
56
56
  # - Ethereum Sepolia: https://rpc.sepolia.ethpandaops.io
57
57
 
58
+ # =============================================================================
59
+ # OPTIONAL: Zipstamp Timestamp Configuration
60
+ # =============================================================================
61
+
62
+ # Zipstamp server URL for Ethereum timestamping (default: https://zipstamp-dev.neozip.io)
63
+ # ZIPSTAMP_SERVER_URL=https://zipstamp-dev.neozip.io
64
+
65
+ # Email for Zipstamp server (some servers require verified email for stamping)
66
+ # NEOZIP_TIMESTAMP_EMAIL=your@email.com
67
+
58
68
  # =============================================================================
59
69
  # OPTIONAL: Debug Configuration
60
70
  # =============================================================================
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "neozip-cli",
3
- "version": "0.75.2-beta",
3
+ "version": "0.80.0",
4
+ "release_date": "2026-03-04",
4
5
  "description": "A full-featured command-line ZIP application with NeoZipKit integration",
5
6
  "main": "dist/src/index.js",
6
7
  "bin": {
@@ -10,8 +11,6 @@
10
11
  },
11
12
  "files": [
12
13
  "dist/src/**/*.js",
13
- "dist/neozipkit-bundles/*.js",
14
- "dist/neozipkit-wrappers/**/*.js",
15
14
  "bin/",
16
15
  "env.example",
17
16
  "README.md",
@@ -25,94 +24,100 @@
25
24
  "access": "public"
26
25
  },
27
26
  "scripts": {
28
- "start": "npx ts-node src/neozip.ts output/calgary.nzip test-suite/calgary/*",
29
- "dev": "npx ts-node --inspect src/neozip.ts output/calgary.nzip test-suite/calgary/*",
30
- "build": "echo '🔨 Building TypeScript...' && tsc --pretty && echo '🧹 Removing neozipkit from dist (bundled separately)...' && rm -rf dist/neozipkit && echo '📦 Bundling neozipkit (if needed)...' && node scripts/bundle-neozipkit.js && echo '📦 Copying neozipkit bundles...' && node scripts/copy-neozipkit-bundles.js && echo '📦 Creating wrapper modules...' && node scripts/create-neozipkit-wrappers.js && echo '🔄 Rewriting imports...' && node scripts/rewrite-neozipkit-imports.js && echo '✅ Build completed successfully!'",
27
+ "start": "npx ts-node src/neozip.ts tests/output/calgary.nzip tests/fixtures/calgary/*",
28
+ "dev": "npx ts-node --inspect src/neozip.ts tests/output/calgary.nzip tests/fixtures/calgary/*",
29
+ "build": "echo '🔨 Building TypeScript...' && tsc --pretty && echo '🧹 Removing neozipkit from dist (if present)...' && rm -rf dist/neozipkit && echo '✅ Build completed successfully!'",
31
30
  "build:clean": "echo '🧹 Cleaning dist directory...' && rm -rf dist && echo '🔨 Building TypeScript...' && tsc --pretty && echo '✅ Clean build completed successfully!'",
32
- "build:neozipkit": "echo '🔨 Building neozipkit...' && cd neozipkit && npm run build && cd .. && echo '✅ neozipkit build completed successfully!'",
33
- "bundle:neozipkit": "echo '📦 Bundling neozipkit...' && node scripts/bundle-neozipkit.js",
34
- "rebuild:neozipkit": "npm run build:neozipkit && npm run bundle:neozipkit && echo '✅ neozipkit rebuild and bundle completed successfully!'",
35
- "build:all": "npm run rebuild:neozipkit && npm run build",
36
- "dev:neozipkit": "echo '👀 Watching neozipkit for changes...' && cd ../neozipkit && npm run watch",
37
31
  "type-check": "tsc --noEmit",
38
- "clean": "rm -rf output/* dist/* test-output/*",
32
+ "clean": "rm -rf dist/* tests/output/*",
39
33
  "pack": "npm run build && echo '📦 Creating package tarball...' && npm pack && echo '✅ Package created successfully!'",
40
34
  "pack:dry-run": "npm run build && echo '📦 Previewing package contents...' && npm pack --dry-run",
41
35
  "pack:clean": "rm -f neozip-cli-*.tgz && echo '🧹 Cleaned up package tarballs'",
42
36
  "package": "npm run build && npm run pack",
43
37
  "prepublishOnly": "npm run build",
44
- "neozip": "npx ts-node src/neozip.ts -b -T output/calgary.nzip test-suite/calgary/*",
45
- "neozip-sepolia": "npx ts-node src/neozip.ts -b -T --network sepolia-testnet output/calgary.nzip test-suite/calgary/*",
46
- "neozip-base-sepolia": "npx ts-node src/neozip.ts -b -T --network base-sepolia output/calgary.nzip test-suite/calgary/*",
47
- "neozip-base": "npx ts-node src/neozip.ts -b -T --network base-mainnet output/calgary.nzip test-suite/calgary/*",
48
- "neozip-arbitrum-sepolia": "npx ts-node src/neozip.ts -b -T --network arbitrum-sepolia output/calgary.nzip test-suite/calgary/*",
49
- "neozip-arbitrum": "npx ts-node src/neozip.ts -b -T --network arbitrum-one output/calgary.nzip test-suite/calgary/*",
50
- "neozip-deflate": "npx ts-node src/neozip.ts --deflate -T output/calgary.nzip test-suite/calgary/*",
51
- "neozip-inmem": "npx ts-node src/neozip.ts -b --in-memory -T output/calgary.nzip test-suite/calgary/*",
52
- "neozip-store": "npx ts-node src/neozip.ts --level 0 -T output/calgary-stored.nzip test-suite/calgary/*",
53
- "neozip-ots": "npx ts-node src/neozip.ts -ots -T output/calgary-ots.nzip test-suite/calgary/*",
54
- "neozip-encrypt": "npx ts-node src/neozip.ts --encrypt -P 'pass123' -T output/calgary-encrypted.nzip test-suite/calgary/*",
55
- "neozip-encrypt-sm": "npx ts-node src/neozip.ts --encrypt -P 'pass123' -T output/encrypted-sm.nzip test-suite/test-sm/*",
56
- "neozip-update": "node test-scripts/test-update-option.js",
57
- "neozip-sm": "npx ts-node src/neozip.ts -T output/test-sm.nzip test-suite/test-sm/*",
38
+ "neozip": "npx ts-node src/neozip.ts -b -T tests/output/calgary.nzip tests/fixtures/calgary/*",
39
+ "neozip-sepolia": "npx ts-node src/neozip.ts -b -T --network sepolia-testnet tests/output/calgary.nzip tests/fixtures/calgary/*",
40
+ "neozip-base-sepolia": "npx ts-node src/neozip.ts -b -T --network base-sepolia tests/output/calgary.nzip tests/fixtures/calgary/*",
41
+ "neozip-base": "npx ts-node src/neozip.ts -b -T --network base-mainnet tests/output/calgary.nzip tests/fixtures/calgary/*",
42
+ "neozip-arbitrum-sepolia": "npx ts-node src/neozip.ts -b -T --network arbitrum-sepolia tests/output/calgary.nzip tests/fixtures/calgary/*",
43
+ "neozip-arbitrum": "npx ts-node src/neozip.ts -b -T --network arbitrum-one tests/output/calgary.nzip tests/fixtures/calgary/*",
44
+ "neozip-deflate": "npx ts-node src/neozip.ts --deflate -T tests/output/calgary.nzip tests/fixtures/calgary/*",
45
+ "neozip-inmem": "npx ts-node src/neozip.ts -b --in-memory -T tests/output/calgary.nzip tests/fixtures/calgary/*",
46
+ "neozip-store": "npx ts-node src/neozip.ts --level 0 -T tests/output/calgary-stored.nzip tests/fixtures/calgary/*",
47
+ "neozip-ots": "npx ts-node src/neozip.ts -ots -T tests/output/calgary-ots.nzip tests/fixtures/calgary/*",
48
+ "neozip-stamp": "npx ts-node src/neozip.ts -ts -T tests/output/calgary-stamp.nzip tests/fixtures/calgary/*",
49
+ "neozip-mint": "node dist/src/neozip.js mint -o tests/output/calgary-stamp-upgrade.nzip tests/output/calgary-stamp-nft.nzip",
50
+ "neozip-encrypt": "npx ts-node src/neozip.ts --encrypt -P 'pass123' -T tests/output/calgary-encrypted.nzip tests/fixtures/calgary/*",
51
+ "neozip-encrypt-sm": "npx ts-node src/neozip.ts --encrypt -P 'pass123' -T tests/output/encrypted-sm.nzip tests/fixtures/test-sm/*",
52
+ "neozip-update": "node tests/scripts/test-update-option.js",
53
+ "neozip-sm": "npx ts-node src/neozip.ts -T tests/output/test-sm.nzip tests/fixtures/test-sm/*",
58
54
  "neozip-init": "npx ts-node src/neozip.ts init",
59
55
  "neozip-config": "npx ts-node src/neozip.ts config",
56
+ "verify-email": "node dist/src/neozip.js verify-email",
60
57
  "neozip-help": "npx ts-node src/neozip.ts --help",
61
- "neounzip": "npx ts-node src/neounzip.ts output/calgary.nzip -t",
62
- "neounzip-inmem": "npx ts-node src/neounzip.ts --in-memory -l output/calgary.nzip -t",
63
- "neounzip-bad": "npx ts-node src/neounzip.ts output/calgary-bad.nzip -t",
64
- "neounzip-bad-inmem": "npx ts-node src/neounzip.ts --in-memory output/calgary-bad.nzip -t",
65
- "neounzip-sm": "npx ts-node src/neounzip.ts -o output/test-sm.nzip",
66
- "neounzip-skip-blockchain": "npx ts-node src/neounzip.ts --skip-blockchain output/calgary.nzip -t",
67
- "neounzip-lg": "npx ts-node src/neounzip.ts output/large.nzip -t",
68
- "neounzip-ots": "npx ts-node src/neounzip.ts output/calgary-ots.nzip -t",
69
- "neounzip-ots-skip-blockchain": "npx ts-node src/neounzip.ts --skip-blockchain output/calgary-ots.nzip -t",
70
- "neounzip-streaming": "npx ts-node src/neounzip.ts --buffer-size 16384 --verbose output/merged-test.nzip -t",
71
- "neounzip-decrypt": "npx ts-node src/neounzip.ts --password 'pass123' output/calgary-encrypted.nzip -t",
72
- "neounzip-decrypt-inmem": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' output/calgary-encrypted.nzip -t",
73
- "neounzip-decrypt-stored": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' output/calgary-encrypted-stored.nzip -t",
74
- "neounzip-decrypt-sm": "npx ts-node src/neounzip.ts --password 'pass123' output/encrypted-sm.nzip -t",
75
- "neounzip-decrypt-sm-inmem": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' output/encrypted-sm.nzip -t",
76
- "neounzip-decrypt-pkzip": "npx ts-node src/neounzip.ts --pkzip-decrypt --password 'legacy-test-123' output/calgary-pkzip.nzip -t",
58
+ "neounzip": "npx ts-node src/neounzip.ts tests/output/calgary.nzip -t",
59
+ "neounzip-inmem": "npx ts-node src/neounzip.ts --in-memory -l tests/output/calgary.nzip -t",
60
+ "neounzip-bad": "npx ts-node src/neounzip.ts tests/output/calgary-bad.nzip -t",
61
+ "neounzip-bad-inmem": "npx ts-node src/neounzip.ts --in-memory tests/output/calgary-bad.nzip -t",
62
+ "neounzip-sm": "npx ts-node src/neounzip.ts -o tests/output/test-sm.nzip",
63
+ "neounzip-skip-blockchain": "npx ts-node src/neounzip.ts --skip-blockchain tests/output/calgary.nzip -t",
64
+ "neounzip-lg": "npx ts-node src/neounzip.ts tests/output/large.nzip -t",
65
+ "neounzip-stamp": "npx ts-node src/neounzip.ts tests/output/calgary-stamp.nzip -t",
66
+ "neounzip-stamp-upgrade": "npx ts-node src/neounzip.ts tests/output/calgary-stamp-upgrade.nzip -t",
67
+ "neounzip-ots": "npx ts-node src/neounzip.ts tests/output/calgary-ots.nzip -t",
68
+ "neounzip-ots-skip-blockchain": "npx ts-node src/neounzip.ts --skip-blockchain tests/output/calgary-ots.nzip -t",
69
+ "neounzip-streaming": "npx ts-node src/neounzip.ts --buffer-size 16384 --verbose tests/output/merged-test.nzip -t",
70
+ "neounzip-decrypt": "npx ts-node src/neounzip.ts --password 'pass123' tests/output/calgary-encrypted.nzip -t",
71
+ "neounzip-decrypt-inmem": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/calgary-encrypted.nzip -t",
72
+ "neounzip-decrypt-stored": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/calgary-encrypted-stored.nzip -t",
73
+ "neounzip-decrypt-sm": "npx ts-node src/neounzip.ts --password 'pass123' tests/output/encrypted-sm.nzip -t",
74
+ "neounzip-decrypt-sm-inmem": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/encrypted-sm.nzip -t",
75
+ "neounzip-decrypt-pkzip": "npx ts-node src/neounzip.ts --pkzip-decrypt --password 'legacy-test-123' tests/output/calgary-pkzip.nzip -t",
77
76
  "neounzip-help": "npx ts-node src/neounzip.ts --help",
78
- "neolist": "npx ts-node src/neolist.ts output/calgary.nzip",
79
- "neolist-inmem": "npx ts-node src/neolist.ts --in-memory output/calgary.nzip",
80
- "neolist-basic": "npx ts-node src/neolist.ts -b output/calgary.nzip",
81
- "neolist-verbose": "npx ts-node src/neolist.ts -v output/calgary.nzip",
82
- "neolist-demo": "npx ts-node src/neolist.ts output/calgary.nzip",
83
- "neolist-short": "npx ts-node src/neolist.ts -s output/calgary.nzip",
84
- "neolist-unix": "npx ts-node src/neolist.ts -u output/calgary.nzip",
85
- "neolist-json": "npx ts-node src/neolist.ts -j output/calgary.nzip",
86
- "neolist-zip64": "npx ts-node src/neolist.ts test-suite/calgary-zip64.zip",
77
+ "neolist": "npx ts-node src/neolist.ts tests/output/calgary.nzip",
78
+ "neolist-inmem": "npx ts-node src/neolist.ts --in-memory tests/output/calgary.nzip",
79
+ "neolist-basic": "npx ts-node src/neolist.ts -b tests/output/calgary.nzip",
80
+ "neolist-verbose": "npx ts-node src/neolist.ts -v tests/output/calgary.nzip",
81
+ "neolist-demo": "npx ts-node src/neolist.ts tests/output/calgary.nzip",
82
+ "neolist-short": "npx ts-node src/neolist.ts -s tests/output/calgary.nzip",
83
+ "neolist-unix": "npx ts-node src/neolist.ts -u tests/output/calgary.nzip",
84
+ "neolist-json": "npx ts-node src/neolist.ts -j tests/output/calgary.nzip",
85
+ "neolist-zip64": "npx ts-node src/neolist.ts tests/fixtures/calgary-zip64.zip",
86
+ "neolist-stamp": "npx ts-node src/neolist.ts tests/output/calgary-stamp.nzip",
87
+ "neolist-stamp-upgrade": "npx ts-node src/neolist.ts tests/output/calgary-stamp-upgrade.nzip",
87
88
  "neolist-help": "npx ts-node src/neolist.ts --help",
88
- "infozip-encrypt-zip": "zip -e -P 'pass123' -r test-infozip/calgary-encrypted.zip test-suite/calgary/*",
89
- "infozip-encrypt-sm": "zip -e -P 'pass123' -0 test-infozip/encrypted-sm.zip test-suite/test-sm/*",
90
- "infozip-encrypt-stored": "zip -e -P 'pass123' -0 test-infozip/calgary-encrypted-stored.zip test-suite/calgary/bib",
91
- "infozip-decrypt-zip": "unzip -P 'pass123' -t test-infozip/calgary-encrypted.zip",
92
- "infozip-decrypt-sm": "unzip -P 'pass123' -t test-infozip/encrypted-sm.zip",
93
- "test": "node test-scripts/test-runner.js",
94
- "test:verbose": "node test-scripts/test-runner.js --verbose",
95
- "test:help": "node test-scripts/test-runner.js --help",
96
- "test:comprehensive": "node test-scripts/comprehensive/run-all-tests.js",
97
- "test:neozip": "node test-scripts/comprehensive/test-neozip-options.js",
98
- "test:neounzip": "node test-scripts/comprehensive/test-neounzip-options.js",
99
- "test:neolist": "node test-scripts/comprehensive/test-neolist-options.js",
89
+ "infozip-encrypt-zip": "zip -e -P 'pass123' -r tests/fixtures/infozip/calgary-encrypted.zip tests/fixtures/calgary/*",
90
+ "infozip-encrypt-sm": "zip -e -P 'pass123' -0 tests/fixtures/infozip/encrypted-sm.zip tests/fixtures/test-sm/*",
91
+ "infozip-encrypt-stored": "zip -e -P 'pass123' -0 tests/fixtures/infozip/calgary-encrypted-stored.zip tests/fixtures/calgary/bib",
92
+ "infozip-decrypt-zip": "unzip -P 'pass123' -t tests/fixtures/infozip/calgary-encrypted.zip",
93
+ "infozip-decrypt-sm": "unzip -P 'pass123' -t tests/fixtures/infozip/encrypted-sm.zip",
94
+ "test": "node tests/scripts/test-runner.js",
95
+ "test:verbose": "node tests/scripts/test-runner.js --verbose",
96
+ "test:help": "node tests/scripts/test-runner.js --help",
97
+ "test:comprehensive": "node tests/scripts/comprehensive/run-all-tests.js",
98
+ "test:neozip": "node tests/scripts/comprehensive/test-neozip-options.js",
99
+ "test:neounzip": "node tests/scripts/comprehensive/test-neounzip-options.js",
100
+ "test:neolist": "node tests/scripts/comprehensive/test-neolist-options.js",
100
101
  "test:encryption": "npm run neozip-encrypt && npm run neounzip-decrypt && echo '✅ All encryption tests completed successfully!'",
101
- "test:infozip-decrypt": "npx ts-node test-scripts/test-infozip-decrypt.ts",
102
- "test:comments": "node test-scripts/comprehensive/test-comments-options.js",
103
- "test:update": "node test-scripts/test-update-option.js",
104
- "test:symlinks": "echo '=== Testing Symbolic Links ===' && rm -rf test-symlinks && rm -rf test-output/symlinks* 2>/dev/null; rm -rf output/symlinks*.nzip 2>/dev/null; mkdir -p test-symlinks && echo 'This is the target file content' > test-symlinks/target.txt && ln -sf target.txt test-symlinks/symlink.txt && echo -e '\\n--- Original files ---' && ls -la test-symlinks/ && echo -e '\\n--- Creating ZIP with -y (store symlinks) ---' && npx ts-node src/neozip.ts -y output/symlinks-test.nzip test-symlinks/* && echo -e '\\n--- Extracting with -y (restore symlinks) ---' && mkdir -p test-output/symlinks && npx ts-node src/neounzip.ts -y output/symlinks-test.nzip test-output/symlinks/ && echo -e '\\n--- Extracted files ---' && ls -la test-output/symlinks/test-symlinks/ 2>/dev/null || ls -la test-output/symlinks/ && echo -e '\\n--- Testing symlink functionality ---' && (test -L test-output/symlinks/test-symlinks/symlink.txt 2>/dev/null && cat test-output/symlinks/test-symlinks/symlink.txt > /dev/null 2>&1 && echo '✅ PASS: Symlink test completed successfully') || (test -L test-output/symlinks/symlink.txt 2>/dev/null && cat test-output/symlinks/symlink.txt > /dev/null 2>&1 && echo '✅ PASS: Symlink test completed successfully') || echo '❌ FAIL: Symlink was not created or does not work' && echo -e '\\n--- Creating ZIP without -y (follow symlinks) ---' && npx ts-node src/neozip.ts output/symlinks-follow.nzip test-symlinks/* && echo -e '\\n--- Extracting without -y (regular files) ---' && mkdir -p test-output/symlinks-follow && npx ts-node src/neounzip.ts output/symlinks-follow.nzip test-output/symlinks-follow/ && echo -e '\\n--- Extracted files (no symlinks) ---' && ls -la test-output/symlinks-follow/test-symlinks/ 2>/dev/null || ls -la test-output/symlinks-follow/ && rm -rf test-symlinks && rm -rf test-output/symlinks* 2>/dev/null; rm -rf output/symlinks*.nzip 2>/dev/null",
105
- "test:hardlinks": "echo '=== Testing Hard Links ===' && rm -rf test-hardlinks && rm -rf test-output/hardlinks* 2>/dev/null; rm -rf output/hardlinks*.nzip 2>/dev/null; mkdir -p test-hardlinks && echo 'This is the original file content for hard link testing' > test-hardlinks/original.txt && ln test-hardlinks/original.txt test-hardlinks/hardlink1.txt && ln test-hardlinks/original.txt test-hardlinks/hardlink2.txt && echo -e '\\n--- Original files (note same inode numbers) ---' && ls -li test-hardlinks/ && echo -e '\\n--- Creating ZIP with -H (detect hard links) ---' && npx ts-node src/neozip.ts -H output/hardlinks-test.nzip test-hardlinks/* && echo -e '\\n--- Extracting with -H (restore hard links) ---' && mkdir -p test-output/hardlinks && npx ts-node src/neounzip.ts -H output/hardlinks-test.nzip test-output/hardlinks/ && echo -e '\\n--- Extracted files (note same inode numbers) ---' && ls -li test-output/hardlinks/test-hardlinks/ 2>/dev/null || ls -li test-output/hardlinks/ && echo -e '\\n--- Testing hard link functionality ---' && HARD_LINK1=\"test-output/hardlinks/test-hardlinks/hardlink1.txt\"; HARD_LINK2=\"test-output/hardlinks/test-hardlinks/hardlink2.txt\"; ORIGINAL=\"test-output/hardlinks/test-hardlinks/original.txt\"; test -f \"$HARD_LINK1\" || HARD_LINK1=\"test-output/hardlinks/hardlink1.txt\"; test -f \"$HARD_LINK2\" || HARD_LINK2=\"test-output/hardlinks/hardlink2.txt\"; test -f \"$ORIGINAL\" || ORIGINAL=\"test-output/hardlinks/original.txt\"; (test -f \"$HARD_LINK1\" && test -f \"$ORIGINAL\" && echo 'Modified content' >> \"$HARD_LINK1\" 2>/dev/null && cat \"$ORIGINAL\" > /dev/null 2>&1 && echo '✅ PASS: Hard links test (with -H) completed') || echo '⚠️ WARN: Hard links extraction may have issues' && echo -e '\\n--- Creating ZIP without -H (store as copies) ---' && npx ts-node src/neozip.ts output/hardlinks-copies.nzip test-hardlinks/* && echo -e '\\n--- Extracting without -H (separate files) ---' && mkdir -p test-output/hardlinks-copies && npx ts-node src/neounzip.ts output/hardlinks-copies.nzip test-output/hardlinks-copies/ && echo -e '\\n--- Extracted files (different inodes) ---' && ls -li test-output/hardlinks-copies/test-hardlinks/ 2>/dev/null || ls -li test-output/hardlinks-copies/ && echo -e '\\n=== TEST SUMMARY ===' && (test -f test-output/hardlinks-copies/test-hardlinks/original.txt 2>/dev/null || test -f test-output/hardlinks-copies/original.txt 2>/dev/null) && echo '✅ PASS: Hard links test completed successfully' || echo '❌ FAIL: Some hard link tests failed' && rm -rf test-hardlinks && rm -rf test-output/hardlinks* 2>/dev/null; rm -rf output/hardlinks*.nzip 2>/dev/null",
106
- "test:stdin": "echo '=== Testing Stdin Filenames ===' && mkdir -p test-stdin && echo 'Test file 1' > test-stdin/file1.txt && echo 'Test file 2' > test-stdin/file2.txt && echo 'Test file 3' > test-stdin/file3.txt && echo '' && echo '--- Testing stdin filenames with -@ ---' && printf 'test-stdin/file1.txt\\ntest-stdin/file2.txt\\ntest-stdin/file3.txt\\n' | npx ts-node src/neozip.ts -@ test-stdin.zip && echo '' && echo '--- Verifying archive contents ---' && npx ts-node src/neolist.ts test-stdin.zip && echo '' && echo '--- Testing with find command ---' && find test-stdin -name '*.txt' | npx ts-node src/neozip.ts -@ test-stdin-find.zip && npx ts-node src/neolist.ts test-stdin-find.zip && echo '' && echo '--- Cleanup ---' && rm -rf test-stdin test-stdin.zip test-stdin-find.zip && echo '✅ Stdin filenames test completed successfully!'",
107
- "test:eocd": "npx ts-node test-scripts/test-eocd-loading.ts",
108
- "test:copy-entry": "npx ts-node test-scripts/test-copy-entry-streaming.ts",
109
- "test:tampered-zip": "npx ts-node test-scripts/test-tampered-verification.ts",
110
- "test:upgrade-zip": "echo '=== Testing ZIP Upgrade ===' && mkdir -p output && echo '' && echo '--- Creating initial ZIP with Calgary corpus files (deflate compression) ---' && npx ts-node src/neozip.ts --deflate output/test-upgrade.nzip test-suite/calgary/bib test-suite/calgary/book1 test-suite/calgary/book2 && echo '' && echo '--- Upgrading ZIP for tokenization ---' && npx ts-node src/neozip.ts --upgrade output/test-upgrade.nzip && echo '' && echo '--- Listing upgraded ZIP contents ---' && npx ts-node src/neolist.ts output/test-upgrade-tokenized.nzip && echo '' && echo '--- Verifying upgraded ZIP with neounzip -t ---' && npx ts-node src/neounzip.ts -t output/test-upgrade-tokenized.nzip && echo '' && echo '✅ ZIP upgrade test completed successfully!'",
111
- "test:pre-verify": "echo '=== Testing Pre-Verify Option (-T) ===' && echo '' && echo '--- Testing pre-verify on tokenized ZIP ---' && npx ts-node src/neounzip.ts -T output/test-upgrade-tokenized.nzip test-output/preverify/ && echo '' && echo '--- Testing pre-verify on non-tokenized ZIP ---' && npx ts-node src/neozip.ts --deflate output/test-preverify-nontoken.nzip test-suite/calgary/bib test-suite/calgary/book1 test-suite/calgary/book2 && npx ts-node src/neounzip.ts -T output/test-preverify-nontoken.nzip test-output/preverify-nontoken/ && rm -rf test-output/preverify* output/test-preverify-nontoken.nzip 2>/dev/null && echo '' && echo '✅ Pre-verify test completed successfully!'",
112
- "test:package": "node scripts/test-package.js",
113
- "switch:neozipkit:npm": "node scripts/switch-neozipkit.js npm",
114
- "switch:neozipkit:local": "node scripts/switch-neozipkit.js local",
115
- "switch:neozipkit:status": "node scripts/switch-neozipkit.js status"
102
+ "test:stamp": "echo '=== Testing Timestamp Support ===' && npm run neozip-ots && npm run neounzip-ots && echo '' && echo '--- Zipstamp (may fail if server unreachable) ---' && (npm run neozip-zipstamp && npm run neounzip-zipstamp && echo '✅ Zipstamp tests completed') || echo '⚠️ Zipstamp skipped (server may be unreachable)' && echo '' && echo '✅ Timestamp tests completed successfully!'",
103
+ "test:infozip-decrypt": "npx ts-node tests/scripts/test-infozip-decrypt.ts",
104
+ "test:comments": "node tests/scripts/comprehensive/test-comments-options.js",
105
+ "test:update": "node tests/scripts/test-update-option.js",
106
+ "test:symlinks": "echo '=== Testing Symbolic Links ===' && rm -rf tests/output/symlinks-temp && rm -rf tests/output/symlinks* 2>/dev/null; rm -rf tests/output/symlinks*.nzip 2>/dev/null; mkdir -p tests/output/symlinks-temp && echo 'This is the target file content' > tests/output/symlinks-temp/target.txt && ln -sf target.txt tests/output/symlinks-temp/symlink.txt && echo -e '\\n--- Original files ---' && ls -la tests/output/symlinks-temp/ && echo -e '\\n--- Creating ZIP with -y (store symlinks) ---' && npx ts-node src/neozip.ts -y tests/output/symlinks-test.nzip tests/output/symlinks-temp/* && echo -e '\\n--- Extracting with -y (restore symlinks) ---' && mkdir -p tests/output/symlinks && npx ts-node src/neounzip.ts -y tests/output/symlinks-test.nzip tests/output/symlinks/ && echo -e '\\n--- Extracted files ---' && ls -la tests/output/symlinks/tests/output/symlinks-temp/ 2>/dev/null || ls -la tests/output/symlinks/ && echo -e '\\n--- Testing symlink functionality ---' && (test -L tests/output/symlinks/tests/output/symlinks-temp/symlink.txt 2>/dev/null && cat tests/output/symlinks/tests/output/symlinks-temp/symlink.txt > /dev/null 2>&1 && echo '✅ PASS: Symlink test completed successfully') || (test -L tests/output/symlinks/symlink.txt 2>/dev/null && cat tests/output/symlinks/symlink.txt > /dev/null 2>&1 && echo '✅ PASS: Symlink test completed successfully') || echo '❌ FAIL: Symlink was not created or does not work' && echo -e '\\n--- Creating ZIP without -y (follow symlinks) ---' && npx ts-node src/neozip.ts tests/output/symlinks-follow.nzip tests/output/symlinks-temp/* && echo -e '\\n--- Extracting without -y (regular files) ---' && mkdir -p tests/output/symlinks-follow && npx ts-node src/neounzip.ts tests/output/symlinks-follow.nzip tests/output/symlinks-follow/ && echo -e '\\n--- Extracted files (no symlinks) ---' && ls -la tests/output/symlinks-follow/tests/output/symlinks-temp/ 2>/dev/null || ls -la tests/output/symlinks-follow/ && rm -rf tests/output/symlinks-temp && rm -rf tests/output/symlinks* 2>/dev/null; rm -rf tests/output/symlinks*.nzip 2>/dev/null",
107
+ "test:hardlinks": "echo '=== Testing Hard Links ===' && rm -rf tests/output/hardlinks-temp && rm -rf tests/output/hardlinks* 2>/dev/null; rm -rf tests/output/hardlinks*.nzip 2>/dev/null; mkdir -p tests/output/hardlinks-temp && echo 'This is the original file content for hard link testing' > tests/output/hardlinks-temp/original.txt && ln tests/output/hardlinks-temp/original.txt tests/output/hardlinks-temp/hardlink1.txt && ln tests/output/hardlinks-temp/original.txt tests/output/hardlinks-temp/hardlink2.txt && echo -e '\\n--- Original files (note same inode numbers) ---' && ls -li tests/output/hardlinks-temp/ && echo -e '\\n--- Creating ZIP with -H (detect hard links) ---' && npx ts-node src/neozip.ts -H tests/output/hardlinks-test.nzip tests/output/hardlinks-temp/* && echo -e '\\n--- Extracting with -H (restore hard links) ---' && mkdir -p tests/output/hardlinks && npx ts-node src/neounzip.ts -H tests/output/hardlinks-test.nzip tests/output/hardlinks/ && echo -e '\\n--- Extracted files (note same inode numbers) ---' && ls -li tests/output/hardlinks/tests/output/hardlinks-temp/ 2>/dev/null || ls -li tests/output/hardlinks/ && echo -e '\\n--- Testing hard link functionality ---' && HARD_LINK1=\"tests/output/hardlinks/tests/output/hardlinks-temp/hardlink1.txt\"; HARD_LINK2=\"tests/output/hardlinks/tests/output/hardlinks-temp/hardlink2.txt\"; ORIGINAL=\"tests/output/hardlinks/tests/output/hardlinks-temp/original.txt\"; test -f \"$HARD_LINK1\" || HARD_LINK1=\"tests/output/hardlinks/hardlink1.txt\"; test -f \"$HARD_LINK2\" || HARD_LINK2=\"tests/output/hardlinks/hardlink2.txt\"; test -f \"$ORIGINAL\" || ORIGINAL=\"tests/output/hardlinks/original.txt\"; (test -f \"$HARD_LINK1\" && test -f \"$ORIGINAL\" && echo 'Modified content' >> \"$HARD_LINK1\" 2>/dev/null && cat \"$ORIGINAL\" > /dev/null 2>&1 && echo ' PASS: Hard links test (with -H) completed') || echo '⚠️ WARN: Hard links extraction may have issues' && echo -e '\\n--- Creating ZIP without -H (store as copies) ---' && npx ts-node src/neozip.ts tests/output/hardlinks-copies.nzip tests/output/hardlinks-temp/* && echo -e '\\n--- Extracting without -H (separate files) ---' && mkdir -p tests/output/hardlinks-copies && npx ts-node src/neounzip.ts tests/output/hardlinks-copies.nzip tests/output/hardlinks-copies/ && echo -e '\\n--- Extracted files (different inodes) ---' && ls -li tests/output/hardlinks-copies/tests/output/hardlinks-temp/ 2>/dev/null || ls -li tests/output/hardlinks-copies/ && echo -e '\\n=== TEST SUMMARY ===' && (test -f tests/output/hardlinks-copies/tests/output/hardlinks-temp/original.txt 2>/dev/null || test -f tests/output/hardlinks-copies/original.txt 2>/dev/null) && echo '✅ PASS: Hard links test completed successfully' || echo '❌ FAIL: Some hard link tests failed' && rm -rf tests/output/hardlinks-temp && rm -rf tests/output/hardlinks* 2>/dev/null; rm -rf tests/output/hardlinks*.nzip 2>/dev/null",
108
+ "test:stdin": "echo '=== Testing Stdin Filenames ===' && mkdir -p tests/output/stdin-temp && echo 'Test file 1' > tests/output/stdin-temp/file1.txt && echo 'Test file 2' > tests/output/stdin-temp/file2.txt && echo 'Test file 3' > tests/output/stdin-temp/file3.txt && echo '' && echo '--- Testing stdin filenames with -@ ---' && printf 'tests/output/stdin-temp/file1.txt\\ntests/output/stdin-temp/file2.txt\\ntests/output/stdin-temp/file3.txt\\n' | npx ts-node src/neozip.ts -@ tests/output/test-stdin.zip && echo '' && echo '--- Verifying archive contents ---' && npx ts-node src/neolist.ts tests/output/test-stdin.zip && echo '' && echo '--- Testing with find command ---' && find tests/output/stdin-temp -name '*.txt' | npx ts-node src/neozip.ts -@ tests/output/test-stdin-find.zip && npx ts-node src/neolist.ts tests/output/test-stdin-find.zip && echo '' && echo '--- Cleanup ---' && rm -rf tests/output/stdin-temp tests/output/test-stdin.zip tests/output/test-stdin-find.zip && echo '✅ Stdin filenames test completed successfully!'",
109
+ "test:eocd": "npx ts-node tests/scripts/test-eocd-loading.ts",
110
+ "test:copy-entry": "npx ts-node tests/scripts/test-copy-entry-streaming.ts",
111
+ "test:tampered-zip": "npx ts-node tests/scripts/test-tampered-verification.ts",
112
+ "test:upgrade-zip": "echo '=== Testing ZIP Upgrade ===' && mkdir -p tests/output && echo '' && echo '--- Creating initial ZIP with Calgary corpus files (deflate compression) ---' && npx ts-node src/neozip.ts --deflate tests/output/test-upgrade.nzip tests/fixtures/calgary/bib tests/fixtures/calgary/book1 tests/fixtures/calgary/book2 && echo '' && echo '--- Upgrading ZIP for tokenization ---' && npx ts-node src/neozip.ts --upgrade tests/output/test-upgrade.nzip && echo '' && echo '--- Listing upgraded ZIP contents ---' && npx ts-node src/neolist.ts tests/output/test-upgrade-tokenized.nzip && echo '' && echo '--- Verifying upgraded ZIP with neounzip -t ---' && npx ts-node src/neounzip.ts -t tests/output/test-upgrade-tokenized.nzip && echo '' && echo '✅ ZIP upgrade test completed successfully!'",
113
+ "test:pre-verify": "echo '=== Testing Pre-Verify Option (-T) ===' && echo '' && echo '--- Testing pre-verify on tokenized ZIP ---' && npx ts-node src/neounzip.ts -T tests/output/test-upgrade-tokenized.nzip tests/output/preverify/ && echo '' && echo '--- Testing pre-verify on non-tokenized ZIP ---' && npx ts-node src/neozip.ts --deflate tests/output/test-preverify-nontoken.nzip tests/fixtures/calgary/bib tests/fixtures/calgary/book1 tests/fixtures/calgary/book2 && npx ts-node src/neounzip.ts -T tests/output/test-preverify-nontoken.nzip tests/output/preverify-nontoken/ && rm -rf tests/output/preverify* tests/output/test-preverify-nontoken.nzip 2>/dev/null && echo '' && echo '✅ Pre-verify test completed successfully!'",
114
+ "test:package": "node tests/scripts/test-package.js",
115
+ "switch:neozipkit:dev": "node scripts/switch-neozip-blockchain.js dev neozipkit",
116
+ "switch:neozipkit:prod": "node scripts/switch-neozip-blockchain.js prod neozipkit",
117
+ "switch:neozipkit:status": "node scripts/switch-neozip-blockchain.js status neozipkit",
118
+ "switch:neozip-blockchain:dev": "node scripts/switch-neozip-blockchain.js dev neozip-blockchain",
119
+ "switch:neozip-blockchain:prod": "node scripts/switch-neozip-blockchain.js prod neozip-blockchain",
120
+ "switch:neozip-blockchain:status": "node scripts/switch-neozip-blockchain.js status neozip-blockchain"
116
121
  },
117
122
  "keywords": [
118
123
  "zip",
@@ -141,14 +146,15 @@
141
146
  "minimatch": "^10.0.3",
142
147
  "moment": "^2.29.4",
143
148
  "moment-timezone": "^0.5.43",
149
+ "neozip-blockchain": "npm:neozip-blockchain@latest",
150
+ "neozipkit": "npm:neozipkit@latest",
144
151
  "opentimestamps": "^0.4.9",
145
152
  "ora": "^5.4.1",
146
153
  "pako": "^2.1.0",
147
154
  "ts-node": "^10.9.1",
148
155
  "typescript": "^5.0.0",
149
156
  "uuid": "^9.0.0",
150
- "web3": "^4.0.0",
151
- "neozipkit": "^0.3.1"
157
+ "web3": "^4.0.0"
152
158
  },
153
159
  "devDependencies": {
154
160
  "@types/chalk": "^2.2.4",
@@ -170,5 +176,5 @@
170
176
  "url": "https://github.com/NeoWareInc/neozip-support/issues"
171
177
  },
172
178
  "homepage": "https://github.com/NeoWareInc/neozip-cli#readme",
173
- "packageManager": "yarn@1.22.19"
179
+ "packageManager": "yarn@4.12.0"
174
180
  }