|
| 1 | +#! /usr/bin/env node |
| 2 | +/* eslint-disable @typescript-eslint/no-var-requires */ |
| 3 | + |
| 4 | +const lzString = require("../dist/index.cjs"); |
| 5 | +const fs = require("fs"); |
| 6 | +const pkg = require("../package.json"); |
| 7 | +const { Option, program } = require("commander"); |
| 8 | + |
| 9 | +function compressContent(format, content) { |
| 10 | + switch (format) { |
| 11 | + case "base64": |
| 12 | + return lzString.compressToBase64(content); |
| 13 | + case "encodeduri": |
| 14 | + return lzString.compressToEncodedURIComponent(content); |
| 15 | + case "raw": |
| 16 | + default: |
| 17 | + return lzString.compress(content); |
| 18 | + case "uint8array": |
| 19 | + return lzString.compressToUint8Array(content); |
| 20 | + case "utf16": |
| 21 | + return lzString.compressToUTF16(content); |
| 22 | + } |
| 23 | +} |
| 24 | + |
| 25 | +function decompressContent(format, content) { |
| 26 | + switch (format) { |
| 27 | + case "base64": |
| 28 | + return lzString.decompressFromBase64(content); |
| 29 | + case "encodeduri": |
| 30 | + return lzString.decompressFromEncodedURIComponent(content); |
| 31 | + case "raw": |
| 32 | + default: |
| 33 | + return lzString.decompress(content); |
| 34 | + case "uint8array": |
| 35 | + return lzString.decompressFromUint8Array(content); |
| 36 | + case "utf16": |
| 37 | + return lzString.decompressFromUTF16(content); |
| 38 | + } |
| 39 | +} |
| 40 | + |
| 41 | +program |
| 42 | + .version(pkg.version) |
| 43 | + .description("Use lz-string to compress or decompress a file") |
| 44 | + .addOption(new Option("-d, --decompress", "if unset then this will compress")) |
| 45 | + .addOption( |
| 46 | + new Option("-f, --format <type>", "formatter to use") |
| 47 | + .choices(["base64", "encodeduri", "raw", "uint8array", "utf16"]) |
| 48 | + .default("raw"), |
| 49 | + ) |
| 50 | + .addOption(new Option("-v, --validate", "validate before returning").default(true)) |
| 51 | + .addOption(new Option("-o, --output <output-file>", "output file")) |
| 52 | + .addOption(new Option("-q, --quiet", "don't print any error messages")) |
| 53 | + .argument("<input-file>", "file to process") |
| 54 | + .showHelpAfterError() |
| 55 | + .action((file, { format, decompress, output, quiet, validate }) => { |
| 56 | + if (!fs.existsSync(file)) { |
| 57 | + if (!quiet) process.stderr.write(`Unable to find ${file}`); |
| 58 | + process.exit(1); |
| 59 | + } |
| 60 | + try { |
| 61 | + fs.accessSync(file, fs.constants.R_OK); |
| 62 | + } catch { |
| 63 | + if (!quiet) process.stderr.write(`Unable to read ${file}`); |
| 64 | + process.exit(1); |
| 65 | + } |
| 66 | + const unprocessed = fs.readFileSync(file).toString(); |
| 67 | + const processed = decompress ? decompressContent(format, unprocessed) : compressContent(format, unprocessed); |
| 68 | + |
| 69 | + if (validate) { |
| 70 | + const validated = decompress ? compressContent(format, processed) : decompressContent(format, processed); |
| 71 | + let valid = unprocessed.length === validated.length; |
| 72 | + |
| 73 | + for (let i = 0; valid && i < unprocessed.length; i++) { |
| 74 | + if (unprocessed[i] !== validated[i]) { |
| 75 | + valid = false; |
| 76 | + } |
| 77 | + } |
| 78 | + if (!valid) { |
| 79 | + if (!quiet) process.stderr.write(`Unable to validate ${file}`); |
| 80 | + process.exit(1); |
| 81 | + } |
| 82 | + } |
| 83 | + if (processed == null) { |
| 84 | + if (!quiet) process.stderr.write(`Unable to process ${file}`); |
| 85 | + process.exit(1); |
| 86 | + } |
| 87 | + if (output) { |
| 88 | + fs.writeFileSync(output, processed, null); |
| 89 | + } else { |
| 90 | + process.stdout.write(processed); |
| 91 | + } |
| 92 | + }) |
| 93 | + .parse(); |
0 commit comments