{"_id":"@devstacks/packager","_rev":"3-5b59e5e5c52c55a0c2de280f8fe1fb11","name":"@devstacks/packager","dist-tags":{"latest":"0.20.2"},"versions":{"0.20.0":{"name":"@devstacks/packager","version":"0.20.0","keywords":["package","packaging","deploy","deployment","compress","archive","sign","signature"],"author":{"name":"Moacir Braga","email":"me@moacirbrg.com"},"license":"MIT","_id":"@devstacks/packager@0.20.0","maintainers":[{"name":"moacirbrg","email":"me@moacirbrg.com"}],"homepage":"https://github.com/devstacks-software-engineering/packager#readme","bugs":{"url":"https://github.com/devstacks-software-engineering/packager/issues"},"bin":{"packager":"bin/packager.js"},"dist":{"shasum":"11746483ec04288c7e82c8a4716df40cc1c9d189","tarball":"https://registry.npmjs.org/@devstacks/packager/-/packager-0.20.0.tgz","fileCount":55,"integrity":"sha512-5jRuSDRUkKWAQfx342Xz1exdz7CeT1KvnufUjfvlFQZIX35k67M5dQQbeppCi/QFt3hB8H8JnGdVbiN8mntnQA==","signatures":[{"sig":"MEUCIFyTZiFUA8Yjhcg5gPvO7WPJs+DI2flNljJGTMqkb9+cAiEAhGSGJy8UDi/SeUhv7MmeW29hryU1ntwKll1Nc3WFv6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205209},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=22.0.0"},"gitHead":"f5d5efd434681d78bb4de35f385f0c18e0df97e3","scripts":{"dev":"node --loader ts-node/esm src/cli/index.ts","lint":"eslint 'src/**/*.ts' 'vitest/**/*.ts'","test":"vitest run","build":"tsc -p tsconfig.json && node tools/update-version.js","clean":"rimraf dist","start":"node ./bin/packager.js","coverage":"vitest run --coverage","lint:fix":"eslint 'src/**/*.ts' 'vitest/**/*.ts' --fix","typecheck":"tsc --noEmit --pretty --incremental false","publish:npm":"npm publish --access public","publish:local":"npm uninstall -g @devstacks/packager && npm run build && npm link","coverage:report":"vitest run --coverage && open coverage/lcov-report/index.html"},"_npmUser":{"name":"moacirbrg","email":"me@moacirbrg.com"},"repository":{"url":"git+https://github.com/devstacks-software-engineering/packager.git","type":"git"},"_npmVersion":"11.1.0","description":"A versatile utility for archiving, compressing, and signing deployment files.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ora":"^8.2.0","zod":"^3.24.4","glob":"^11.0.2","chalk":"^5.4.1","inquirer":"^12.6.0","commander":"^13.1.0","tweetnacl":"^1.0.3","mime-types":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"execa":"^9.5.3","eslint":"^9.26.0","rimraf":"^5.0.5","vitest":"^3.1.3","ts-node":"^10.9.2","@eslint/js":"^9.26.0","typescript":"^5.8.3","@types/node":"^22.15.17","@types/inquirer":"^9.0.8","@eslint/eslintrc":"^3.3.1","@types/mime-types":"^2.1.4","vite-tsconfig-paths":"^5.1.4","@typescript-eslint/parser":"^8.32.0","@vitest/coverage-istanbul":"^3.1.3","@typescript-eslint/eslint-plugin":"^8.32.0"},"_npmOperationalInternal":{"tmp":"tmp/packager_0.20.0_1747231191677_0.6928367268702815","host":"s3://npm-registry-packages-npm-production"}},"0.20.1":{"name":"@devstacks/packager","version":"0.20.1","keywords":["package","packaging","deploy","deployment","compress","archive","sign","signature"],"author":{"name":"Moacir Braga","email":"me@moacirbrg.com"},"license":"MIT","_id":"@devstacks/packager@0.20.1","maintainers":[{"name":"moacirbrg","email":"me@moacirbrg.com"}],"homepage":"https://github.com/devstacks-software-engineering/packager/tree/main/base","bugs":{"url":"https://github.com/devstacks-software-engineering/packager/issues"},"bin":{"packager":"bin/packager.js"},"dist":{"shasum":"d87b5877de769feb2ae826d04d4498abbdfe3a84","tarball":"https://registry.npmjs.org/@devstacks/packager/-/packager-0.20.1.tgz","fileCount":55,"integrity":"sha512-tUJv2rU7WPKyV+moy0DpYwQtDMZ1CqhOy0eV7Y8tNxPkGnIy5qgJnxuwTbNVJxOCUkqnaVrWv4/mFi4rylQ2Ug==","signatures":[{"sig":"MEUCIQCsH+hGI8eJ/pWnDS2Exhkr43yKDQlbZ3uMNMy+Pye8MgIgBHTFmAGVlm2J8q72WbbZfPNhqfzvLs4VRJYKftMnO5c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205109},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=22.0.0"},"gitHead":"f819e98d27c650bbbc47a27c6c1467d55a0cdb57","scripts":{"dev":"node --loader ts-node/esm src/cli/index.ts","lint":"eslint 'src/**/*.ts' 'vitest/**/*.ts'","test":"vitest run","build":"tsc -p tsconfig.json","clean":"rimraf dist","start":"node ./bin/packager.js","coverage":"vitest run --coverage","lint:fix":"eslint 'src/**/*.ts' 'vitest/**/*.ts' --fix","prebuild":"npx @devstacks/versioner@latest create-ts ./src/cli/version.ts --single-quotes --semi","typecheck":"tsc --noEmit --pretty --incremental false","publish:npm":"npm publish --access public","publish:local":"npm uninstall -g @devstacks/packager && npm run build && npm link","coverage:report":"vitest run --coverage && open coverage/lcov-report/index.html"},"_npmUser":{"name":"moacirbrg","email":"me@moacirbrg.com"},"repository":{"url":"git+https://github.com/devstacks-software-engineering/packager.git","type":"git"},"_npmVersion":"11.1.0","description":"A versatile utility for archiving, compressing, and signing deployment files.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ora":"^8.2.0","zod":"^3.24.4","glob":"^11.0.2","chalk":"^5.4.1","inquirer":"^12.6.0","commander":"^13.1.0","tweetnacl":"^1.0.3","mime-types":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"execa":"^9.5.3","eslint":"^9.26.0","rimraf":"^5.0.5","vitest":"^3.1.3","ts-node":"^10.9.2","@eslint/js":"^9.26.0","typescript":"^5.8.3","@types/node":"^22.15.17","@types/inquirer":"^9.0.8","@eslint/eslintrc":"^3.3.1","@types/mime-types":"^2.1.4","vite-tsconfig-paths":"^5.1.4","@typescript-eslint/parser":"^8.32.0","@vitest/coverage-istanbul":"^3.1.3","@typescript-eslint/eslint-plugin":"^8.32.0"},"_npmOperationalInternal":{"tmp":"tmp/packager_0.20.1_1747274670821_0.2336077288066687","host":"s3://npm-registry-packages-npm-production"}},"0.20.2":{"name":"@devstacks/packager","version":"0.20.2","description":"A versatile utility for archiving, compressing, and signing deployment files.","keywords":["package","packaging","deploy","deployment","compress","archive","sign","signature"],"homepage":"https://github.com/devstacks-software-engineering/packager/tree/main/base","bugs":{"url":"https://github.com/devstacks-software-engineering/packager/issues"},"repository":{"type":"git","url":"git+https://github.com/devstacks-software-engineering/packager.git"},"license":"MIT","author":{"name":"Moacir Braga","email":"me@moacirbrg.com"},"main":"dist/src/index.js","types":"dist/src/index.d.ts","type":"module","bin":{"packager":"bin/packager.js"},"scripts":{"prebuild":"npx @devstacks/versioner@latest create-ts ./src/cli/version.ts --single-quotes --semi","clean":"rimraf dist","build":"tsc -p tsconfig.json","test":"vitest run","start":"node ./bin/packager.js","dev":"node --loader ts-node/esm src/cli/index.ts","lint":"eslint 'src/**/*.ts' 'vitest/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'vitest/**/*.ts' --fix","coverage":"vitest run --coverage","coverage:report":"vitest run --coverage && open coverage/lcov-report/index.html","publish:local":"npm uninstall -g @devstacks/packager && npm run build && npm link","publish:npm":"npm publish --access public","typecheck":"tsc --noEmit --pretty --incremental false"},"dependencies":{"chalk":"^5.4.1","commander":"^13.1.0","glob":"^11.0.2","inquirer":"^12.6.0","mime-types":"^3.0.1","ora":"^8.2.0","tweetnacl":"^1.0.3","zod":"^3.24.4"},"engines":{"node":">=22.0.0"},"devDependencies":{"@eslint/eslintrc":"^3.3.1","@eslint/js":"^9.26.0","@types/inquirer":"^9.0.8","@types/mime-types":"^2.1.4","@types/node":"^22.15.17","@typescript-eslint/eslint-plugin":"^8.32.0","@typescript-eslint/parser":"^8.32.0","@vitest/coverage-istanbul":"^3.1.3","eslint":"^9.26.0","execa":"^9.5.3","rimraf":"^5.0.5","ts-node":"^10.9.2","typescript":"^5.8.3","vite-tsconfig-paths":"^5.1.4","vitest":"^3.1.3"},"_id":"@devstacks/packager@0.20.2","gitHead":"76b4399ca41db351dc596a1b8989bd895a5cafee","_nodeVersion":"22.14.0","_npmVersion":"11.1.0","dist":{"integrity":"sha512-2ygjPFe4Sn5bvdTIBsLkR4dN4kwgDJxhjrtnseO0mFg+rTREM567I3zF04W5CQgK/kcnN3Zu4nniw7hmtujMqA==","shasum":"f5e180973db1d301538085edc7406afa35f88b0b","tarball":"https://registry.npmjs.org/@devstacks/packager/-/packager-0.20.2.tgz","fileCount":56,"unpackedSize":211613,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCYB4aq2xw/p8F1sQ/pRwIb0m8NMdL8UEtYZcrJ6/l81gIhAMhqeGgAzpjjOU4Ako5wthCuhfOfdWgTapSA4gTI2qle"}]},"_npmUser":{"name":"moacirbrg","email":"me@moacirbrg.com"},"directories":{},"maintainers":[{"name":"moacirbrg","email":"me@moacirbrg.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/packager_0.20.2_1747512366918_0.9493712977676383"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-14T13:59:51.585Z","modified":"2025-05-17T20:06:07.309Z","0.20.0":"2025-05-14T13:59:51.914Z","0.20.1":"2025-05-15T02:04:31.041Z","0.20.2":"2025-05-17T20:06:07.110Z"},"bugs":{"url":"https://github.com/devstacks-software-engineering/packager/issues"},"author":{"name":"Moacir Braga","email":"me@moacirbrg.com"},"license":"MIT","homepage":"https://github.com/devstacks-software-engineering/packager/tree/main/base","keywords":["package","packaging","deploy","deployment","compress","archive","sign","signature"],"repository":{"type":"git","url":"git+https://github.com/devstacks-software-engineering/packager.git"},"description":"A versatile utility for archiving, compressing, and signing deployment files.","maintainers":[{"name":"moacirbrg","email":"me@moacirbrg.com"}],"readme":"# @devstacks/packager\n\n[![npm version](https://img.shields.io/npm/v/@devstacks/packager)](https://www.npmjs.com/package/@devstacks/packager)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![codecov](https://codecov.io/gh/devstacks-software-engineering/packager/graph/badge.svg)](https://codecov.io/gh/devstacks-software-engineering/packager)\n\nA robust utility for archiving, compressing, and signing web applications for cross-platform deployment. Built with TypeScript and designed for both CLI and programmatic usage.\n\n## Features\n\n- **📦 Archiving**: Preserve directory structures with metadata\n- **🗜️ Compression**: Multiple algorithms (GZIP, Brotli, DEFLATE)\n- **🔑 Cryptography**: Ed25519 signing and verification\n- **🖥️ CLI**: Intuitive command-line interface\n- **⚡ API**: Fully typed, promise-based API\n- **🔒 Security**: Built with security best practices\n- **📏 Validation**: Comprehensive input validation with Zod\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [CLI Usage](#cli-usage)\n  - [Archive Operations](#archive-operations)\n  - [Compression Operations](#compression-operations)\n  - [Cryptography Operations](#cryptography-operations)\n  - [Complete Packaging](#complete-packaging)\n- [API Reference](#api-reference)\n  - [Archive](#archive)\n  - [Compression](#compression)\n  - [Cryptography](#cryptography)\n  - [Utilities](#utilities)\n- [Error Handling](#error-handling)\n- [Performance](#performance)\n- [Security](#security)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Installation\n\n### Prerequisites\n\n- Node.js 18.0.0 or later\n- npm 7.0.0 or later\n\n### Global Installation\n\nFor CLI usage:\n\n```bash\nnpm install -g @devstacks/packager\n```\n\n### Project Installation\n\nFor programmatic usage:\n\n```bash\nnpm install @devstacks/packager\n```\n\n### Using with npx\n\nFor one-off usage without installation:\n\n```bash\nnpx @devstacks/packager [command] [options]\n```\n\n## Quick Start\n\n1. **Create a package** (archive + compress + sign):\n\n```bash\n# Generate a key pair first\npackager generate-keys private.key public.key\n\n# Create a package\npackager package ./src ./dist/package.pkg --algorithm gzip --privkey private.key\n```\n\n2. **Use in your code**:\n\n```typescript\nimport { createPackage, CompressionAlgorithm } from '@devstacks/packager';\n\n// Create a package programmatically\nawait createPackage(\n  './src',\n  './dist/package.pkg',\n  {\n    algorithm: CompressionAlgorithm.GZIP,\n    privateKeyPath: './private.key'\n  }\n);\n```\n\n## CLI Usage\n\n### Archive Operations\n\n#### Archive a Directory\n\n```bash\n# Basic usage\npackager archive ./src ./output.archive\n\n# With include/exclude patterns\npackager archive ./src ./output.archive \\\n  --include \"**/*.html,**/*.js,**/*.css\" \\\n  --exclude \"**/*.map,**/node_modules/**,**/.git/**\"\n\n# Shorthand\npackager a ./src ./output.archive\n```\n\n#### Unarchive a File\n\n```bash\npackager unarchive ./output.archive ./extracted-files\n```\n\n### Compression Operations\n\n#### Compress a File\n\n```bash\n# Basic compression\npackager compress input.txt output.txt.gz\n\n# With specific algorithm and level (1-9)\npackager compress input.txt output.txt.gz --algorithm gzip --level 9\n\n# Archive directory before compressing\npackager compress ./src output.pkg --archive\n\n# Shorthand\npackager c input.txt output.txt.gz\n```\n\n#### Decompress a File\n\n```bash\n# Basic decompression\npackager decompress input.txt.gz output.txt\n\n# Auto-detect algorithm\npackager decompress input.compressed output.file\n\n# Shorthand\npackager d input.txt.gz output.txt\n```\n\n### Cryptography Operations\n\n#### Generate Key Pair\n\n```bash\n# Generate Ed25519 key pair\npackager generate-keys private.key public.key\n\n# Shorthand\npackager g private.key public.key\n```\n\n#### Sign a File\n\n```bash\n# Sign a file\npackager sign file.txt file.txt.sig --privkey private.key\n\n# Shorthand\npackager s file.txt file.txt.sig --privkey private.key\n```\n\n#### Verify a Signature\n\n```bash\n# Verify a signature\npackager verify file.txt file.txt.sig --pubkey public.key\n\n# Shorthand\npackager v file.txt file.txt.sig --pubkey public.key\n```\n\n### Complete Packaging\n\nCreate a complete package (archive + compress + sign) in one command:\n\n```bash\n# Basic package\npackager package ./src ./dist/package.pkg --algorithm gzip --privkey private.key\n\n# Shorthand\npackager pkg ./src ./dist/package.pkg --algorithm gzip --privkey private.key\n\n# Using the 'acs' shorthand (archive + compress + sign)\npackager acs ./src ./dist/package.pkg --algorithm gzip --privkey private.key\n\n# With include/exclude patterns\npackager acs ./src ./dist/package.pkg \\\n  --algorithm gzip \\\n  --privkey private.key \\\n  --include \"**/*.html,**/*.js,**/*.css\" \\\n  --exclude \"**/*.map\"\n```\n\n## API Reference\n\n### Archive\n\n#### `archiveDirectory(sourcePath: string, outputPath: string, options?: ArchiveOptions): Promise<void>`\n\nArchives a directory to a file.\n\n```typescript\nimport { archiveDirectory } from '@devstacks/packager';\n\nawait archiveDirectory('./src', './output.archive', {\n  include: ['**/*.js', '**/*.json'],\n  exclude: ['**/node_modules/**', '**/.git/**']\n});\n```\n\n**Options:**\n- `include`: Array of glob patterns to include\n- `exclude`: Array of glob patterns to exclude\n\n#### `unarchiveFile(archivePath: string, outputPath: string): Promise<void>`\n\nExtracts an archive to a directory.\n\n```typescript\nimport { unarchiveFile } from '@devstacks/packager';\n\nawait unarchiveFile('./output.archive', './extracted');\n```\n\n### Compression\n\n#### `compressFile(sourcePath: string, outputPath: string, options: CompressionOptions): Promise<void>`\n\nCompresses a file using the specified algorithm.\n\n```typescript\nimport { compressFile, CompressionAlgorithm } from '@devstacks/packager';\n\nawait compressFile('./input.txt', './output.txt.gz', {\n  algorithm: CompressionAlgorithm.GZIP,\n  level: 9\n});\n```\n\n**Options:**\n- `algorithm`: Compression algorithm (`GZIP`, `BROTLI`, or `DEFLATE`)\n- `level`: Compression level (1-9, higher is better compression but slower)\n\n#### `decompressFile(sourcePath: string, outputPath: string, options?: { algorithm?: CompressionAlgorithm }): Promise<void>`\n\nDecompresses a file.\n\n```typescript\nimport { decompressFile } from '@devstacks/packager';\n\nawait decompressFile('./input.txt.gz', './output.txt');\n```\n\n### Cryptography\n\n#### `generateAndSaveKeyPair(options: KeyPairOptions): Promise<void>`\n\nGenerates and saves an Ed25519 key pair.\n\n```typescript\nimport { generateAndSaveKeyPair } from '@devstacks/packager';\n\nawait generateAndSaveKeyPair({\n  privateKeyPath: './private.key',\n  publicKeyPath: './public.key'\n});\n```\n\n#### `signFile(sourcePath: string, outputPath: string, options: SignOptions): Promise<void>`\n\nSigns a file.\n\n```typescript\nimport { signFile } from '@devstacks/packager';\n\nawait signFile('./input.txt', './input.txt.sig', {\n  privateKeyPath: './private.key'\n});\n```\n\n#### `verifyFile(filePath: string, signaturePath: string, options: VerifyOptions): Promise<boolean>`\n\nVerifies a file's signature.\n\n```typescript\nimport { verifyFile } from '@devstacks/packager';\n\nconst isValid = await verifyFile(\n  './input.txt',\n  './input.txt.sig',\n  { publicKeyPath: './public.key' }\n);\n```\n\n### Utilities\n\n#### `createPackage(sourcePath: string, outputPath: string, options: PackageOptions): Promise<void>`\n\nCreates a complete package (archive + compress + sign).\n\n```typescript\nimport { createPackage, CompressionAlgorithm } from '@devstacks/packager';\n\nawait createPackage(\n  './src',\n  './dist/package.pkg',\n  {\n    algorithm: CompressionAlgorithm.GZIP,\n    privateKeyPath: './private.key',\n    include: ['**/*.js', '**/*.json'],\n    exclude: ['**/node_modules/**']\n  }\n);\n```\n\n## Error Handling\n\nAll API functions throw typed errors that extend the native `Error` class. Always use try/catch blocks:\n\n```typescript\ntry {\n  await createPackage('./src', './dist/package.pkg', {\n    algorithm: CompressionAlgorithm.GZIP,\n    privateKeyPath: './private.key'\n  });\n} catch (error) {\n  console.error('Package creation failed:', error.message);\n  if (error.code === 'ENOENT') {\n    console.error('File not found:', error.path);\n  }\n}\n```\n\n## Performance\n\n### Compression Algorithms\n\n| Algorithm | Best For | Compression | Speed | Native Support |\n|-----------|----------|-------------|-------|----------------|\n| GZIP      | General use | Good | Fast | Widely supported |\n| Brotli    | Web content | Excellent | Medium | Modern browsers |\n| DEFLATE   | Legacy systems | Good | Fast | Universal |\n\n### Memory Usage\n\nFor large files, consider streaming or chunking to manage memory usage. The library handles files larger than memory by default.\n\n## Security\n\n### Key Management\n\n- Always store private keys securely (never commit them to version control)\n- Use environment variables for sensitive data:\n\n```bash\nexport PRIVATE_KEY_PATH=\"/path/to/private.key\"\npackager sign file.txt file.txt.sig --privkey \"$PRIVATE_KEY_PATH\"\n```\n\n### Best Practices\n\n1. Always verify signatures before processing untrusted files\n2. Use strong compression levels (6-9) for sensitive data\n3. Keep your dependencies up to date\n4. Use the latest version of Node.js with security patches\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://github.com/devstacks-software-engineering/packager.git\ncd packager/base\nnpm install\n```\n\n### Building\n\n```bash\nnpm run build\n```\n\n### Testing\n\n```bash\n# Run tests\nnpm test\n\n# Run tests with coverage\nnpm run test:coverage\n\n# Run linting\nnpm run lint\n\n# Run type checking\nnpm run typecheck\n```\n\n### Local Development\n\nLink the package for local development:\n\n```bash\n# Build and link\nnpm run build\nnpm link\n\n# Now you can use it globally\npackager --version\n```\n\n## Contributing\n\nContributions are welcome! Please read our [Contributing Guidelines](CONTRIBUTING.md) before submitting pull requests.\n\n## License\n\nMIT © [DevStacks](https://devstacks.com)\n  CompressionAlgorithm.GZIP,\n  { privateKeyPath: '/path/to/private.key' }\n);\n```\n\n## Archive Format\n\nThe archive format is designed to be simple, efficient, and extensible:\n\n- **Header**: Contains signature, version, and number of entries\n- **Entry Table**: Contains offsets and sizes for each entry\n- **Entry Data**: Contains metadata (path, size, MIME type) and file data\n\n## Compression Algorithms\n\nThe packager supports multiple compression algorithms. The choice of algorithm can impact both the size of the compressed data and the performance of compression and decompression. Native platform support for decompression is a key factor in selecting an algorithm for optimal performance.\n\n### **DEFLATE**\n\n* **Description:**\n    * A lossless data compression algorithm that uses a combination of LZ77 and Huffman coding. It is the core algorithm for GZIP and ZIP.\n* **Best For Compression:**\n    * Good balance between compression ratio and speed; scenarios requiring low overhead.\n* **Native Decompression Support & Best Fit for Decompression:**\n    * **Windows (C#/.NET):**\n        * Native support via `System.IO.Compression.DeflateStream`.\n        * Fits well when decompressing data from GZIP or ZIP archives, or when a lightweight, fast decompression is needed.\n    * **Linux (Python with GTK):**\n        * Native support via the `zlib` standard library.\n        * Excellent fit for general-purpose decompression where `zlib` is readily available.\n    * **Android (Java/Kotlin):**\n        * Native support via `java.util.zip.InflaterInputStream` or `java.util.zip.Inflater`.\n        * A good choice for decompressing ZIP files or raw DEFLATE streams.\n    * **iOS/macOS (Swift):**\n        * Native support via Apple's Compression framework (using `Algorithm.zlib` or the C-level `COMPRESSION_ZLIB`).\n        * Ideal for decompressing raw DEFLATE streams or as the core for handling GZIP/ZIP data.\n\n\n### **GZIP**\n\n* **Description:**\n    * Based on DEFLATE, it adds a header and trailer with metadata, including a CRC32 checksum for error detection. Good compression ratio and widely compatible.\n* **Best For Compression:**\n    * General-purpose usage, especially for web content and file transfer where compatibility and integrity checks are valued.\n* **Native Decompression Support & Best Fit for Decompression:**\n    * **Windows (C#/.NET):**\n        * Native support via `System.IO.Compression.GZipStream`.\n        * Ideal for decompressing `.gz` files or HTTP content encoded with GZIP.\n    * **Linux (Python with GTK):**\n        * Native support via the `gzip` and `zlib` standard libraries.\n        * Widely used and fits well for decompressing files and web data.\n    * **Android (Java/Kotlin):**\n        * Native support via `java.util.zip.GZIPInputStream`.\n        * Commonly used for decompressing web responses and `.gz` files.\n    * **iOS/macOS (Swift):**\n        * Native support by using Apple's Compression framework with `Algorithm.zlib` (DEFLATE) and manually handling GZIP headers/trailers, or by leveraging common system libraries that wrap zlib for GZIP.\n        * Fits well for decompressing `.gz` files and GZIP-encoded web data.\n\n\n### **BROTLI**\n\n* **Description:**\n    * A modern algorithm offering better compression ratios than GZIP, especially for text-based data.\n* **Best For Compression:**\n    * When compression ratio is the highest priority, particularly for static web assets like HTML, CSS, and JavaScript.\n* **Native Decompression Support & Best Fit for Decompression:**\n    * **Windows (C#/.NET):**\n        * Native support available (e.g., `System.IO.Compression.BrotliStream` in .NET Core/5+).\n        * Best fit for decompressing Brotli-encoded web content or assets where the .NET runtime provides built-in support.\n    * **Linux (Python with GTK):**\n        * Native decompression typically requires external libraries (e.g., `brotli` PyPI package).\n        * Fits best when the environment is set up with these dependencies and maximum decompression ratio benefits are sought.\n    * **Android (Java/Kotlin):**\n        * Native support is less direct for general app development compared to DEFLATE/GZIP; often available via WebView for web content or through JNI with Brotli libraries.\n        * Best fit for decompressing Brotli-encoded content within web contexts or when specifically integrating a Brotli library.\n    * **iOS/macOS (Swift):**\n        * Native support via Apple's Compression framework (using `Algorithm.brotli` or C-level `COMPRESSION_BROTLI`, available iOS 13+/macOS 10.15+; C API availability might be iOS 15+ for some uses, requiring OS version checks).\n        * Excellent for decompressing Brotli-encoded web content and text-heavy data directly within apps.\n\n\n## Cryptography\n\nThe packager uses Ed25519 for digital signatures, which offers:\n\n- **Small key sizes**: 32-byte public keys, 64-byte signatures\n- **Fast verification**: 50-70x faster than RSA\n- **High security**: Resistant to side-channel attacks\n\n## License\n\nMIT","readmeFilename":"README.md"}