@pixzle/cli 0.0.19 → 0.0.21

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 (42) hide show
  1. package/README.md +16 -4
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +2 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/restore.d.ts.map +1 -0
  6. package/dist/commands/restore.js +28 -17
  7. package/dist/commands/restore.js.map +1 -1
  8. package/dist/commands/shuffle.d.ts.map +1 -0
  9. package/dist/commands/shuffle.js +38 -27
  10. package/dist/commands/shuffle.js.map +1 -1
  11. package/dist/constants.d.ts +1 -0
  12. package/dist/constants.js +6 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/package.json +43 -0
  16. package/dist/src/cli.d.ts +2 -0
  17. package/dist/src/cli.js +27 -0
  18. package/dist/src/cli.js.map +1 -0
  19. package/dist/src/commands/restore.d.ts +6 -0
  20. package/dist/src/commands/restore.js +77 -0
  21. package/dist/src/commands/restore.js.map +1 -0
  22. package/dist/src/commands/shuffle.d.ts +6 -0
  23. package/dist/src/commands/shuffle.js +71 -0
  24. package/dist/src/commands/shuffle.js.map +1 -0
  25. package/dist/src/constants.d.ts +1 -0
  26. package/dist/src/constants.js +6 -0
  27. package/dist/src/constants.js.map +1 -0
  28. package/dist/src/index.d.mts +3 -0
  29. package/dist/src/index.d.ts +3 -0
  30. package/dist/src/index.js +10 -0
  31. package/dist/src/index.js.map +1 -0
  32. package/dist/src/index.mjs +4 -0
  33. package/dist/src/index.mjs.map +1 -0
  34. package/dist/src/types.d.ts +16 -0
  35. package/dist/src/types.js +3 -0
  36. package/dist/src/types.js.map +1 -0
  37. package/dist/src/validators.d.ts +18 -0
  38. package/dist/src/validators.js +61 -0
  39. package/dist/src/validators.js.map +1 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/validators.d.ts.map +1 -0
  42. package/package.json +6 -5
package/README.md CHANGED
@@ -47,7 +47,7 @@ pixzle shuffle <images...> -o <output_directory> [options]
47
47
  |--------|-------------|----------|---------|
48
48
  | `-o, --output <dir>` | Output directory for fragments and manifest | ✅ | - |
49
49
  | `-b, --block-size <size>` | Pixel block size (positive integer) | ❌ | 10 |
50
- | `-p, --prefix <prefix>` | Prefix for fragment files | ❌ | "fragment" |
50
+ | `-p, --prefix <prefix>` | Prefix for fragment files | ❌ | "img" |
51
51
  | `-s, --seed <seed>` | Random seed (integer) | ❌ | auto-generated |
52
52
  | `--preserve-name` | Preserve original file names | ❌ | false |
53
53
  | `--cross-image-shuffle` | Shuffle blocks across all images instead of within each image independently | ❌ | false (per-image shuffle by default) |
@@ -87,7 +87,7 @@ output/
87
87
 
88
88
  ### Restore Command
89
89
 
90
- Restore fragmented images using the manifest file.
90
+ Restore fragmented images using the manifest file or manual configuration.
91
91
 
92
92
  ```bash
93
93
  pixzle restore <fragments...> -m <manifest_path> -o <output_directory> [options]
@@ -97,16 +97,28 @@ pixzle restore <fragments...> -m <manifest_path> -o <output_directory> [options]
97
97
 
98
98
  | Option | Description | Required |
99
99
  |--------|-------------|----------|
100
- | `-m, --manifest <path>` | Path to the manifest.json file | |
100
+ | `-m, --manifest <path>` | Path to the manifest.json file | ⚠️ |
101
101
  | `-o, --output <dir>` | Output directory for restored images | ✅ |
102
+ | `-b, --block-size <number>` | Pixel block size (positive integer) | ❌ (required if manifest missing) |
103
+ | `-s, --seed <number>` | Random seed (integer) | ❌ (required if manifest missing) |
104
+ | `-w, --width <number>` | Image width | ❌ (required if manifest missing) |
105
+ | `-h, --height <number>` | Image height | ❌ (required if manifest missing) |
106
+
107
+ > [!NOTE]
108
+ > When using manual options (`-b`, `-s`, `-w`, `-h`), only a single image can be restored.
102
109
 
103
110
  #### Examples
104
111
 
105
- **Basic restoration:**
112
+ **Basic restoration (using manifest):**
106
113
  ```bash
107
114
  pixzle restore ./fragments/*.png -m ./fragments/manifest.json -o ./restored
108
115
  ```
109
116
 
117
+ **Manual restoration (without manifest):**
118
+ ```bash
119
+ pixzle restore ./fragment.png -o ./restored -b 10 -s 12345 -w 500 -h 500
120
+ ```
121
+
110
122
  **Specific fragments:**
111
123
  ```bash
112
124
  pixzle restore fragment_0000.png fragment_0001.png fragment_0002.png -m manifest.json -o ./output
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js CHANGED
@@ -4,11 +4,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const commander_1 = require("commander");
5
5
  const restore_1 = require("./commands/restore");
6
6
  const shuffle_1 = require("./commands/shuffle");
7
+ const constants_1 = require("./constants");
7
8
  const program = new commander_1.Command();
8
9
  program
9
10
  .name("pixzle")
10
11
  .description("CLI tool for image fragmentation and restoration")
11
- .version("0.8.1");
12
+ .version(constants_1.VERSION);
12
13
  // Register commands
13
14
  (0, shuffle_1.registerShuffleCommand)(program);
14
15
  (0, restore_1.registerRestoreCommand)(program);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,gDAA4D;AAC5D,gDAA4D;AAE5D,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAEhC,iBAAiB;AACjB,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,mCAAmC;AACnC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,gDAA4D;AAC5D,gDAA4D;AAC5D,2CAAsC;AAEtC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,mBAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAEhC,iBAAiB;AACjB,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,mCAAmC;AACnC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ7D"}
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -24,22 +33,24 @@ function registerRestoreCommand(program) {
24
33
  * @param fragments Array of fragment file paths
25
34
  * @param options Command options
26
35
  */
27
- async function handleRestoreCommand(fragments, options) {
28
- try {
29
- console.log("🔀 Starting image restoration...");
30
- const imagePaths = (0, validators_1.validateImagePaths)(fragments);
31
- const manifestPath = (0, validators_1.validateManifestPath)(options.manifest);
32
- const outputDir = (0, validators_1.validateOutputDirectory)(options.output);
33
- await node_1.default.restore({
34
- imagePaths,
35
- manifestPath,
36
- outputDir,
37
- });
38
- console.log(`✅ Images restored successfully to: ${outputDir}`);
39
- }
40
- catch (error) {
41
- console.error(`❌ Restoration failed: ${error instanceof Error ? error.message : String(error)}`);
42
- process.exit(1);
43
- }
36
+ function handleRestoreCommand(fragments, options) {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ try {
39
+ console.log("🔀 Starting image restoration...");
40
+ const imagePaths = (0, validators_1.validateImagePaths)(fragments);
41
+ const manifestPath = (0, validators_1.validateManifestPath)(options.manifest);
42
+ const outputDir = (0, validators_1.validateOutputDirectory)(options.output);
43
+ yield node_1.default.restore({
44
+ imagePaths,
45
+ manifestPath,
46
+ outputDir,
47
+ });
48
+ console.log(`✅ Images restored successfully to: ${outputDir}`);
49
+ }
50
+ catch (error) {
51
+ console.error(`❌ Restoration failed: ${error instanceof Error ? error.message : String(error)}`);
52
+ process.exit(1);
53
+ }
54
+ });
44
55
  }
45
56
  //# sourceMappingURL=restore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":";;;;;AAaA,wDAQC;AArBD,wDAAkC;AAGlC,8CAIuB;AAEvB;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;SACjD,cAAc,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;SAC7D,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;SACxD,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,oBAAoB,CACjC,SAAmB,EACnB,OAAuB;IAEvB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,MAAM,UAAU,GAAG,IAAA,+BAAkB,EAAC,SAAS,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,IAAA,iCAAoB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAA,oCAAuB,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1D,MAAM,cAAM,CAAC,OAAO,CAAC;YACnB,UAAU;YACV,YAAY;YACZ,SAAS;SACV,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAClF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAaA,wDAQC;AArBD,wDAAkC;AAGlC,8CAIuB;AAEvB;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;SACjD,cAAc,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;SAC7D,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;SACxD,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,SAAe,oBAAoB,CACjC,SAAmB,EACnB,OAAuB;;QAEvB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAEhD,MAAM,UAAU,GAAG,IAAA,+BAAkB,EAAC,SAAS,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,IAAA,iCAAoB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,IAAA,oCAAuB,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE1D,MAAM,cAAM,CAAC,OAAO,CAAC;gBACnB,UAAU;gBACV,YAAY;gBACZ,SAAS;aACV,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAClF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shuffle.d.ts","sourceRoot":"","sources":["../../src/commands/shuffle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2B7D"}
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -40,32 +49,34 @@ function registerShuffleCommand(program) {
40
49
  * @param images Array of image file paths
41
50
  * @param options Command options
42
51
  */
43
- async function handleShuffleCommand(images, options) {
44
- try {
45
- console.log("🔀 Starting image fragmentation...");
46
- const imagePaths = (0, validators_1.validateImagePaths)(images);
47
- const outputDir = (0, validators_1.validateOutputDirectory)(options.output);
48
- const config = {};
49
- if (options.blockSize !== undefined)
50
- config.blockSize = options.blockSize;
51
- if (options.prefix !== undefined)
52
- config.prefix = options.prefix;
53
- if (options.seed !== undefined)
54
- config.seed = options.seed;
55
- if (options.preserveName)
56
- config.preserveName = true;
57
- if (options.crossImageShuffle)
58
- config.crossImageShuffle = true;
59
- await node_1.default.shuffle({
60
- imagePaths,
61
- outputDir,
62
- config: Object.keys(config).length > 0 ? config : undefined,
63
- });
64
- console.log(`✅ Images fragmented successfully to: ${outputDir}`);
65
- }
66
- catch (error) {
67
- console.error(`❌ Fragmentation failed: ${error instanceof Error ? error.message : String(error)}`);
68
- process.exit(1);
69
- }
52
+ function handleShuffleCommand(images, options) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ try {
55
+ console.log("🔀 Starting image fragmentation...");
56
+ const imagePaths = (0, validators_1.validateImagePaths)(images);
57
+ const outputDir = (0, validators_1.validateOutputDirectory)(options.output);
58
+ const config = {};
59
+ if (options.blockSize !== undefined)
60
+ config.blockSize = options.blockSize;
61
+ if (options.prefix !== undefined)
62
+ config.prefix = options.prefix;
63
+ if (options.seed !== undefined)
64
+ config.seed = options.seed;
65
+ if (options.preserveName)
66
+ config.preserveName = true;
67
+ if (options.crossImageShuffle)
68
+ config.crossImageShuffle = true;
69
+ yield node_1.default.shuffle({
70
+ imagePaths,
71
+ outputDir,
72
+ config: Object.keys(config).length > 0 ? config : undefined,
73
+ });
74
+ console.log(`✅ Images fragmented successfully to: ${outputDir}`);
75
+ }
76
+ catch (error) {
77
+ console.error(`❌ Fragmentation failed: ${error instanceof Error ? error.message : String(error)}`);
78
+ process.exit(1);
79
+ }
80
+ });
70
81
  }
71
82
  //# sourceMappingURL=shuffle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shuffle.js","sourceRoot":"","sources":["../../src/commands/shuffle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shuffle.js","sourceRoot":"","sources":["../../src/commands/shuffle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const VERSION: any;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ const package_json_1 = require("../package.json");
5
+ exports.VERSION = package_json_1.version;
6
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,kDAA0C;AAE7B,QAAA,OAAO,GAAG,sBAAO,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@pixzle/cli",
3
+ "version": "0.0.20",
4
+ "description": "CLI implementation of image fragmentation and restoration",
5
+ "type": "commonjs",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "pixzle": "./dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.build.json",
16
+ "build:check": "tsc -p tsconfig.build.json --noEmit",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest",
19
+ "dev": "tsx src/cli.ts"
20
+ },
21
+ "keywords": [],
22
+ "author": "tuki0918",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/tuki0918/pixzle.git",
26
+ "directory": "packages/cli"
27
+ },
28
+ "license": "MIT",
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "dependencies": {
33
+ "@pixzle/core": "workspace:*",
34
+ "@pixzle/node": "workspace:*",
35
+ "commander": "^12.1.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^22.10.1",
39
+ "tsx": "^4.20.5",
40
+ "typescript": "^5.7.2",
41
+ "vitest": "^3.1.4"
42
+ }
43
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const restore_1 = require("./commands/restore");
6
+ const shuffle_1 = require("./commands/shuffle");
7
+ const constants_1 = require("./constants");
8
+ const program = new commander_1.Command();
9
+ program
10
+ .name("pixzle")
11
+ .description("CLI tool for image fragmentation and restoration")
12
+ .version(constants_1.VERSION);
13
+ // Register commands
14
+ (0, shuffle_1.registerShuffleCommand)(program);
15
+ (0, restore_1.registerRestoreCommand)(program);
16
+ // Error handling
17
+ program.on("command:*", () => {
18
+ console.error("Invalid command. See --help for available commands.");
19
+ process.exit(1);
20
+ });
21
+ // Parse arguments
22
+ program.parse(process.argv);
23
+ // Show help if no command provided
24
+ if (process.argv.length <= 2) {
25
+ program.help();
26
+ }
27
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,gDAA4D;AAC5D,gDAA4D;AAC5D,2CAAsC;AAEtC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,mBAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAEhC,iBAAiB;AACjB,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,mCAAmC;AACnC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Command } from "commander";
2
+ /**
3
+ * Configures and registers the restore command
4
+ * @param program Commander program instance
5
+ */
6
+ export declare function registerRestoreCommand(program: Command): void;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerRestoreCommand = registerRestoreCommand;
7
+ const node_1 = __importDefault(require("@pixzle/node"));
8
+ const validators_1 = require("../validators");
9
+ /**
10
+ * Configures and registers the restore command
11
+ * @param program Commander program instance
12
+ */
13
+ function registerRestoreCommand(program) {
14
+ program
15
+ .command("restore")
16
+ .description("Restore fragmented images")
17
+ .argument("<fragments...>", "Fragment file paths")
18
+ .option("-m, --manifest <path>", "Manifest file path")
19
+ .requiredOption("-o, --output <dir>", "Output directory")
20
+ .option("-b, --block-size <number>", "Block size", Number.parseInt)
21
+ .option("-s, --seed <number>", "Random seed", Number.parseInt)
22
+ .option("-w, --width <number>", "Image width", Number.parseInt)
23
+ .option("-h, --height <number>", "Image height", Number.parseInt)
24
+ .action(handleRestoreCommand);
25
+ }
26
+ /**
27
+ * Handles the restore command execution
28
+ * @param fragments Array of fragment file paths
29
+ * @param options Command options
30
+ */
31
+ async function handleRestoreCommand(fragments, options) {
32
+ try {
33
+ console.log("🔀 Starting image restoration...");
34
+ const imagePaths = (0, validators_1.validateImagePaths)(fragments);
35
+ const outputDir = (0, validators_1.validateOutputDirectory)(options.output);
36
+ const restoreOptions = {
37
+ imagePaths,
38
+ outputDir,
39
+ };
40
+ if (options.manifest) {
41
+ restoreOptions.manifestPath = (0, validators_1.validateManifestPath)(options.manifest);
42
+ }
43
+ else if (options.blockSize !== undefined &&
44
+ options.seed !== undefined &&
45
+ options.width !== undefined &&
46
+ options.height !== undefined) {
47
+ if (imagePaths.length > 1) {
48
+ throw new Error("When using manual options (blockSize, seed, width, height), only a single image can be restored.");
49
+ }
50
+ const { width, height } = options;
51
+ const manifestData = {
52
+ id: "cli-restore",
53
+ version: "0.0.0",
54
+ timestamp: new Date().toISOString(),
55
+ config: {
56
+ blockSize: options.blockSize,
57
+ seed: options.seed,
58
+ prefix: "img",
59
+ preserveName: false,
60
+ crossImageShuffle: false,
61
+ },
62
+ images: [{ w: width, h: height }],
63
+ };
64
+ restoreOptions.manifestData = manifestData;
65
+ }
66
+ else {
67
+ throw new Error("Either manifest path or (blockSize, seed, width, height) must be provided.");
68
+ }
69
+ await node_1.default.restore(restoreOptions);
70
+ console.log(`✅ Images restored successfully to: ${outputDir}`);
71
+ }
72
+ catch (error) {
73
+ console.error(`❌ Restoration failed: ${error instanceof Error ? error.message : String(error)}`);
74
+ process.exit(1);
75
+ }
76
+ }
77
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../src/commands/restore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Command } from "commander";
2
+ /**
3
+ * Configures and registers the shuffle command
4
+ * @param program Commander program instance
5
+ */
6
+ export declare function registerShuffleCommand(program: Command): void;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerShuffleCommand = registerShuffleCommand;
7
+ const node_1 = __importDefault(require("@pixzle/node"));
8
+ const validators_1 = require("../validators");
9
+ /**
10
+ * Configures and registers the shuffle command
11
+ * @param program Commander program instance
12
+ */
13
+ function registerShuffleCommand(program) {
14
+ program
15
+ .command("shuffle")
16
+ .description("Fragment images")
17
+ .argument("<images...>", "Input image file paths")
18
+ .requiredOption("-o, --output <dir>", "Output directory")
19
+ .option("-b, --block-size <size>", "Pixel block size", (value) => {
20
+ const num = Number.parseInt(value, 10);
21
+ if (Number.isNaN(num) || num <= 0) {
22
+ throw new Error("Block size must be a positive integer");
23
+ }
24
+ return num;
25
+ })
26
+ .option("-p, --prefix <prefix>", "Prefix for fragment files")
27
+ .option("-s, --seed <seed>", "Random seed", (value) => {
28
+ const num = Number.parseInt(value, 10);
29
+ if (Number.isNaN(num)) {
30
+ throw new Error("Seed must be an integer");
31
+ }
32
+ return num;
33
+ })
34
+ .option("--preserve-name", "Preserve original file names")
35
+ .option("--cross-image-shuffle", "Shuffle blocks across all images instead of within each image independently")
36
+ .action(handleShuffleCommand);
37
+ }
38
+ /**
39
+ * Handles the shuffle command execution
40
+ * @param images Array of image file paths
41
+ * @param options Command options
42
+ */
43
+ async function handleShuffleCommand(images, options) {
44
+ try {
45
+ console.log("🔀 Starting image fragmentation...");
46
+ const imagePaths = (0, validators_1.validateImagePaths)(images);
47
+ const outputDir = (0, validators_1.validateOutputDirectory)(options.output);
48
+ const config = {};
49
+ if (options.blockSize !== undefined)
50
+ config.blockSize = options.blockSize;
51
+ if (options.prefix !== undefined)
52
+ config.prefix = options.prefix;
53
+ if (options.seed !== undefined)
54
+ config.seed = options.seed;
55
+ if (options.preserveName)
56
+ config.preserveName = true;
57
+ if (options.crossImageShuffle)
58
+ config.crossImageShuffle = true;
59
+ await node_1.default.shuffle({
60
+ imagePaths,
61
+ outputDir,
62
+ config: Object.keys(config).length > 0 ? config : undefined,
63
+ });
64
+ console.log(`✅ Images fragmented successfully to: ${outputDir}`);
65
+ }
66
+ catch (error) {
67
+ console.error(`❌ Fragmentation failed: ${error instanceof Error ? error.message : String(error)}`);
68
+ process.exit(1);
69
+ }
70
+ }
71
+ //# sourceMappingURL=shuffle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shuffle.js","sourceRoot":"","sources":["../../../src/commands/shuffle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const VERSION: string;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ const package_json_1 = require("../package.json");
5
+ exports.VERSION = package_json_1.version;
6
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAA,kDAA0C;AAE7B,QAAA,OAAO,GAAG,sBAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as Pixzle } from "@pixzle/node";
2
+ export type { FragmentationConfig } from "@pixzle/core";
3
+ export type { RestoreOptions, ShuffleOptions } from "./types";
@@ -0,0 +1,3 @@
1
+ export { default as Pixzle } from "@pixzle/node";
2
+ export type { FragmentationConfig } from "@pixzle/core";
3
+ export type { RestoreOptions, ShuffleOptions } from "./types";
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Pixzle = void 0;
7
+ // Export CLI functionality for programmatic usage if needed
8
+ var node_1 = require("@pixzle/node");
9
+ Object.defineProperty(exports, "Pixzle", { enumerable: true, get: function () { return __importDefault(node_1).default; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA4D;AAC5D,qCAAiD;AAAxC,+GAAA,OAAO,OAAU"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Export CLI functionality for programmatic usage if needed
3
+ export { default as Pixzle } from "@pixzle/node";
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ShuffleOptions {
2
+ output: string;
3
+ blockSize?: number;
4
+ prefix?: string;
5
+ seed?: number;
6
+ preserveName?: boolean;
7
+ crossImageShuffle?: boolean;
8
+ }
9
+ export interface RestoreOptions {
10
+ manifest?: string;
11
+ output: string;
12
+ blockSize?: number;
13
+ seed?: number;
14
+ width?: number;
15
+ height?: number;
16
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Validates an array of image file paths
3
+ * @param paths Array of file paths to validate
4
+ * @returns Array of resolved absolute paths
5
+ */
6
+ export declare function validateImagePaths(paths: string[]): string[];
7
+ /**
8
+ * Validates output directory path
9
+ * @param outputPath Output directory path
10
+ * @returns Resolved absolute path
11
+ */
12
+ export declare function validateOutputDirectory(outputPath: string): string;
13
+ /**
14
+ * Validates manifest file path
15
+ * @param manifestPath Path to manifest file
16
+ * @returns Resolved absolute path
17
+ */
18
+ export declare function validateManifestPath(manifestPath: string): string;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateImagePaths = validateImagePaths;
4
+ exports.validateOutputDirectory = validateOutputDirectory;
5
+ exports.validateManifestPath = validateManifestPath;
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
8
+ /**
9
+ * Validates an array of image file paths
10
+ * @param paths Array of file paths to validate
11
+ * @returns Array of resolved absolute paths
12
+ */
13
+ function validateImagePaths(paths) {
14
+ const resolvedPaths = [];
15
+ for (const path of paths) {
16
+ const resolvedPath = (0, node_path_1.resolve)(path);
17
+ if (!(0, node_fs_1.existsSync)(resolvedPath)) {
18
+ console.error(`Error: File not found: ${path}`);
19
+ process.exit(1);
20
+ }
21
+ if (!(0, node_fs_1.lstatSync)(resolvedPath).isFile()) {
22
+ console.error(`Error: Not a file: ${path}`);
23
+ process.exit(1);
24
+ }
25
+ resolvedPaths.push(resolvedPath);
26
+ }
27
+ return resolvedPaths;
28
+ }
29
+ /**
30
+ * Validates output directory path
31
+ * @param outputPath Output directory path
32
+ * @returns Resolved absolute path
33
+ */
34
+ function validateOutputDirectory(outputPath) {
35
+ const resolvedPath = (0, node_path_1.resolve)(outputPath);
36
+ // Create parent directory if it doesn't exist
37
+ const parentDir = (0, node_path_1.dirname)(resolvedPath);
38
+ if (!(0, node_fs_1.existsSync)(parentDir)) {
39
+ console.error(`Error: Parent directory does not exist: ${parentDir}`);
40
+ process.exit(1);
41
+ }
42
+ return resolvedPath;
43
+ }
44
+ /**
45
+ * Validates manifest file path
46
+ * @param manifestPath Path to manifest file
47
+ * @returns Resolved absolute path
48
+ */
49
+ function validateManifestPath(manifestPath) {
50
+ const resolvedPath = (0, node_path_1.resolve)(manifestPath);
51
+ if (!(0, node_fs_1.existsSync)(resolvedPath)) {
52
+ console.error(`Error: Manifest file not found: ${manifestPath}`);
53
+ process.exit(1);
54
+ }
55
+ if (!(0, node_fs_1.lstatSync)(resolvedPath).isFile()) {
56
+ console.error(`Error: Manifest path is not a file: ${manifestPath}`);
57
+ process.exit(1);
58
+ }
59
+ return resolvedPath;
60
+ }
61
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":";;AAQA,gDAoBC;AAOD,0DAWC;AAOD,oDAcC;AAnED,qCAAgD;AAChD,yCAA6C;AAE7C;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,KAAe;IAChD,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,IAAA,mBAAO,EAAC,IAAI,CAAC,CAAC;QAEnC,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,IAAA,mBAAS,EAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,UAAkB;IACxD,MAAM,YAAY,GAAG,IAAA,mBAAO,EAAC,UAAU,CAAC,CAAC;IAEzC,8CAA8C;IAC9C,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,YAAY,CAAC,CAAC;IACxC,IAAI,CAAC,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,YAAoB;IACvD,MAAM,YAAY,GAAG,IAAA,mBAAO,EAAC,YAAY,CAAC,CAAC;IAE3C,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAA,mBAAS,EAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAoB5D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAWlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAcjE"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pixzle/cli",
3
- "version": "0.0.19",
4
- "description": "CLI implementation of image fragmentation and restoration (RESERVED)",
3
+ "version": "0.0.21",
4
+ "description": "CLI implementation of image fragmentation and restoration",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -24,8 +24,8 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "commander": "^12.1.0",
27
- "@pixzle/core": "0.0.19",
28
- "@pixzle/node": "0.0.19"
27
+ "@pixzle/node": "0.0.21",
28
+ "@pixzle/core": "0.0.21"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^22.10.1",
@@ -36,7 +36,8 @@
36
36
  "scripts": {
37
37
  "build": "tsc -p tsconfig.build.json",
38
38
  "build:check": "tsc -p tsconfig.build.json --noEmit",
39
- "test": "vitest",
39
+ "test": "vitest run",
40
+ "test:watch": "vitest",
40
41
  "dev": "tsx src/cli.ts"
41
42
  }
42
43
  }