@prosopo/datasets-fs 0.2.7 → 0.2.8

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 (230) hide show
  1. package/README.md +21 -0
  2. package/dist/cjs/cli/cli.cjs +55 -0
  3. package/dist/cjs/index.cjs +3 -1
  4. package/dist/cli/cli.d.ts +9 -0
  5. package/dist/cli/cli.d.ts.map +1 -0
  6. package/dist/cli/cli.js +54 -0
  7. package/dist/cli/cli.js.map +1 -0
  8. package/dist/cli/cliCommand.d.ts +17 -0
  9. package/dist/cli/cliCommand.d.ts.map +1 -0
  10. package/dist/cli/cliCommand.js +36 -0
  11. package/dist/cli/cliCommand.js.map +1 -0
  12. package/dist/cli/cliCommandComposite.d.ts +14 -0
  13. package/dist/cli/cliCommandComposite.d.ts.map +1 -0
  14. package/dist/cli/cliCommandComposite.js +34 -0
  15. package/dist/cli/cliCommandComposite.js.map +1 -0
  16. package/dist/cli.js +21 -35
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/flatten.d.ts +56 -0
  19. package/dist/commands/flatten.d.ts.map +1 -0
  20. package/dist/commands/flatten.js +103 -0
  21. package/dist/commands/flatten.js.map +1 -0
  22. package/dist/commands/generate.d.ts +114 -0
  23. package/dist/commands/generate.d.ts.map +1 -0
  24. package/dist/commands/generate.js +151 -0
  25. package/dist/commands/generate.js.map +1 -0
  26. package/dist/commands/generateV1.d.ts +174 -0
  27. package/dist/commands/generateV1.d.ts.map +1 -0
  28. package/dist/commands/generateV1.js +178 -0
  29. package/dist/commands/generateV1.js.map +1 -0
  30. package/dist/commands/generateV2.d.ts +184 -0
  31. package/dist/commands/generateV2.d.ts.map +1 -0
  32. package/dist/commands/generateV2.js +204 -0
  33. package/dist/commands/generateV2.js.map +1 -0
  34. package/dist/commands/get.d.ts +35 -0
  35. package/dist/commands/get.d.ts.map +1 -0
  36. package/dist/commands/get.js +81 -0
  37. package/dist/commands/get.js.map +1 -0
  38. package/dist/commands/labels.d.ts +46 -0
  39. package/dist/commands/labels.d.ts.map +1 -0
  40. package/dist/commands/labels.js +43 -0
  41. package/dist/commands/labels.js.map +1 -0
  42. package/dist/commands/relocate.d.ts +68 -0
  43. package/dist/commands/relocate.d.ts.map +1 -0
  44. package/dist/commands/relocate.js +75 -0
  45. package/dist/commands/relocate.js.map +1 -0
  46. package/dist/commands/resize.d.ts +66 -0
  47. package/dist/commands/resize.d.ts.map +1 -0
  48. package/dist/commands/resize.js +118 -0
  49. package/dist/commands/resize.js.map +1 -0
  50. package/dist/{generate/distinct/dummy.d.ts.map → dummy.d.ts.map} +1 -1
  51. package/dist/dummy.js.map +1 -0
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +1 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/tests/data/flat_resized/labels.json +3 -0
  57. package/dist/tests/data/flat_resized/relocated_data.json +364 -0
  58. package/dist/tests/mocked.test.d.ts +2 -0
  59. package/dist/tests/mocked.test.d.ts.map +1 -0
  60. package/dist/tests/mocked.test.js +271 -0
  61. package/dist/tests/mocked.test.js.map +1 -0
  62. package/dist/tests/utils.d.ts +35 -0
  63. package/dist/tests/utils.d.ts.map +1 -0
  64. package/dist/tests/utils.js +120 -0
  65. package/dist/tests/utils.js.map +1 -0
  66. package/dist/utils/input.d.ts +24 -0
  67. package/dist/utils/input.d.ts.map +1 -0
  68. package/dist/utils/input.js +34 -0
  69. package/dist/utils/input.js.map +1 -0
  70. package/dist/utils/inputOutput.d.ts +20 -0
  71. package/dist/utils/inputOutput.d.ts.map +1 -0
  72. package/dist/utils/inputOutput.js +10 -0
  73. package/dist/utils/inputOutput.js.map +1 -0
  74. package/dist/utils/output.d.ts +37 -0
  75. package/dist/utils/output.d.ts.map +1 -0
  76. package/dist/utils/output.js +63 -0
  77. package/dist/utils/output.js.map +1 -0
  78. package/package.json +5 -6
  79. package/dist/cjs/cli.cjs +0 -34
  80. package/dist/cjs/flatten/args.cjs +0 -9
  81. package/dist/cjs/flatten/cli.cjs +0 -28
  82. package/dist/cjs/flatten/flatten.cjs +0 -55
  83. package/dist/cjs/generate/args.cjs +0 -16
  84. package/dist/cjs/generate/cli.cjs +0 -50
  85. package/dist/cjs/generate/distinct/args.cjs +0 -11
  86. package/dist/cjs/generate/distinct/cli.cjs +0 -28
  87. package/dist/cjs/generate/distinct/generate.cjs +0 -174
  88. package/dist/cjs/generate/union/args.cjs +0 -12
  89. package/dist/cjs/generate/union/cli.cjs +0 -31
  90. package/dist/cjs/generate/union/generate.cjs +0 -151
  91. package/dist/cjs/generate/util.cjs +0 -21
  92. package/dist/cjs/get/args.cjs +0 -7
  93. package/dist/cjs/get/cli.cjs +0 -20
  94. package/dist/cjs/get/get.cjs +0 -53
  95. package/dist/cjs/labels/args.cjs +0 -7
  96. package/dist/cjs/labels/cli.cjs +0 -20
  97. package/dist/cjs/labels/labels.cjs +0 -21
  98. package/dist/cjs/relocate/args.cjs +0 -9
  99. package/dist/cjs/relocate/cli.cjs +0 -27
  100. package/dist/cjs/relocate/relocate.cjs +0 -36
  101. package/dist/cjs/scale/args.cjs +0 -11
  102. package/dist/cjs/scale/cli.cjs +0 -34
  103. package/dist/cjs/scale/scale.cjs +0 -55
  104. package/dist/flatten/args.d.ts +0 -16
  105. package/dist/flatten/args.d.ts.map +0 -1
  106. package/dist/flatten/args.js +0 -8
  107. package/dist/flatten/args.js.map +0 -1
  108. package/dist/flatten/cli.d.ts +0 -18
  109. package/dist/flatten/cli.d.ts.map +0 -1
  110. package/dist/flatten/cli.js +0 -30
  111. package/dist/flatten/cli.js.map +0 -1
  112. package/dist/flatten/flatten.d.ts +0 -5
  113. package/dist/flatten/flatten.d.ts.map +0 -1
  114. package/dist/flatten/flatten.js +0 -65
  115. package/dist/flatten/flatten.js.map +0 -1
  116. package/dist/flatten/index.d.ts +0 -4
  117. package/dist/flatten/index.d.ts.map +0 -1
  118. package/dist/flatten/index.js +0 -4
  119. package/dist/flatten/index.js.map +0 -1
  120. package/dist/generate/args.d.ts +0 -37
  121. package/dist/generate/args.d.ts.map +0 -1
  122. package/dist/generate/args.js +0 -15
  123. package/dist/generate/args.js.map +0 -1
  124. package/dist/generate/cli.d.ts +0 -32
  125. package/dist/generate/cli.d.ts.map +0 -1
  126. package/dist/generate/cli.js +0 -62
  127. package/dist/generate/cli.js.map +0 -1
  128. package/dist/generate/distinct/args.d.ts +0 -49
  129. package/dist/generate/distinct/args.d.ts.map +0 -1
  130. package/dist/generate/distinct/args.js +0 -10
  131. package/dist/generate/distinct/args.js.map +0 -1
  132. package/dist/generate/distinct/cli.d.ts +0 -20
  133. package/dist/generate/distinct/cli.d.ts.map +0 -1
  134. package/dist/generate/distinct/cli.js +0 -31
  135. package/dist/generate/distinct/cli.js.map +0 -1
  136. package/dist/generate/distinct/dummy.js.map +0 -1
  137. package/dist/generate/distinct/generate.d.ts +0 -5
  138. package/dist/generate/distinct/generate.d.ts.map +0 -1
  139. package/dist/generate/distinct/generate.js +0 -186
  140. package/dist/generate/distinct/generate.js.map +0 -1
  141. package/dist/generate/distinct/index.d.ts +0 -4
  142. package/dist/generate/distinct/index.d.ts.map +0 -1
  143. package/dist/generate/distinct/index.js +0 -4
  144. package/dist/generate/distinct/index.js.map +0 -1
  145. package/dist/generate/index.d.ts +0 -5
  146. package/dist/generate/index.d.ts.map +0 -1
  147. package/dist/generate/index.js +0 -5
  148. package/dist/generate/index.js.map +0 -1
  149. package/dist/generate/union/args.d.ts +0 -52
  150. package/dist/generate/union/args.d.ts.map +0 -1
  151. package/dist/generate/union/args.js +0 -11
  152. package/dist/generate/union/args.js.map +0 -1
  153. package/dist/generate/union/cli.d.ts +0 -22
  154. package/dist/generate/union/cli.d.ts.map +0 -1
  155. package/dist/generate/union/cli.js +0 -35
  156. package/dist/generate/union/cli.js.map +0 -1
  157. package/dist/generate/union/generate.d.ts +0 -5
  158. package/dist/generate/union/generate.d.ts.map +0 -1
  159. package/dist/generate/union/generate.js +0 -168
  160. package/dist/generate/union/generate.js.map +0 -1
  161. package/dist/generate/union/index.d.ts +0 -4
  162. package/dist/generate/union/index.d.ts.map +0 -1
  163. package/dist/generate/union/index.js +0 -4
  164. package/dist/generate/union/index.js.map +0 -1
  165. package/dist/generate/util.d.ts +0 -6
  166. package/dist/generate/util.d.ts.map +0 -1
  167. package/dist/generate/util.js +0 -20
  168. package/dist/generate/util.js.map +0 -1
  169. package/dist/get/args.d.ts +0 -10
  170. package/dist/get/args.d.ts.map +0 -1
  171. package/dist/get/args.js +0 -6
  172. package/dist/get/args.js.map +0 -1
  173. package/dist/get/cli.d.ts +0 -14
  174. package/dist/get/cli.d.ts.map +0 -1
  175. package/dist/get/cli.js +0 -19
  176. package/dist/get/cli.js.map +0 -1
  177. package/dist/get/get.d.ts +0 -5
  178. package/dist/get/get.d.ts.map +0 -1
  179. package/dist/get/get.js +0 -60
  180. package/dist/get/get.js.map +0 -1
  181. package/dist/get/index.d.ts +0 -4
  182. package/dist/get/index.d.ts.map +0 -1
  183. package/dist/get/index.js +0 -4
  184. package/dist/get/index.js.map +0 -1
  185. package/dist/labels/args.d.ts +0 -10
  186. package/dist/labels/args.d.ts.map +0 -1
  187. package/dist/labels/args.js +0 -6
  188. package/dist/labels/args.js.map +0 -1
  189. package/dist/labels/cli.d.ts +0 -14
  190. package/dist/labels/cli.d.ts.map +0 -1
  191. package/dist/labels/cli.js +0 -19
  192. package/dist/labels/cli.js.map +0 -1
  193. package/dist/labels/index.d.ts +0 -4
  194. package/dist/labels/index.d.ts.map +0 -1
  195. package/dist/labels/index.js +0 -4
  196. package/dist/labels/index.js.map +0 -1
  197. package/dist/labels/labels.d.ts +0 -5
  198. package/dist/labels/labels.d.ts.map +0 -1
  199. package/dist/labels/labels.js +0 -22
  200. package/dist/labels/labels.js.map +0 -1
  201. package/dist/relocate/args.d.ts +0 -16
  202. package/dist/relocate/args.d.ts.map +0 -1
  203. package/dist/relocate/args.js +0 -8
  204. package/dist/relocate/args.js.map +0 -1
  205. package/dist/relocate/cli.d.ts +0 -18
  206. package/dist/relocate/cli.d.ts.map +0 -1
  207. package/dist/relocate/cli.js +0 -29
  208. package/dist/relocate/cli.js.map +0 -1
  209. package/dist/relocate/relocate.d.ts +0 -5
  210. package/dist/relocate/relocate.d.ts.map +0 -1
  211. package/dist/relocate/relocate.js +0 -40
  212. package/dist/relocate/relocate.js.map +0 -1
  213. package/dist/scale/args.d.ts +0 -22
  214. package/dist/scale/args.d.ts.map +0 -1
  215. package/dist/scale/args.js +0 -10
  216. package/dist/scale/args.js.map +0 -1
  217. package/dist/scale/cli.d.ts +0 -22
  218. package/dist/scale/cli.d.ts.map +0 -1
  219. package/dist/scale/cli.js +0 -38
  220. package/dist/scale/cli.js.map +0 -1
  221. package/dist/scale/index.d.ts +0 -4
  222. package/dist/scale/index.d.ts.map +0 -1
  223. package/dist/scale/index.js +0 -4
  224. package/dist/scale/index.js.map +0 -1
  225. package/dist/scale/scale.d.ts +0 -5
  226. package/dist/scale/scale.d.ts.map +0 -1
  227. package/dist/scale/scale.js +0 -67
  228. package/dist/scale/scale.js.map +0 -1
  229. /package/dist/{generate/distinct/dummy.d.ts → dummy.d.ts} +0 -0
  230. /package/dist/{generate/distinct/dummy.js → dummy.js} +0 -0
package/README.md CHANGED
@@ -82,3 +82,24 @@ Commands:
82
82
  e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js relocate --from example.com --to web.site --data ~/bench/test/flat/data2.json`
83
83
  1. 'scale' rescales images in a flat directory structure to a given size.
84
84
  e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js scale --data ~/bench/test/flat/data.json --out ~/bench/test/flat/images2 --overwrite --size 128`
85
+
86
+
87
+
88
+ # Generating test data
89
+ The test data was generated using:
90
+ ```
91
+ cli generate-v1 --min-correct 1 --max-correct 6 --labelled $PWD/src/tests/data/flat_resized/data.json --unlabelled $PWD/src/tests/data/flat_resized/data.json --out $PWD/src/tests/data/flat_resized/captchas_v1.json --solved 50 --unsolved 50 --seed 0 --allowDuplicates --seed 0
92
+
93
+ cli generate-v2 --count 100 --min-correct 1 --min-incorrect 1 --min-labelled 2 --max-labelled 7 --labelled $PWD/src/tests/data/flat_resized/data.json --unlabelled $PWD/src/tests/data/flat_resized/data.json --out $PWD/src/tests/data/flat_resized/captchas_v2.json --seed 0 --allowDuplicates --seed 0
94
+
95
+ cli relocate --from '${repo}' --to newwebsite.com --input $PWD/src/tests/data/flat_resized/data.json --output $PWD/src/tests/data/flat_resized/relocated_data.json --overwrite
96
+
97
+ cli labels --input $PWD/src/tests/data/flat_resized/data.json --output $PWD/src/tests/data/flat_resized/labels.json --overwrite
98
+
99
+ cli flatten --in $PWD/src/tests/data/hierarchical --out $PWD/src/tests/data/flat --overwrite
100
+
101
+ cli resize --square --size 128 --in $PWD/src/tests/data/flat/data.json --out $PWD/src/tests/data/flat_resized --overwrite
102
+ ```
103
+
104
+
105
+ `cli` is an alias to `npm run build && npm run cli --`
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const common = require("@prosopo/common");
4
+ const helpers = require("yargs/helpers");
5
+ const yargs = require("yargs");
6
+ const dirname = process.cwd();
7
+ const logger = common.getLogger(common.LogLevel.enum.info, `${dirname}`);
8
+ class Cli extends common.Loggable {
9
+ #commands;
10
+ constructor(commands) {
11
+ super();
12
+ this.#commands = commands;
13
+ this.logger = logger;
14
+ }
15
+ config() {
16
+ let y = yargs(helpers.hideBin(process.argv)).option("log-level", {
17
+ type: "string",
18
+ choices: Object.values(common.LogLevel.options),
19
+ default: common.LogLevel.enum.info,
20
+ description: "The log level"
21
+ }).middleware((argv) => {
22
+ this.logger.setLogLevel(argv.logLevel);
23
+ }, true);
24
+ this.#commands.forEach((command) => {
25
+ y = y.command({
26
+ command: command.getCommandName(),
27
+ describe: command.getDescription(),
28
+ builder: command.getOptions(),
29
+ handler: async (argv) => {
30
+ this.logger.debug(`running ${command.getCommandName()}}`);
31
+ const args = await command.parse(argv);
32
+ await command.exec(args);
33
+ }
34
+ });
35
+ });
36
+ if (!this.#commands.find((c) => c.getCommandName() === "$0")) {
37
+ y = y.command(
38
+ "$0",
39
+ "default command",
40
+ (y2) => y2,
41
+ (argv) => {
42
+ throw new Error(`no command specified`);
43
+ }
44
+ );
45
+ }
46
+ y = y.demandCommand().strict().showHelpOnFail(false, "Specify --help for available options");
47
+ return y;
48
+ }
49
+ async exec(args = process.argv.slice(2)) {
50
+ const config = this.config();
51
+ this.logger.debug("parsing", args);
52
+ await config.parse(args);
53
+ }
54
+ }
55
+ exports.Cli = Cli;
@@ -1,2 +1,4 @@
1
1
  "use strict";
2
- require("./cli.cjs");
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const cli = require("./cli/cli.cjs");
4
+ exports.Cli = cli.Cli;
@@ -0,0 +1,9 @@
1
+ import { CliCommandAny } from './cliCommand.js';
2
+ import { Loggable } from '@prosopo/common';
3
+ export declare class Cli extends Loggable {
4
+ #private;
5
+ constructor(commands: CliCommandAny[]);
6
+ private config;
7
+ exec(args?: string[]): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAY,QAAQ,EAAa,MAAM,iBAAiB,CAAA;AAO/D,qBAAa,GAAI,SAAQ,QAAQ;;gBAGjB,QAAQ,EAAE,aAAa,EAAE;IAMrC,OAAO,CAAC,MAAM;IAsCD,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B;CAK3D"}
@@ -0,0 +1,54 @@
1
+ var _Cli_commands;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { LogLevel, Loggable, getLogger } from '@prosopo/common';
4
+ import { hideBin } from 'yargs/helpers';
5
+ import yargs from 'yargs';
6
+ const dirname = process.cwd();
7
+ const logger = getLogger(LogLevel.enum.info, `${dirname}`);
8
+ export class Cli extends Loggable {
9
+ constructor(commands) {
10
+ super();
11
+ _Cli_commands.set(this, void 0);
12
+ __classPrivateFieldSet(this, _Cli_commands, commands, "f");
13
+ this.logger = logger;
14
+ }
15
+ config() {
16
+ let y = yargs(hideBin(process.argv))
17
+ .option('log-level', {
18
+ type: 'string',
19
+ choices: Object.values(LogLevel.options),
20
+ default: LogLevel.enum.info,
21
+ description: 'The log level',
22
+ })
23
+ .middleware((argv) => {
24
+ this.logger.setLogLevel(argv.logLevel);
25
+ }, true);
26
+ __classPrivateFieldGet(this, _Cli_commands, "f").forEach((command) => {
27
+ y = y.command({
28
+ command: command.getCommandName(),
29
+ describe: command.getDescription(),
30
+ builder: command.getOptions(),
31
+ handler: async (argv) => {
32
+ this.logger.debug(`running ${command.getCommandName()}}`);
33
+ const args = await command.parse(argv);
34
+ await command.exec(args);
35
+ },
36
+ });
37
+ });
38
+ if (!__classPrivateFieldGet(this, _Cli_commands, "f").find((c) => c.getCommandName() === '$0')) {
39
+ // no default command
40
+ y = y.command('$0', 'default command', (y) => y, (argv) => {
41
+ throw new Error(`no command specified`);
42
+ });
43
+ }
44
+ y = y.demandCommand().strict().showHelpOnFail(false, 'Specify --help for available options');
45
+ return y;
46
+ }
47
+ async exec(args = process.argv.slice(2)) {
48
+ const config = this.config();
49
+ this.logger.debug('parsing', args);
50
+ await config.parse(args);
51
+ }
52
+ }
53
+ _Cli_commands = new WeakMap();
54
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,KAAe,MAAM,OAAO,CAAA;AAEnC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;AAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AAE1D,MAAM,OAAO,GAAI,SAAQ,QAAQ;IAG7B,YAAY,QAAyB;QACjC,KAAK,EAAE,CAAA;QAHX,gCAA0B;QAItB,uBAAA,IAAI,iBAAa,QAAQ,MAAA,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAEO,MAAM;QACV,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC/B,MAAM,CAAC,WAAW,EAAE;YACjB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;YAC3B,WAAW,EAAE,eAAe;SAC/B,CAAC;aACD,UAAU,CAAC,CAAC,IAAS,EAAE,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1C,CAAC,EAAE,IAAI,CAAC,CAAA;QACZ,uBAAA,IAAI,qBAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;gBACV,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE;gBACjC,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE;gBAClC,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;gBAC7B,OAAO,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;oBACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;oBACzD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBACtC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC5B,CAAC;aACJ,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,uBAAA,IAAI,qBAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,EAAE;YAC1D,qBAAqB;YACrB,CAAC,GAAG,CAAC,CAAC,OAAO,CACT,IAAI,EACJ,iBAAiB,EACjB,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,EACd,CAAC,IAAS,EAAE,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;YAC3C,CAAC,CACJ,CAAA;SACJ;QACD,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,sCAAsC,CAAC,CAAA;QAC5F,OAAO,CAAC,CAAA;IACZ,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;CACJ"}
@@ -0,0 +1,17 @@
1
+ import { Loggable } from '@prosopo/common';
2
+ import { Options } from 'yargs';
3
+ import { z } from 'zod';
4
+ export declare abstract class CliCommand<T extends z.ZodTypeAny> extends Loggable {
5
+ getOptions(): {
6
+ [key: string]: Options;
7
+ };
8
+ abstract getArgSchema(): T;
9
+ parse(args: unknown): Promise<z.infer<T>>;
10
+ _check(args: z.infer<T>): Promise<void>;
11
+ _run(args: z.infer<T>): Promise<void>;
12
+ exec(args: z.infer<T>): Promise<void>;
13
+ getCommandName(): string;
14
+ abstract getDescription(): string;
15
+ }
16
+ export type CliCommandAny = CliCommand<z.ZodTypeAny>;
17
+ //# sourceMappingURL=cliCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliCommand.d.ts","sourceRoot":"","sources":["../../src/cli/cliCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8BAAsB,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,CAAE,SAAQ,QAAQ;IAE9D,UAAU,IAAI;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACzB;aAKe,YAAY,IAAI,CAAC;IAIpB,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAQzC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAKvB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAKrB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAQ3B,cAAc;aAIL,cAAc,IAAI,MAAM;CAC3C;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { Loggable } from '@prosopo/common';
2
+ import { kebabCase } from '@prosopo/util';
3
+ export class CliCommand extends Loggable {
4
+ // get the options for the CLI
5
+ getOptions() {
6
+ return {};
7
+ }
8
+ // parse args using the schema
9
+ // use this when you have an args object but not sure if it's in the right format / contains the correct fields, e.g. args from cmdline
10
+ async parse(args) {
11
+ const argsSchema = this.getArgSchema();
12
+ const parsed = await argsSchema.parse(args);
13
+ this.logger.debug('parsed args:', parsed);
14
+ return parsed;
15
+ }
16
+ // run any checks before the main run function. This function should have no side effects, i.e. not write to disk. It's purely for conducting checks / setting up
17
+ async _check(args) {
18
+ this.logger.debug('runChecks');
19
+ }
20
+ // the main run function. This should be the function that does the work
21
+ async _run(args) {
22
+ this.logger.debug('run');
23
+ }
24
+ // exec is a public facing function that should be called by the CLI. It will run the preRun, run, and postRun functions in order
25
+ async exec(args) {
26
+ this.logger.debug('exec');
27
+ // run any checks
28
+ await this._check(args);
29
+ // then run the command
30
+ await this._run(args);
31
+ }
32
+ getCommandName() {
33
+ return kebabCase(this.constructor.name);
34
+ }
35
+ }
36
+ //# sourceMappingURL=cliCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliCommand.js","sourceRoot":"","sources":["../../src/cli/cliCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAGzC,MAAM,OAAgB,UAAmC,SAAQ,QAAQ;IACrE,8BAA8B;IACvB,UAAU;QAGb,OAAO,EAAE,CAAA;IACb,CAAC;IAKD,8BAA8B;IAC9B,uIAAuI;IAChI,KAAK,CAAC,KAAK,CAAC,IAAa;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QACzC,OAAO,MAAM,CAAA;IACjB,CAAC;IAED,iKAAiK;IAC1J,KAAK,CAAC,MAAM,CAAC,IAAgB;QAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAClC,CAAC;IAED,wEAAwE;IACjE,KAAK,CAAC,IAAI,CAAC,IAAgB;QAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,iIAAiI;IAC1H,KAAK,CAAC,IAAI,CAAC,IAAgB;QAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACzB,iBAAiB;QACjB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACvB,uBAAuB;QACvB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAEM,cAAc;QACjB,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC;CAGJ"}
@@ -0,0 +1,14 @@
1
+ import { CliCommand, CliCommandAny } from './cliCommand.js';
2
+ import { Options } from 'yargs';
3
+ import { z } from 'zod';
4
+ export declare abstract class CliCommandComposite<T extends z.ZodTypeAny> extends CliCommand<T> {
5
+ #private;
6
+ getCommands(): CliCommandAny[];
7
+ constructor(commands: CliCommandAny[]);
8
+ getOptions(): {
9
+ [key: string]: Options;
10
+ };
11
+ _run(args: z.TypeOf<T>): Promise<void>;
12
+ _check(args: z.TypeOf<T>): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=cliCommandComposite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliCommandComposite.d.ts","sourceRoot":"","sources":["../../src/cli/cliCommandComposite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8BAAsB,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;;IAG5E,WAAW;gBAIN,QAAQ,EAAE,aAAa,EAAE;IAMrB,UAAU,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE;IAOxC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3D"}
@@ -0,0 +1,34 @@
1
+ var _CliCommandComposite_commands;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { CliCommand } from './cliCommand.js';
4
+ export class CliCommandComposite extends CliCommand {
5
+ getCommands() {
6
+ return __classPrivateFieldGet(this, _CliCommandComposite_commands, "f");
7
+ }
8
+ constructor(commands) {
9
+ super();
10
+ _CliCommandComposite_commands.set(this, []);
11
+ // take a copy of the array to avoid leakage
12
+ __classPrivateFieldSet(this, _CliCommandComposite_commands, [...commands], "f");
13
+ }
14
+ getOptions() {
15
+ // merge options in turn from each command. Command order matters, latter commands will overwrite earlier ones
16
+ return __classPrivateFieldGet(this, _CliCommandComposite_commands, "f").reduce((prev, command) => {
17
+ return { ...prev, ...command.getOptions() };
18
+ }, {});
19
+ }
20
+ _run(args) {
21
+ return __classPrivateFieldGet(this, _CliCommandComposite_commands, "f").reduce(async (prev, command) => {
22
+ await prev;
23
+ await command._run(args);
24
+ }, Promise.resolve());
25
+ }
26
+ _check(args) {
27
+ return __classPrivateFieldGet(this, _CliCommandComposite_commands, "f").reduce(async (prev, command) => {
28
+ await prev;
29
+ await command._check(args);
30
+ }, Promise.resolve());
31
+ }
32
+ }
33
+ _CliCommandComposite_commands = new WeakMap();
34
+ //# sourceMappingURL=cliCommandComposite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliCommandComposite.js","sourceRoot":"","sources":["../../src/cli/cliCommandComposite.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,iBAAiB,CAAA;AAI3D,MAAM,OAAgB,mBAA4C,SAAQ,UAAa;IAG5E,WAAW;QACd,OAAO,uBAAA,IAAI,qCAAU,CAAA;IACzB,CAAC;IAED,YAAY,QAAyB;QACjC,KAAK,EAAE,CAAA;QAPX,wCAA6B,EAAE,EAAA;QAQ3B,4CAA4C;QAC5C,uBAAA,IAAI,iCAAa,CAAC,GAAG,QAAQ,CAAC,MAAA,CAAA;IAClC,CAAC;IAEe,UAAU;QACtB,8GAA8G;QAC9G,OAAO,uBAAA,IAAI,qCAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC3C,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE,CAAA;QAC/C,CAAC,EAAE,EAAE,CAAC,CAAA;IACV,CAAC;IAEe,IAAI,CAAC,IAAiB;QAClC,OAAO,uBAAA,IAAI,qCAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YACjD,MAAM,IAAI,CAAA;YACV,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACzB,CAAC;IAEe,MAAM,CAAC,IAAiB;QACpC,OAAO,uBAAA,IAAI,qCAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YACjD,MAAM,IAAI,CAAA;YACV,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACzB,CAAC;CACJ"}
package/dist/cli.js CHANGED
@@ -1,48 +1,34 @@
1
- import { LogLevel, getLogger } from '@prosopo/common';
2
- import { hideBin } from 'yargs/helpers';
1
+ import { Cli } from './index.js';
2
+ import { Flatten } from './commands/flatten.js';
3
+ import { GenerateV1 } from './commands/generateV1.js';
4
+ import { GenerateV2 } from './commands/generateV2.js';
5
+ import { Get } from './commands/get.js';
6
+ import { Labels } from './commands/labels.js';
7
+ import { Relocate } from './commands/relocate.js';
8
+ import { Resize } from './commands/resize.js';
3
9
  import esMain from 'es-main';
4
- import flatten from './flatten/cli.js';
5
- import generate from './generate/cli.js';
6
- import get from './get/cli.js';
7
- import labels from './labels/cli.js';
8
- import process from 'process';
9
- import relocate from './relocate/cli.js';
10
- import scale from './scale/cli.js';
11
- import yargs from 'yargs';
12
- const dirname = process.cwd();
13
- const logger = getLogger(LogLevel.enum.info, `${dirname}`);
14
10
  const main = async () => {
15
- await yargs(hideBin(process.argv))
16
- .help()
17
- .option('log-level', {
18
- type: 'string',
19
- choices: Object.values(LogLevel.options),
20
- default: LogLevel.enum.info,
21
- description: 'The log level',
22
- })
23
- .middleware((argv) => {
24
- logger.setLogLevel(argv.logLevel);
25
- })
26
- .command(generate({ logger }))
27
- .command(flatten({ logger }))
28
- .command(scale({ logger }))
29
- .command(relocate({ logger }))
30
- .command(get({ logger }))
31
- .command(labels({ logger }))
32
- .strictCommands()
33
- .showHelpOnFail(false, 'Specify --help for available options')
34
- .fail(false)
35
- .parse();
11
+ const commands = [
12
+ new Flatten(),
13
+ new GenerateV1(),
14
+ new GenerateV2(),
15
+ new Get(),
16
+ new Labels(),
17
+ new Relocate(),
18
+ new Resize(),
19
+ ];
20
+ const cli = new Cli(commands);
21
+ cli.logger.setLogLevel('debug');
22
+ await cli.exec();
36
23
  };
37
24
  //if main process
38
25
  if (esMain(import.meta)) {
39
26
  main()
40
27
  .then(() => {
41
- logger.debug('done');
42
28
  process.exit(0);
43
29
  })
44
30
  .catch((err) => {
45
- logger.error('error:', err);
31
+ console.log('error', err);
46
32
  process.exit(1);
47
33
  });
48
34
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,OAAO,MAAM,kBAAkB,CAAA;AACtC,OAAO,QAAQ,MAAM,mBAAmB,CAAA;AACxC,OAAO,GAAG,MAAM,cAAc,CAAA;AAC9B,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,QAAQ,MAAM,mBAAmB,CAAA;AACxC,OAAO,KAAK,MAAM,gBAAgB,CAAA;AAClC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;AAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AAE1D,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IACpB,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC7B,IAAI,EAAE;SACN,MAAM,CAAC,WAAW,EAAE;QACjB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;QAC3B,WAAW,EAAE,eAAe;KAC/B,CAAC;SACD,UAAU,CAAC,CAAC,IAAS,EAAE,EAAE;QACtB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC,CAAC;SACD,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC7B,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC5B,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SACxB,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SAC3B,cAAc,EAAE;SAChB,cAAc,CAAC,KAAK,EAAE,sCAAsC,CAAC;SAC7D,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,EAAE,CAAA;AAChB,CAAC,CAAA;AAED,iBAAiB;AACjB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;IACrB,IAAI,EAAE;SACD,IAAI,CAAC,GAAG,EAAE;QACP,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;CACT"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAEhC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,MAAM,MAAM,SAAS,CAAA;AAE5B,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IACpB,MAAM,QAAQ,GAAoB;QAC9B,IAAI,OAAO,EAAE;QACb,IAAI,UAAU,EAAE;QAChB,IAAI,UAAU,EAAE;QAChB,IAAI,GAAG,EAAE;QACT,IAAI,MAAM,EAAE;QACZ,IAAI,QAAQ,EAAE;QACd,IAAI,MAAM,EAAE;KACf,CAAA;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC7B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAC/B,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;AACpB,CAAC,CAAA;AAED,iBAAiB;AACjB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;IACrB,IAAI,EAAE;SACD,IAAI,CAAC,GAAG,EAAE;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;CACT"}
@@ -0,0 +1,56 @@
1
+ /// <reference types="yargs" />
2
+ import { InputOutputCliCommand } from '../utils/inputOutput.js';
3
+ import { z } from 'zod';
4
+ export declare const ArgsSchema: z.ZodObject<{
5
+ input: z.ZodString;
6
+ output: z.ZodString;
7
+ overwrite: z.ZodOptional<z.ZodBoolean>;
8
+ allowDuplicates: z.ZodOptional<z.ZodBoolean>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ input: string;
11
+ output: string;
12
+ overwrite?: boolean | undefined;
13
+ allowDuplicates?: boolean | undefined;
14
+ }, {
15
+ input: string;
16
+ output: string;
17
+ overwrite?: boolean | undefined;
18
+ allowDuplicates?: boolean | undefined;
19
+ }>;
20
+ export type ArgsSchemaType = typeof ArgsSchema;
21
+ export type Args = z.infer<ArgsSchemaType>;
22
+ export declare class Flatten extends InputOutputCliCommand<ArgsSchemaType> {
23
+ getArgSchema(): z.ZodObject<{
24
+ input: z.ZodString;
25
+ output: z.ZodString;
26
+ overwrite: z.ZodOptional<z.ZodBoolean>;
27
+ allowDuplicates: z.ZodOptional<z.ZodBoolean>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ input: string;
30
+ output: string;
31
+ overwrite?: boolean | undefined;
32
+ allowDuplicates?: boolean | undefined;
33
+ }, {
34
+ input: string;
35
+ output: string;
36
+ overwrite?: boolean | undefined;
37
+ allowDuplicates?: boolean | undefined;
38
+ }>;
39
+ getDescription(): string;
40
+ getOptions(): {
41
+ [key: string]: import("yargs").Options;
42
+ } & {
43
+ input: {
44
+ description: string;
45
+ };
46
+ output: {
47
+ description: string;
48
+ };
49
+ allowDuplicates: {
50
+ boolean: boolean;
51
+ description: string;
52
+ };
53
+ };
54
+ _run(args: Args): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=flatten.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../src/commands/flatten.ts"],"names":[],"mappings":";AACA,OAAO,EAAkD,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAI/G,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;EAErB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,UAAU,CAAA;AAC9C,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;AAE1C,qBAAa,OAAQ,SAAQ,qBAAqB,CAAC,cAAc,CAAC;IAC9C,YAAY;;;;;;;;;;;;;;;;IAIZ,cAAc,IAAI,MAAM;IAIxB,UAAU;;;;;;;;;;;;;;IAeJ,IAAI,CAAC,IAAI,EAAE,IAAI;CAgFxC"}
@@ -0,0 +1,103 @@
1
+ import { CaptchaItemTypes, DataSchema } from '@prosopo/types';
2
+ import { InputOutputArgsSchema as InputOutputArgsSchema, InputOutputCliCommand } from '../utils/inputOutput.js';
3
+ import { at, lodash } from '@prosopo/util';
4
+ import { blake2b } from '@noble/hashes/blake2b';
5
+ import { u8aToHex } from '@polkadot/util';
6
+ import { z } from 'zod';
7
+ import cliProgress from 'cli-progress';
8
+ import fs from 'fs';
9
+ export const ArgsSchema = InputOutputArgsSchema.extend({
10
+ allowDuplicates: z.boolean().optional(),
11
+ });
12
+ export class Flatten extends InputOutputCliCommand {
13
+ getArgSchema() {
14
+ return ArgsSchema;
15
+ }
16
+ getDescription() {
17
+ return 'Restructure a directory containing directories for each image classification into a single directory with a file containing the labels';
18
+ }
19
+ getOptions() {
20
+ return lodash().merge(super.getOptions(), {
21
+ input: {
22
+ description: 'Path to the data directory containing subdirectories for each image classification',
23
+ },
24
+ output: {
25
+ description: 'Where to put the output file containing the labels and single directory of images',
26
+ },
27
+ allowDuplicates: {
28
+ boolean: true,
29
+ description: 'If true, allow duplicates in the data',
30
+ },
31
+ });
32
+ }
33
+ async _run(args) {
34
+ this.logger.debug('flatten run');
35
+ await super._run(args);
36
+ const dataDir = args.input;
37
+ const outDir = args.output;
38
+ // find the labels (these should be subdirectories of the data directory)
39
+ this.logger.info('reading data');
40
+ const labels = fs
41
+ .readdirSync(dataDir, { withFileTypes: true })
42
+ .filter((dirent) => dirent.isDirectory())
43
+ .map((dirent) => dirent.name)
44
+ .sort();
45
+ const imagesByLabel = labels.map((label) => fs.readdirSync(`${dataDir}/${label}`));
46
+ // create the output directory
47
+ const imageDir = `${outDir}/images`;
48
+ fs.mkdirSync(imageDir, { recursive: true });
49
+ const bar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);
50
+ // for each label
51
+ const items = [];
52
+ bar.start(imagesByLabel.reduce((acc, images) => acc + images.length, 0), 0);
53
+ labels.forEach((label, i) => {
54
+ const images = at(imagesByLabel, i);
55
+ // for each image
56
+ for (const image of images) {
57
+ bar.increment();
58
+ // this.logger.log(`flattening ${label}/${image}`)
59
+ // copy the image to the output directory
60
+ const extension = image.split('.').pop();
61
+ // read file to bytes
62
+ const content = fs.readFileSync(`${dataDir}/${label}/${image}`);
63
+ // hash based on the content of the image
64
+ const hash = blake2b(content);
65
+ const hex = u8aToHex(hash);
66
+ const name = `${hex}.${extension}`;
67
+ if (fs.existsSync(`${imageDir}/${name}`)) {
68
+ for (const item of items) {
69
+ if (item.hash === hex) {
70
+ this.logger.log(`\ndupe: ${label}/${image}`);
71
+ this.logger.log('item hash', item.hash);
72
+ this.logger.log('item label', item.label);
73
+ }
74
+ }
75
+ if (!args.allowDuplicates) {
76
+ throw new Error(`duplicate image detected`);
77
+ }
78
+ }
79
+ fs.copyFileSync(`${dataDir}/${label}/${image}`, `${imageDir}/${name}`);
80
+ const filePath = fs.realpathSync(`${imageDir}/${name}`);
81
+ // add the image to the map file
82
+ const entry = {
83
+ data: filePath,
84
+ type: CaptchaItemTypes.Image,
85
+ label,
86
+ hash: hex,
87
+ };
88
+ items.push(entry);
89
+ }
90
+ });
91
+ bar.stop();
92
+ const data = {
93
+ items,
94
+ };
95
+ // verify data
96
+ this.logger.info('verifying data');
97
+ DataSchema.parse(data);
98
+ // write map file
99
+ this.logger.info('writing data');
100
+ fs.writeFileSync(`${outDir}/data.json`, JSON.stringify(data, null, 4));
101
+ }
102
+ }
103
+ //# sourceMappingURL=flatten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../src/commands/flatten.ts"],"names":[],"mappings":"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"}