@prosopo/datasets-fs 0.1.17

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 (174) hide show
  1. package/README.md +84 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +50 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/flatten/args.d.ts +16 -0
  7. package/dist/flatten/args.d.ts.map +1 -0
  8. package/dist/flatten/args.js +8 -0
  9. package/dist/flatten/args.js.map +1 -0
  10. package/dist/flatten/cli.d.ts +18 -0
  11. package/dist/flatten/cli.d.ts.map +1 -0
  12. package/dist/flatten/cli.js +31 -0
  13. package/dist/flatten/cli.js.map +1 -0
  14. package/dist/flatten/flatten.d.ts +5 -0
  15. package/dist/flatten/flatten.d.ts.map +1 -0
  16. package/dist/flatten/flatten.js +66 -0
  17. package/dist/flatten/flatten.js.map +1 -0
  18. package/dist/flatten/index.d.ts +4 -0
  19. package/dist/flatten/index.d.ts.map +1 -0
  20. package/dist/flatten/index.js +4 -0
  21. package/dist/flatten/index.js.map +1 -0
  22. package/dist/generate/args.d.ts +37 -0
  23. package/dist/generate/args.d.ts.map +1 -0
  24. package/dist/generate/args.js +15 -0
  25. package/dist/generate/args.js.map +1 -0
  26. package/dist/generate/cli.d.ts +32 -0
  27. package/dist/generate/cli.d.ts.map +1 -0
  28. package/dist/generate/cli.js +63 -0
  29. package/dist/generate/cli.js.map +1 -0
  30. package/dist/generate/distinct/args.d.ts +49 -0
  31. package/dist/generate/distinct/args.d.ts.map +1 -0
  32. package/dist/generate/distinct/args.js +10 -0
  33. package/dist/generate/distinct/args.js.map +1 -0
  34. package/dist/generate/distinct/cli.d.ts +20 -0
  35. package/dist/generate/distinct/cli.d.ts.map +1 -0
  36. package/dist/generate/distinct/cli.js +32 -0
  37. package/dist/generate/distinct/cli.js.map +1 -0
  38. package/dist/generate/distinct/dummy.d.ts +2 -0
  39. package/dist/generate/distinct/dummy.d.ts.map +1 -0
  40. package/dist/generate/distinct/dummy.js +29 -0
  41. package/dist/generate/distinct/dummy.js.map +1 -0
  42. package/dist/generate/distinct/generate.d.ts +5 -0
  43. package/dist/generate/distinct/generate.d.ts.map +1 -0
  44. package/dist/generate/distinct/generate.js +186 -0
  45. package/dist/generate/distinct/generate.js.map +1 -0
  46. package/dist/generate/distinct/index.d.ts +4 -0
  47. package/dist/generate/distinct/index.d.ts.map +1 -0
  48. package/dist/generate/distinct/index.js +4 -0
  49. package/dist/generate/distinct/index.js.map +1 -0
  50. package/dist/generate/index.d.ts +5 -0
  51. package/dist/generate/index.d.ts.map +1 -0
  52. package/dist/generate/index.js +5 -0
  53. package/dist/generate/index.js.map +1 -0
  54. package/dist/generate/union/args.d.ts +52 -0
  55. package/dist/generate/union/args.d.ts.map +1 -0
  56. package/dist/generate/union/args.js +11 -0
  57. package/dist/generate/union/args.js.map +1 -0
  58. package/dist/generate/union/cli.d.ts +22 -0
  59. package/dist/generate/union/cli.d.ts.map +1 -0
  60. package/dist/generate/union/cli.js +36 -0
  61. package/dist/generate/union/cli.js.map +1 -0
  62. package/dist/generate/union/generate.d.ts +5 -0
  63. package/dist/generate/union/generate.d.ts.map +1 -0
  64. package/dist/generate/union/generate.js +168 -0
  65. package/dist/generate/union/generate.js.map +1 -0
  66. package/dist/generate/union/index.d.ts +4 -0
  67. package/dist/generate/union/index.d.ts.map +1 -0
  68. package/dist/generate/union/index.js +4 -0
  69. package/dist/generate/union/index.js.map +1 -0
  70. package/dist/generate/util.d.ts +12 -0
  71. package/dist/generate/util.d.ts.map +1 -0
  72. package/dist/generate/util.js +40 -0
  73. package/dist/generate/util.js.map +1 -0
  74. package/dist/get/args.d.ts +10 -0
  75. package/dist/get/args.d.ts.map +1 -0
  76. package/dist/get/args.js +6 -0
  77. package/dist/get/args.js.map +1 -0
  78. package/dist/get/cli.d.ts +14 -0
  79. package/dist/get/cli.d.ts.map +1 -0
  80. package/dist/get/cli.js +20 -0
  81. package/dist/get/cli.js.map +1 -0
  82. package/dist/get/get.d.ts +5 -0
  83. package/dist/get/get.d.ts.map +1 -0
  84. package/dist/get/get.js +58 -0
  85. package/dist/get/get.js.map +1 -0
  86. package/dist/get/index.d.ts +4 -0
  87. package/dist/get/index.d.ts.map +1 -0
  88. package/dist/get/index.js +4 -0
  89. package/dist/get/index.js.map +1 -0
  90. package/dist/index.d.ts +2 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +15 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/labels/args.d.ts +10 -0
  95. package/dist/labels/args.d.ts.map +1 -0
  96. package/dist/labels/args.js +6 -0
  97. package/dist/labels/args.js.map +1 -0
  98. package/dist/labels/cli.d.ts +14 -0
  99. package/dist/labels/cli.d.ts.map +1 -0
  100. package/dist/labels/cli.js +20 -0
  101. package/dist/labels/cli.js.map +1 -0
  102. package/dist/labels/index.d.ts +4 -0
  103. package/dist/labels/index.d.ts.map +1 -0
  104. package/dist/labels/index.js +4 -0
  105. package/dist/labels/index.js.map +1 -0
  106. package/dist/labels/labels.d.ts +5 -0
  107. package/dist/labels/labels.d.ts.map +1 -0
  108. package/dist/labels/labels.js +23 -0
  109. package/dist/labels/labels.js.map +1 -0
  110. package/dist/relocate/args.d.ts +16 -0
  111. package/dist/relocate/args.d.ts.map +1 -0
  112. package/dist/relocate/args.js +8 -0
  113. package/dist/relocate/args.js.map +1 -0
  114. package/dist/relocate/cli.d.ts +18 -0
  115. package/dist/relocate/cli.d.ts.map +1 -0
  116. package/dist/relocate/cli.js +30 -0
  117. package/dist/relocate/cli.js.map +1 -0
  118. package/dist/relocate/relocate.d.ts +5 -0
  119. package/dist/relocate/relocate.d.ts.map +1 -0
  120. package/dist/relocate/relocate.js +38 -0
  121. package/dist/relocate/relocate.js.map +1 -0
  122. package/dist/scale/args.d.ts +22 -0
  123. package/dist/scale/args.d.ts.map +1 -0
  124. package/dist/scale/args.js +10 -0
  125. package/dist/scale/args.js.map +1 -0
  126. package/dist/scale/cli.d.ts +22 -0
  127. package/dist/scale/cli.d.ts.map +1 -0
  128. package/dist/scale/cli.js +39 -0
  129. package/dist/scale/cli.js.map +1 -0
  130. package/dist/scale/index.d.ts +4 -0
  131. package/dist/scale/index.d.ts.map +1 -0
  132. package/dist/scale/index.js +4 -0
  133. package/dist/scale/index.js.map +1 -0
  134. package/dist/scale/scale.d.ts +5 -0
  135. package/dist/scale/scale.d.ts.map +1 -0
  136. package/dist/scale/scale.js +65 -0
  137. package/dist/scale/scale.js.map +1 -0
  138. package/package.json +54 -0
  139. package/src/cli.ts +50 -0
  140. package/src/flatten/args.ts +11 -0
  141. package/src/flatten/cli.ts +33 -0
  142. package/src/flatten/flatten.ts +77 -0
  143. package/src/flatten/index.ts +3 -0
  144. package/src/generate/args.ts +18 -0
  145. package/src/generate/cli.ts +65 -0
  146. package/src/generate/distinct/args.ts +13 -0
  147. package/src/generate/distinct/cli.ts +34 -0
  148. package/src/generate/distinct/dummy.ts +35 -0
  149. package/src/generate/distinct/generate.ts +238 -0
  150. package/src/generate/distinct/index.ts +3 -0
  151. package/src/generate/index.ts +4 -0
  152. package/src/generate/union/args.ts +14 -0
  153. package/src/generate/union/cli.ts +38 -0
  154. package/src/generate/union/generate.ts +210 -0
  155. package/src/generate/union/index.ts +3 -0
  156. package/src/generate/util.ts +61 -0
  157. package/src/get/args.ts +9 -0
  158. package/src/get/cli.ts +21 -0
  159. package/src/get/get.ts +56 -0
  160. package/src/get/index.ts +3 -0
  161. package/src/index.ts +14 -0
  162. package/src/labels/args.ts +9 -0
  163. package/src/labels/cli.ts +21 -0
  164. package/src/labels/index.ts +3 -0
  165. package/src/labels/labels.ts +27 -0
  166. package/src/relocate/args.ts +11 -0
  167. package/src/relocate/cli.ts +32 -0
  168. package/src/relocate/relocate.ts +38 -0
  169. package/src/scale/args.ts +13 -0
  170. package/src/scale/cli.ts +43 -0
  171. package/src/scale/index.ts +3 -0
  172. package/src/scale/scale.ts +79 -0
  173. package/tsconfig.json +17 -0
  174. package/tsconfig.tsbuildinfo +1 -0
package/README.md ADDED
@@ -0,0 +1,84 @@
1
+ ## How to produce captchas
2
+
3
+ You need 3 files:
4
+
5
+ 1. a json file containing labelled data in the form:
6
+ ```json
7
+ [
8
+ {
9
+ "label": "dog",
10
+ "data": "http://example.com/a.png"
11
+ },
12
+ {
13
+ "label": "cat",
14
+ "data": "http://example.com/b.png"
15
+ },
16
+ ...
17
+ ]
18
+ ```
19
+ 1. a json file containing unlabelled data in the form:
20
+ ```json
21
+ [
22
+ {
23
+ "data": "http://example.com/c.png"
24
+ },
25
+ {
26
+ "data": "http://example.com/d.png"
27
+ },
28
+ ...
29
+ ]
30
+ ```
31
+ 1. (optional) a json file with an array of labels which unlabelled data can be categorised into. If not specified will default to the same labels as seen in the labelled data.
32
+
33
+ Then build and run the cli, passing appropriate parameters:
34
+ `npm run build && node ./dist/js/cli.js generate --labelled /path/to/my/labelled/data.json --unlabelled /path/to/my/unlabelled/data.json --seed 0 --labels /path/to/my/labels.json --output /path/to/the/output/captchas.json`
35
+
36
+ Use `node ./dist/js/cli.ts --help` to inspect other parameters.
37
+
38
+ Commands:
39
+
40
+ 1. `flatten` converts a hierarchical directory structure into a single directory with corresponding map file, e.g.
41
+ ```
42
+ data/
43
+ dog/
44
+ a.png
45
+ ...
46
+ cat/
47
+ b.png
48
+ ...
49
+ ```
50
+ into
51
+ ```
52
+ data/
53
+ a.png
54
+ b.png
55
+ ...
56
+ map.json
57
+ ```
58
+ where `map.json` looks like:
59
+ ```
60
+ [
61
+ {
62
+ "label": "dog",
63
+ "data": "http://example.com/a.png"
64
+ },
65
+ {
66
+ "label": "cat",
67
+ "data": "http://example.com/b.png"
68
+ },
69
+ ...
70
+ ]
71
+ ```
72
+ e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js flatten --in ~/bench/test/data --out ~/bench/test/flat --overwrite`
73
+ 1. `generateDistinct` takes the 3 files described above and produces captcha challenges comprising 2 rounds, one labelled and one unlabelled.
74
+ e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js generate distinct --out ~/bench/test/captchas.json --labelled ~/bench/test/flat/data.json --unlabelled ~/bench/test/flat/data.json --seed 0 --size 9 --allow-duplicates --solved 1 --unsolved 1 --overwrite --labels ~/bench/test/flat/labels.json`
75
+ 1. `generateUnion` takes the 3 files described above and produces captcha challenges comprising one or more rounds, mixing labelled and unlabelled data into a single round.
76
+ e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js generate union --out ~/bench/test/captchas-union.json --labelled ~/bench/test/flat/data.json --unlabelled ~/bench/test/flat/data.json --seed 0 --size 9 --allow-duplicates --count 2 --overwrite --labels ~/bench/test/flat/labels.json`
77
+ 1. 'labels' gets all labels from a data json.
78
+ e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js labels --data ~/bench/test/flat/data2.json`
79
+ 1. 'get' fetches all images using a GET request, displaying errors for any images which hit 404 or not OK.
80
+ e.g. `npm run -w @prosopo/datasets-fs build && node packages/datasets-fs/dist/cli.js get --data ~/bench/test/flat/data2.json`
81
+ 1. 'relocate' rewrites the url of images in a json file.
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
+ 1. 'scale' rescales images in a flat directory structure to a given size.
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`
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,50 @@
1
+ import { __awaiter } from "tslib";
2
+ import { LogLevelSchema, getLogger } from '@prosopo/common';
3
+ import { hideBin } from 'yargs/helpers';
4
+ import esMain from 'es-main';
5
+ import flatten from './flatten/cli.js';
6
+ import generate from './generate/cli.js';
7
+ import get from './get/cli.js';
8
+ import labels from './labels/cli.js';
9
+ import process from 'process';
10
+ import relocate from './relocate/cli.js';
11
+ import scale from './scale/cli.js';
12
+ import yargs from 'yargs';
13
+ const dirname = process.cwd();
14
+ const logger = getLogger(LogLevelSchema.enum.Info, `${dirname}`);
15
+ const main = () => __awaiter(void 0, void 0, void 0, function* () {
16
+ yield yargs(hideBin(process.argv))
17
+ .help()
18
+ .option('log-level', {
19
+ type: 'string',
20
+ choices: Object.values(LogLevelSchema.enum),
21
+ default: LogLevelSchema.enum.Info,
22
+ description: 'The log level',
23
+ })
24
+ .middleware((argv) => {
25
+ logger.setLogLevel(argv.logLevel);
26
+ })
27
+ .command(generate({ logger }))
28
+ .command(flatten({ logger }))
29
+ .command(scale({ logger }))
30
+ .command(relocate({ logger }))
31
+ .command(get({ logger }))
32
+ .command(labels({ logger }))
33
+ .strictCommands()
34
+ .showHelpOnFail(false, 'Specify --help for available options')
35
+ .fail(false)
36
+ .parse();
37
+ });
38
+ //if main process
39
+ if (esMain(import.meta)) {
40
+ main()
41
+ .then(() => {
42
+ logger.debug('done');
43
+ process.exit(0);
44
+ })
45
+ .catch((err) => {
46
+ logger.error('error:', err);
47
+ process.exit(1);
48
+ });
49
+ }
50
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAAA,OAAO,EAAY,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACrE,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,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AAEhE,MAAM,IAAI,GAAG,GAAS,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,cAAc,CAAC,IAAI,CAAC;QAC3C,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI;QACjC,WAAW,EAAE,eAAe;KAC/B,CAAC;SACD,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;QACjB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAoB,CAAC,CAAA;IACjD,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,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"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export declare const argsSchema: z.ZodObject<{
3
+ data: z.ZodString;
4
+ out: z.ZodString;
5
+ overwrite: z.ZodOptional<z.ZodBoolean>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ data: string;
8
+ out: string;
9
+ overwrite?: boolean | undefined;
10
+ }, {
11
+ data: string;
12
+ out: string;
13
+ overwrite?: boolean | undefined;
14
+ }>;
15
+ export type Args = z.infer<typeof argsSchema>;
16
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/flatten/args.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,UAAU;;;;;;;;;;;;EAIrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ // Args for generating a dataset
2
+ import { z } from 'zod';
3
+ export const argsSchema = z.object({
4
+ data: z.string(),
5
+ out: z.string(),
6
+ overwrite: z.boolean().optional(),
7
+ });
8
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/flatten/args.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { ArgumentsCamelCase, Argv } from 'yargs';
2
+ import { Logger } from '@prosopo/common';
3
+ declare const _default: (cmdArgs?: {
4
+ logger?: Logger;
5
+ }) => {
6
+ command: string;
7
+ describe: string;
8
+ builder: (yargs: Argv) => Argv<{
9
+ data: string;
10
+ } & {
11
+ out: string;
12
+ } & {
13
+ overwrite: boolean | undefined;
14
+ }>;
15
+ handler: (argv: ArgumentsCamelCase) => Promise<void>;
16
+ };
17
+ export default _default;
18
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/flatten/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;mCAId;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;qBAKpB,IAAI;;;;;;;oBAkBC,kBAAkB;;AAvBhD,wBA2BC"}
@@ -0,0 +1,31 @@
1
+ import { __awaiter } from "tslib";
2
+ import { argsSchema } from './args.js';
3
+ import flatten from './flatten.js';
4
+ export default (cmdArgs) => {
5
+ return {
6
+ command: 'flatten',
7
+ describe: 'Restructure a directory containing directories for each image classification into a single directory with a file containing the labels',
8
+ builder: (yargs) => {
9
+ return yargs
10
+ .option('data', {
11
+ type: 'string',
12
+ alias: 'in',
13
+ demand: true,
14
+ description: 'Path to the data directory containing subdirectories for each image classification',
15
+ })
16
+ .option('out', {
17
+ type: 'string',
18
+ demand: true,
19
+ description: 'Where to put the output file containing the labels and single directory of images',
20
+ })
21
+ .option('overwrite', {
22
+ type: 'boolean',
23
+ description: 'Overwrite the output file if it already exists',
24
+ });
25
+ },
26
+ handler: (argv) => __awaiter(void 0, void 0, void 0, function* () {
27
+ yield flatten(argsSchema.parse(argv), cmdArgs === null || cmdArgs === void 0 ? void 0 : cmdArgs.logger);
28
+ }),
29
+ };
30
+ };
31
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/flatten/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,eAAe,CAAC,OAA6B,EAAE,EAAE;IAC7C,OAAO;QACH,OAAO,EAAE,SAAS;QAClB,QAAQ,EACJ,wIAAwI;QAC5I,OAAO,EAAE,CAAC,KAAW,EAAE,EAAE;YACrB,OAAO,KAAK;iBACP,MAAM,CAAC,MAAM,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,oFAAoF;aACpG,CAAC;iBACD,MAAM,CAAC,KAAK,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,mFAAmF;aACnG,CAAC;iBACD,MAAM,CAAC,WAAW,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gDAAgD;aAChE,CAAC,CAAA;QACV,CAAC;QACD,OAAO,EAAE,CAAO,IAAwB,EAAE,EAAE;YACxC,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,CAAA;QAC1D,CAAC,CAAA;KACJ,CAAA;AACL,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { Args } from './args.js';
2
+ import { Logger } from '@prosopo/common';
3
+ declare const _default: (args: Args, logger?: Logger) => Promise<void>;
4
+ export default _default;
5
+ //# sourceMappingURL=flatten.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../src/flatten/flatten.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAqC,MAAM,iBAAiB,CAAA;+BAK/C,IAAI,WAAW,MAAM;AAAjD,wBAqEC"}
@@ -0,0 +1,66 @@
1
+ import { __awaiter } from "tslib";
2
+ import { CaptchaItemTypes, DataSchema } from '@prosopo/types';
3
+ import { ProsopoEnvError, getLoggerDefault } from '@prosopo/common';
4
+ import { blake2b } from '@noble/hashes/blake2b';
5
+ import { u8aToHex } from '@polkadot/util';
6
+ import fs from 'fs';
7
+ export default (args, logger) => __awaiter(void 0, void 0, void 0, function* () {
8
+ logger = logger || getLoggerDefault();
9
+ logger.debug(args, 'flattening...');
10
+ const dataDir = args.data;
11
+ if (!fs.existsSync(dataDir)) {
12
+ throw new ProsopoEnvError(new Error(`data directory does not exist: ${dataDir}`), 'FS.DIRECTORY_NOT_FOUND');
13
+ }
14
+ const outDir = args.out;
15
+ const overwrite = args.overwrite || false;
16
+ if (!overwrite && fs.existsSync(outDir)) {
17
+ throw new ProsopoEnvError(new Error(`output directory already exists: ${outDir}`), 'FS.DIRECTORY_ALREADY_EXISTS');
18
+ }
19
+ // find the labels (these should be subdirectories of the data directory)
20
+ const labels = fs
21
+ .readdirSync(dataDir, { withFileTypes: true })
22
+ .filter((dirent) => dirent.isDirectory())
23
+ .map((dirent) => dirent.name);
24
+ // create the output directory
25
+ const imageDir = `${outDir}/images`;
26
+ fs.mkdirSync(imageDir, { recursive: true });
27
+ // for each label
28
+ const items = [];
29
+ for (const label of labels) {
30
+ // find all the images
31
+ const images = fs.readdirSync(`${dataDir}/${label}`);
32
+ // for each image
33
+ for (const image of images) {
34
+ logger.log(`flattening ${label}/${image}`);
35
+ // copy the image to the output directory
36
+ const extension = image.split('.').pop();
37
+ // read file to bytes
38
+ const content = fs.readFileSync(`${dataDir}/${label}/${image}`);
39
+ // hash based on the content of the image
40
+ const hash = blake2b(content);
41
+ const hex = u8aToHex(hash);
42
+ const name = `${hex}.${extension}`;
43
+ if (fs.existsSync(`${imageDir}/${name}`)) {
44
+ logger.log(`duplicate image: ${label}/${image} -> ${name}`);
45
+ }
46
+ fs.copyFileSync(`${dataDir}/${label}/${image}`, `${imageDir}/${name}`);
47
+ const filePath = fs.realpathSync(`${imageDir}/${name}`);
48
+ // add the image to the map file
49
+ const entry = {
50
+ data: filePath,
51
+ type: CaptchaItemTypes.Image,
52
+ label,
53
+ hash: hex,
54
+ };
55
+ items.push(entry);
56
+ }
57
+ }
58
+ const data = {
59
+ items,
60
+ };
61
+ // verify data
62
+ DataSchema.parse(data);
63
+ // write map file
64
+ fs.writeFileSync(`${outDir}/data.json`, JSON.stringify(data, null, 4));
65
+ });
66
+ //# sourceMappingURL=flatten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../src/flatten/flatten.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './flatten.js';
2
+ export * from './cli.js';
3
+ export * from './args.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/flatten/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './flatten.js';
2
+ export * from './cli.js';
3
+ export * from './args.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/flatten/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ export declare const argsSchema: z.ZodObject<{
3
+ labels: z.ZodOptional<z.ZodString>;
4
+ out: z.ZodString;
5
+ labelled: z.ZodOptional<z.ZodString>;
6
+ unlabelled: z.ZodOptional<z.ZodString>;
7
+ seed: z.ZodOptional<z.ZodNumber>;
8
+ size: z.ZodOptional<z.ZodNumber>;
9
+ overwrite: z.ZodOptional<z.ZodBoolean>;
10
+ allowDuplicates: z.ZodOptional<z.ZodBoolean>;
11
+ allowDuplicatesLabelled: z.ZodOptional<z.ZodBoolean>;
12
+ allowDuplicatesUnlabelled: z.ZodOptional<z.ZodBoolean>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ out: string;
15
+ labels?: string | undefined;
16
+ labelled?: string | undefined;
17
+ unlabelled?: string | undefined;
18
+ seed?: number | undefined;
19
+ size?: number | undefined;
20
+ overwrite?: boolean | undefined;
21
+ allowDuplicates?: boolean | undefined;
22
+ allowDuplicatesLabelled?: boolean | undefined;
23
+ allowDuplicatesUnlabelled?: boolean | undefined;
24
+ }, {
25
+ out: string;
26
+ labels?: string | undefined;
27
+ labelled?: string | undefined;
28
+ unlabelled?: string | undefined;
29
+ seed?: number | undefined;
30
+ size?: number | undefined;
31
+ overwrite?: boolean | undefined;
32
+ allowDuplicates?: boolean | undefined;
33
+ allowDuplicatesLabelled?: boolean | undefined;
34
+ allowDuplicatesUnlabelled?: boolean | undefined;
35
+ }>;
36
+ export type Args = z.infer<typeof argsSchema>;
37
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/generate/args.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ // Args for generating a dataset
2
+ import { z } from 'zod';
3
+ export const argsSchema = z.object({
4
+ labels: z.string().optional(),
5
+ out: z.string(),
6
+ labelled: z.string().optional(),
7
+ unlabelled: z.string().optional(),
8
+ seed: z.number().optional(),
9
+ size: z.number().optional(),
10
+ overwrite: z.boolean().optional(),
11
+ allowDuplicates: z.boolean().optional(),
12
+ allowDuplicatesLabelled: z.boolean().optional(),
13
+ allowDuplicatesUnlabelled: z.boolean().optional(),
14
+ });
15
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/generate/args.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACvC,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/C,yBAAyB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAA"}
@@ -0,0 +1,32 @@
1
+ import { ArgumentsCamelCase, Argv } from 'yargs';
2
+ import { Logger } from '@prosopo/common';
3
+ declare const _default: (cmdArgs?: {
4
+ logger?: Logger;
5
+ }) => {
6
+ command: string;
7
+ describe: string;
8
+ builder: (yargs: Argv) => Argv<{
9
+ overwrite: boolean | undefined;
10
+ } & {
11
+ out: string;
12
+ } & {
13
+ labelled: string;
14
+ } & {
15
+ unlabelled: string;
16
+ } & {
17
+ seed: number | undefined;
18
+ } & {
19
+ size: number | undefined;
20
+ } & {
21
+ labels: string | undefined;
22
+ } & {
23
+ "allow-duplicates": boolean | undefined;
24
+ } & {
25
+ "allow-duplicates-labelled": boolean | undefined;
26
+ } & {
27
+ "allow-duplicates-unlabelled": boolean | undefined;
28
+ }>;
29
+ handler: (argv: ArgumentsCamelCase) => Promise<never>;
30
+ };
31
+ export default _default;
32
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/generate/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;mCAId;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;qBAIpB,IAAI;;;;;;;;;;;;;;;;;;;;;oBAmDC,kBAAkB;;AAvDhD,wBA2DC"}
@@ -0,0 +1,63 @@
1
+ import { __awaiter } from "tslib";
2
+ import generateDistinct from './distinct/cli.js';
3
+ import generateUnion from './union/cli.js';
4
+ export default (cmdArgs) => {
5
+ return {
6
+ command: 'generate',
7
+ describe: 'Generate captchas',
8
+ builder: (yargs) => {
9
+ return yargs
10
+ .command(generateDistinct(cmdArgs))
11
+ .command(generateUnion(cmdArgs))
12
+ .demandCommand()
13
+ .option('overwrite', {
14
+ type: 'boolean',
15
+ description: 'Overwrite the output file if it already exists',
16
+ })
17
+ .option('out', {
18
+ type: 'string',
19
+ demand: true,
20
+ description: 'Path to the output file',
21
+ default: 'captchas.json',
22
+ })
23
+ .option('labelled', {
24
+ type: 'string',
25
+ demand: true,
26
+ description: 'Path to the file containing map of images urls to labels',
27
+ })
28
+ .option('unlabelled', {
29
+ type: 'string',
30
+ demand: true,
31
+ description: 'Path to the file containing list of images url which are unlabelled',
32
+ })
33
+ .option('seed', {
34
+ type: 'number',
35
+ description: 'Seed for the random number generator',
36
+ })
37
+ .option('size', {
38
+ type: 'number',
39
+ description: 'Number of images in each captcha',
40
+ })
41
+ .options('labels', {
42
+ type: 'string',
43
+ description: 'Path to the labels file. This is a file containing a list of labels which unlabelled data will be assigned to.',
44
+ })
45
+ .option('allow-duplicates', {
46
+ type: 'boolean',
47
+ description: 'Allow duplicates in the data (labelled and unlabelled)',
48
+ })
49
+ .option('allow-duplicates-labelled', {
50
+ type: 'boolean',
51
+ description: 'Allow duplicates in the labelled data',
52
+ })
53
+ .option('allow-duplicates-unlabelled', {
54
+ type: 'boolean',
55
+ description: 'Allow duplicates in the unlabelled data',
56
+ });
57
+ },
58
+ handler: (argv) => __awaiter(void 0, void 0, void 0, function* () {
59
+ throw new Error('Please specify a command');
60
+ }),
61
+ };
62
+ };
63
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/generate/cli.ts"],"names":[],"mappings":";AAEA,OAAO,gBAAgB,MAAM,mBAAmB,CAAA;AAChD,OAAO,aAAa,MAAM,gBAAgB,CAAA;AAE1C,eAAe,CAAC,OAA6B,EAAE,EAAE;IAC7C,OAAO;QACH,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,mBAAmB;QAC7B,OAAO,EAAE,CAAC,KAAW,EAAE,EAAE;YACrB,OAAO,KAAK;iBACP,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;iBAClC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;iBAC/B,aAAa,EAAE;iBACf,MAAM,CAAC,WAAW,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gDAAgD;aAChE,CAAC;iBACD,MAAM,CAAC,KAAK,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,yBAAyB;gBACtC,OAAO,EAAE,eAAe;aAC3B,CAAC;iBACD,MAAM,CAAC,UAAU,EAAE;gBAChB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,0DAA0D;aAC1E,CAAC;iBACD,MAAM,CAAC,YAAY,EAAE;gBAClB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,qEAAqE;aACrF,CAAC;iBACD,MAAM,CAAC,MAAM,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACtD,CAAC;iBACD,MAAM,CAAC,MAAM,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAClD,CAAC;iBACD,OAAO,CAAC,QAAQ,EAAE;gBACf,IAAI,EAAE,QAAQ;gBACd,WAAW,EACP,gHAAgH;aACvH,CAAC;iBACD,MAAM,CAAC,kBAAkB,EAAE;gBACxB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,wDAAwD;aACxE,CAAC;iBACD,MAAM,CAAC,2BAA2B,EAAE;gBACjC,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,uCAAuC;aACvD,CAAC;iBACD,MAAM,CAAC,6BAA6B,EAAE;gBACnC,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,yCAAyC;aACzD,CAAC,CAAA;QACV,CAAC;QACD,OAAO,EAAE,CAAO,IAAwB,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC/C,CAAC,CAAA;KACJ,CAAA;AACL,CAAC,CAAA"}
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ export declare const argsSchema: z.ZodObject<{
3
+ out: z.ZodString;
4
+ overwrite: z.ZodOptional<z.ZodBoolean>;
5
+ labels: z.ZodOptional<z.ZodString>;
6
+ labelled: z.ZodOptional<z.ZodString>;
7
+ unlabelled: z.ZodOptional<z.ZodString>;
8
+ seed: z.ZodOptional<z.ZodNumber>;
9
+ size: z.ZodOptional<z.ZodNumber>;
10
+ allowDuplicates: z.ZodOptional<z.ZodBoolean>;
11
+ allowDuplicatesLabelled: z.ZodOptional<z.ZodBoolean>;
12
+ allowDuplicatesUnlabelled: z.ZodOptional<z.ZodBoolean>;
13
+ solved: z.ZodOptional<z.ZodNumber>;
14
+ unsolved: z.ZodOptional<z.ZodNumber>;
15
+ minCorrect: z.ZodOptional<z.ZodNumber>;
16
+ maxCorrect: z.ZodOptional<z.ZodNumber>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ out: string;
19
+ overwrite?: boolean | undefined;
20
+ labels?: string | undefined;
21
+ labelled?: string | undefined;
22
+ unlabelled?: string | undefined;
23
+ seed?: number | undefined;
24
+ size?: number | undefined;
25
+ allowDuplicates?: boolean | undefined;
26
+ allowDuplicatesLabelled?: boolean | undefined;
27
+ allowDuplicatesUnlabelled?: boolean | undefined;
28
+ solved?: number | undefined;
29
+ unsolved?: number | undefined;
30
+ minCorrect?: number | undefined;
31
+ maxCorrect?: number | undefined;
32
+ }, {
33
+ out: string;
34
+ overwrite?: boolean | undefined;
35
+ labels?: string | undefined;
36
+ labelled?: string | undefined;
37
+ unlabelled?: string | undefined;
38
+ seed?: number | undefined;
39
+ size?: number | undefined;
40
+ allowDuplicates?: boolean | undefined;
41
+ allowDuplicatesLabelled?: boolean | undefined;
42
+ allowDuplicatesUnlabelled?: boolean | undefined;
43
+ solved?: number | undefined;
44
+ unsolved?: number | undefined;
45
+ minCorrect?: number | undefined;
46
+ maxCorrect?: number | undefined;
47
+ }>;
48
+ export type Args = z.infer<typeof argsSchema>;
49
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/generate/distinct/args.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { argsSchema as parentSchema } from '../args.js';
2
+ // Args for generating a dataset
3
+ import { z } from 'zod';
4
+ export const argsSchema = parentSchema.extend({
5
+ solved: z.number().optional(),
6
+ unsolved: z.number().optional(),
7
+ minCorrect: z.number().optional(),
8
+ maxCorrect: z.number().optional(),
9
+ });
10
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/generate/distinct/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,YAAY,CAAA;AACvD,gCAAgC;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { ArgumentsCamelCase, Argv } from 'yargs';
2
+ import { Logger } from '@prosopo/common';
3
+ declare const _default: (cmdArgs?: {
4
+ logger?: Logger;
5
+ }) => {
6
+ command: string;
7
+ describe: string;
8
+ builder: (yargs: Argv) => Argv<{
9
+ solved: number | undefined;
10
+ } & {
11
+ unsolved: number | undefined;
12
+ } & {
13
+ "min-correct": number | undefined;
14
+ } & {
15
+ "max-correct": number | undefined;
16
+ }>;
17
+ handler: (argv: ArgumentsCamelCase) => Promise<void>;
18
+ };
19
+ export default _default;
20
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/generate/distinct/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;mCAId;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;qBAKpB,IAAI;;;;;;;;;oBAmBC,kBAAkB;;AAxBhD,wBA4BC"}
@@ -0,0 +1,32 @@
1
+ import { __awaiter } from "tslib";
2
+ import { argsSchema } from './args.js';
3
+ import generate from './generate.js';
4
+ export default (cmdArgs) => {
5
+ return {
6
+ command: 'distinct',
7
+ describe: 'Generate distinct captchas producing captcha challenges comprising 2 rounds, one labelled and one unlabelled',
8
+ builder: (yargs) => {
9
+ return yargs
10
+ .option('solved', {
11
+ type: 'number',
12
+ description: 'Number of captchas to generate that are solved',
13
+ })
14
+ .option('unsolved', {
15
+ type: 'number',
16
+ description: 'Number of captchas to generate that are unsolved',
17
+ })
18
+ .option('min-correct', {
19
+ type: 'number',
20
+ description: 'Minimum number of target images in each captcha',
21
+ })
22
+ .option('max-correct', {
23
+ type: 'number',
24
+ description: 'Maximum number of target images in each captcha',
25
+ });
26
+ },
27
+ handler: (argv) => __awaiter(void 0, void 0, void 0, function* () {
28
+ yield generate(argsSchema.parse(argv), cmdArgs === null || cmdArgs === void 0 ? void 0 : cmdArgs.logger);
29
+ }),
30
+ };
31
+ };
32
+ //# sourceMappingURL=cli.js.map