@prosopo/datasets-fs 0.2.6 → 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
@@ -0,0 +1,68 @@
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
+ from: z.ZodString;
9
+ to: z.ZodString;
10
+ }, "strip", z.ZodTypeAny, {
11
+ input: string;
12
+ output: string;
13
+ from: string;
14
+ to: string;
15
+ overwrite?: boolean | undefined;
16
+ }, {
17
+ input: string;
18
+ output: string;
19
+ from: string;
20
+ to: string;
21
+ overwrite?: boolean | undefined;
22
+ }>;
23
+ export type ArgsSchemaType = typeof ArgsSchema;
24
+ export type Args = z.infer<ArgsSchemaType>;
25
+ export declare class Relocate extends InputOutputCliCommand<ArgsSchemaType> {
26
+ getArgSchema(): z.ZodObject<{
27
+ input: z.ZodString;
28
+ output: z.ZodString;
29
+ overwrite: z.ZodOptional<z.ZodBoolean>;
30
+ from: z.ZodString;
31
+ to: z.ZodString;
32
+ }, "strip", z.ZodTypeAny, {
33
+ input: string;
34
+ output: string;
35
+ from: string;
36
+ to: string;
37
+ overwrite?: boolean | undefined;
38
+ }, {
39
+ input: string;
40
+ output: string;
41
+ from: string;
42
+ to: string;
43
+ overwrite?: boolean | undefined;
44
+ }>;
45
+ getOptions(): {
46
+ [key: string]: import("yargs").Options;
47
+ } & {
48
+ input: {
49
+ description: string;
50
+ };
51
+ output: {
52
+ description: string;
53
+ };
54
+ from: {
55
+ string: boolean;
56
+ demand: boolean;
57
+ description: string;
58
+ };
59
+ to: {
60
+ description: string;
61
+ string: boolean;
62
+ demand: boolean;
63
+ };
64
+ };
65
+ _run(args: Args): Promise<void>;
66
+ getDescription(): string;
67
+ }
68
+ //# sourceMappingURL=relocate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocate.d.ts","sourceRoot":"","sources":["../../src/commands/relocate.ts"],"names":[],"mappings":";AAAA,OAAO,EAAkD,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE/G,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;EAGrB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,UAAU,CAAA;AAC9C,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;AAE1C,qBAAa,QAAS,SAAQ,qBAAqB,CAAC,cAAc,CAAC;IAC/C,YAAY;;;;;;;;;;;;;;;;;;;IAIZ,UAAU;;;;;;;;;;;;;;;;;;;;IAqBJ,IAAI,CAAC,IAAI,EAAE,IAAI;IAyCrB,cAAc,IAAI,MAAM;CAG3C"}
@@ -0,0 +1,75 @@
1
+ import { InputOutputArgsSchema as InputOutputArgsSchema, InputOutputCliCommand } from '../utils/inputOutput.js';
2
+ import { get, lodash } from '@prosopo/util';
3
+ import { z } from 'zod';
4
+ import fs from 'fs';
5
+ export const ArgsSchema = InputOutputArgsSchema.extend({
6
+ from: z.string(),
7
+ to: z.string(),
8
+ });
9
+ export class Relocate extends InputOutputCliCommand {
10
+ getArgSchema() {
11
+ return ArgsSchema;
12
+ }
13
+ getOptions() {
14
+ return lodash().merge(super.getOptions(), {
15
+ input: {
16
+ description: 'A json file containing a list of objects with (at least) a url',
17
+ },
18
+ output: {
19
+ description: 'Where to write the new json file containing the new urls',
20
+ },
21
+ from: {
22
+ string: true,
23
+ demand: true,
24
+ description: 'The string to replace in the urls',
25
+ },
26
+ to: {
27
+ description: 'The string to substitute in the urls',
28
+ string: true,
29
+ demand: true,
30
+ },
31
+ });
32
+ }
33
+ async _run(args) {
34
+ await super._run(args);
35
+ const replace = (data, from, to) => {
36
+ if (Array.isArray(data)) {
37
+ for (let i = 0; i < data.length; i++) {
38
+ data[i] = replace(data[i], from, to);
39
+ }
40
+ }
41
+ else if (typeof data === 'object') {
42
+ const obj = data;
43
+ for (const key of Object.keys(obj)) {
44
+ if (key === 'data') {
45
+ const value = get(obj, key);
46
+ if (typeof value === 'string') {
47
+ if (value.startsWith(from)) {
48
+ this.logger.debug('replacing', value);
49
+ obj[key] = to + value.slice(from.length);
50
+ this.logger.debug('replaced', obj[key]);
51
+ }
52
+ }
53
+ }
54
+ else {
55
+ obj[key] = replace(obj[key], from, to);
56
+ }
57
+ }
58
+ }
59
+ return data;
60
+ };
61
+ const file = args.input;
62
+ this.logger.log(`relocating data in ${file} from ${args.from} to ${args.to}`);
63
+ // read the file
64
+ let data = JSON.parse(fs.readFileSync(file, 'utf8'));
65
+ // replace the urls by recursively traversing the data
66
+ data = replace(data, args.from, args.to);
67
+ // write the file
68
+ fs.mkdirSync(args.output.split('/').slice(0, -1).join('/'), { recursive: true });
69
+ fs.writeFileSync(args.output, JSON.stringify(data, null, 4));
70
+ }
71
+ getDescription() {
72
+ return 'Relocate urls in a JSON file using string substitution';
73
+ }
74
+ }
75
+ //# sourceMappingURL=relocate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocate.js","sourceRoot":"","sources":["../../src/commands/relocate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
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
+ size: z.ZodNumber;
9
+ square: z.ZodOptional<z.ZodBoolean>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ input: string;
12
+ output: string;
13
+ size: number;
14
+ overwrite?: boolean | undefined;
15
+ square?: boolean | undefined;
16
+ }, {
17
+ input: string;
18
+ output: string;
19
+ size: number;
20
+ overwrite?: boolean | undefined;
21
+ square?: boolean | undefined;
22
+ }>;
23
+ export type ArgsSchemaType = typeof ArgsSchema;
24
+ export type Args = z.infer<ArgsSchemaType>;
25
+ export declare class Resize extends InputOutputCliCommand<ArgsSchemaType> {
26
+ getArgSchema(): z.ZodObject<{
27
+ input: z.ZodString;
28
+ output: z.ZodString;
29
+ overwrite: z.ZodOptional<z.ZodBoolean>;
30
+ size: z.ZodNumber;
31
+ square: z.ZodOptional<z.ZodBoolean>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ input: string;
34
+ output: string;
35
+ size: number;
36
+ overwrite?: boolean | undefined;
37
+ square?: boolean | undefined;
38
+ }, {
39
+ input: string;
40
+ output: string;
41
+ size: number;
42
+ overwrite?: boolean | undefined;
43
+ square?: boolean | undefined;
44
+ }>;
45
+ getOptions(): {
46
+ [key: string]: import("yargs").Options;
47
+ } & {
48
+ input: {
49
+ description: string;
50
+ };
51
+ output: {
52
+ description: string;
53
+ };
54
+ size: {
55
+ number: boolean;
56
+ description: string;
57
+ };
58
+ square: {
59
+ boolean: boolean;
60
+ description: string;
61
+ };
62
+ };
63
+ _run(args: Args): Promise<void>;
64
+ getDescription(): string;
65
+ }
66
+ //# sourceMappingURL=resize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.d.ts","sourceRoot":"","sources":["../../src/commands/resize.ts"],"names":[],"mappings":";AACA,OAAO,EAAkD,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAK/G,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;EAGrB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,UAAU,CAAA;AAC9C,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;AAE1C,qBAAa,MAAO,SAAQ,qBAAqB,CAAC,cAAc,CAAC;IAC7C,YAAY;;;;;;;;;;;;;;;;;;;IAIZ,UAAU;;;;;;;;;;;;;;;;;;IAsBJ,IAAI,CAAC,IAAI,EAAE,IAAI;IAwFrB,cAAc,IAAI,MAAM;CAG3C"}
@@ -0,0 +1,118 @@
1
+ import { DataSchema } from '@prosopo/types';
2
+ import { InputOutputArgsSchema as InputOutputArgsSchema, InputOutputCliCommand } from '../utils/inputOutput.js';
3
+ import { ProsopoEnvError } from '@prosopo/common';
4
+ import { blake2b } from '@noble/hashes/blake2b';
5
+ import { lodash } from '@prosopo/util';
6
+ import { u8aToHex } from '@polkadot/util';
7
+ import { z } from 'zod';
8
+ import cliProgress from 'cli-progress';
9
+ import fs from 'fs';
10
+ import sharp from 'sharp';
11
+ export const ArgsSchema = InputOutputArgsSchema.extend({
12
+ size: z.number(),
13
+ square: z.boolean().optional(),
14
+ });
15
+ export class Resize extends InputOutputCliCommand {
16
+ getArgSchema() {
17
+ return ArgsSchema;
18
+ }
19
+ getOptions() {
20
+ return lodash().merge(super.getOptions(), {
21
+ input: {
22
+ description: 'JSON file containing a list of objects with (at least) a url',
23
+ },
24
+ output: {
25
+ description: 'Where to put the output directory containing the map file and single directory of images. The map file will contain the new urls of the scaled images, new hashes and pass through any other information, e.g. labels.',
26
+ },
27
+ size: {
28
+ number: true,
29
+ description: 'The dimension (height/width) of the scaled image. If the image is not square, the other dimension will be scaled to maintain the aspect ratio.',
30
+ },
31
+ square: {
32
+ boolean: true,
33
+ description: 'If true, the image will be cropped to a square before scaling. If false, the image will be scaled to the given size, maintaining the aspect ratio.',
34
+ },
35
+ });
36
+ }
37
+ async _run(args) {
38
+ await super._run(args);
39
+ const size = args.size;
40
+ const square = args.square ?? false;
41
+ const mapFile = args.input;
42
+ if (!fs.existsSync(mapFile)) {
43
+ throw new ProsopoEnvError(new Error(`Map file does not exist: ${mapFile}`), 'FS.FILE_NOT_FOUND');
44
+ }
45
+ const outDir = args.output;
46
+ const overwrite = args.overwrite || false;
47
+ if (!overwrite && fs.existsSync(outDir)) {
48
+ throw new ProsopoEnvError(new Error(`Output directory already exists: ${outDir}`), 'FS.FILE_NOT_FOUND');
49
+ }
50
+ // create the output directory
51
+ const imgDir = `${outDir}/images`;
52
+ fs.mkdirSync(imgDir, { recursive: true });
53
+ // read the map file
54
+ const inputItems = DataSchema.parse(JSON.parse(fs.readFileSync(mapFile, 'utf8'))).items;
55
+ // for each item
56
+ const bar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);
57
+ bar.start(inputItems.length, 0);
58
+ const outputItems = [];
59
+ for (const inputItem of inputItems) {
60
+ bar.increment();
61
+ // this.logger.log(`resizing ${inputItem.data}`)
62
+ // read the file
63
+ const img = fs.readFileSync(inputItem.data);
64
+ // resize the image
65
+ const resized = await sharp(img)
66
+ .resize({
67
+ width: size,
68
+ height: size,
69
+ fit: square ? 'cover' : 'inside',
70
+ })
71
+ .removeAlpha() // remove the alpha channel
72
+ .toColorspace('srgb') // 8-bits per channel
73
+ .jpeg({
74
+ quality: 75,
75
+ chromaSubsampling: '4:2:0',
76
+ optimiseCoding: true,
77
+ trellisQuantisation: true,
78
+ overshootDeringing: true,
79
+ optimizeScans: true,
80
+ quantisationTable: 3,
81
+ force: true,
82
+ });
83
+ const tmpFilePath = `${imgDir}/tmp.jpg`;
84
+ await resized.toFile(tmpFilePath);
85
+ // read the resized image
86
+ const resizedImg = fs.readFileSync(tmpFilePath);
87
+ // hash the image
88
+ const hash = blake2b(resizedImg);
89
+ const hex = u8aToHex(hash);
90
+ // move the image
91
+ const finalFilePath = `${imgDir}/${hex}.jpg`;
92
+ fs.renameSync(tmpFilePath, finalFilePath);
93
+ // add the item to the output
94
+ const outputItem = {
95
+ ...inputItem,
96
+ hash: hex,
97
+ data: fs.realpathSync(finalFilePath),
98
+ };
99
+ outputItems.push(outputItem);
100
+ }
101
+ bar.stop();
102
+ // write the map file
103
+ const outputMapFile = `${outDir}/data.json`;
104
+ const data = {
105
+ items: outputItems,
106
+ };
107
+ // verify the output
108
+ this.logger.info('verifying data');
109
+ DataSchema.parse(data);
110
+ this.logger.info(`writing data`);
111
+ fs.mkdirSync(args.output.split('/').slice(0, -1).join('/'), { recursive: true });
112
+ fs.writeFileSync(outputMapFile, JSON.stringify(data, null, 4));
113
+ }
114
+ getDescription() {
115
+ return 'Resize images to a given size';
116
+ }
117
+ }
118
+ //# sourceMappingURL=resize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.js","sourceRoot":"","sources":["../../src/commands/resize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAQ,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,qBAAqB,IAAI,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/G,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC;IACnD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAA;AAIF,MAAM,OAAO,MAAO,SAAQ,qBAAqC;IAC7C,YAAY;QACxB,OAAO,UAAU,CAAA;IACrB,CAAC;IAEe,UAAU;QACtB,OAAO,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE;YACtC,KAAK,EAAE;gBACH,WAAW,EAAE,8DAA8D;aAC9E;YACD,MAAM,EAAE;gBACJ,WAAW,EACP,wNAAwN;aAC/N;YACD,IAAI,EAAE;gBACF,MAAM,EAAE,IAAI;gBACZ,WAAW,EACP,gJAAgJ;aACvJ;YACD,MAAM,EAAE;gBACJ,OAAO,EAAE,IAAI;gBACb,WAAW,EACP,oJAAoJ;aAC3J;SACJ,CAAC,CAAA;IACN,CAAC;IAEe,KAAK,CAAC,IAAI,CAAC,IAAU;QACjC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAA;QAEnC,MAAM,OAAO,GAAW,IAAI,CAAC,KAAK,CAAA;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;YACzB,MAAM,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAA;SACnG;QACD,MAAM,MAAM,GAAW,IAAI,CAAC,MAAM,CAAA;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAA;QACzC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACrC,MAAM,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,oCAAoC,MAAM,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAA;SAC1G;QAED,8BAA8B;QAC9B,MAAM,MAAM,GAAG,GAAG,MAAM,SAAS,CAAA;QACjC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEzC,oBAAoB;QACpB,MAAM,UAAU,GAAW,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAE/F,gBAAgB;QAChB,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QAC7E,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAC/B,MAAM,WAAW,GAAW,EAAE,CAAA;QAC9B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAChC,GAAG,CAAC,SAAS,EAAE,CAAA;YACf,gDAAgD;YAChD,gBAAgB;YAChB,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAC3C,mBAAmB;YACnB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC;iBAC3B,MAAM,CAAC;gBACJ,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;aACnC,CAAC;iBACD,WAAW,EAAE,CAAC,2BAA2B;iBACzC,YAAY,CAAC,MAAM,CAAC,CAAC,qBAAqB;iBAC1C,IAAI,CAAC;gBACF,OAAO,EAAE,EAAE;gBACX,iBAAiB,EAAE,OAAO;gBAC1B,cAAc,EAAE,IAAI;gBACpB,mBAAmB,EAAE,IAAI;gBACzB,kBAAkB,EAAE,IAAI;gBACxB,aAAa,EAAE,IAAI;gBACnB,iBAAiB,EAAE,CAAC;gBACpB,KAAK,EAAE,IAAI;aACd,CAAC,CAAA;YACN,MAAM,WAAW,GAAG,GAAG,MAAM,UAAU,CAAA;YACvC,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACjC,yBAAyB;YACzB,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;YAC/C,iBAAiB;YACjB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;YAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC1B,iBAAiB;YACjB,MAAM,aAAa,GAAG,GAAG,MAAM,IAAI,GAAG,MAAM,CAAA;YAC5C,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;YAEzC,6BAA6B;YAC7B,MAAM,UAAU,GAAS;gBACrB,GAAG,SAAS;gBACZ,IAAI,EAAE,GAAG;gBACT,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC;aACvC,CAAA;YACD,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;SAC/B;QACD,GAAG,CAAC,IAAI,EAAE,CAAA;QAEV,qBAAqB;QACrB,MAAM,aAAa,GAAG,GAAG,MAAM,YAAY,CAAA;QAE3C,MAAM,IAAI,GAAS;YACf,KAAK,EAAE,WAAW;SACrB,CAAA;QAED,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAClC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAChC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAChF,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC;IAEe,cAAc;QAC1B,OAAO,+BAA+B,CAAA;IAC1C,CAAC;CACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"dummy.d.ts","sourceRoot":"","sources":["../../../src/generate/distinct/dummy.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"dummy.d.ts","sourceRoot":"","sources":["../src/dummy.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dummy.js","sourceRoot":"","sources":["../src/dummy.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,OAAO,EAAE,gBAAgB,EAAsB,MAAM,gBAAgB,CAAA;AACrE,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,MAAM,OAAO,GAAG,CAAC,CAAA;AACjB,MAAM,eAAe,GAAG,GAAG,CAAA;AAC3B,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAE7B,MAAM,cAAc,GAAmB,EAAE,CAAA;AACzC,MAAM,gBAAgB,GAAW,EAAE,CAAA;AAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;IACtC,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAA;IACzB,cAAc,CAAC,IAAI,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;QACvB,IAAI,EAAE,MAAM,CAAC,EAAE;QACf,IAAI,EAAE,gBAAgB,CAAC,KAAK;QAC5B,IAAI,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;CACL;AAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE;IACxC,gBAAgB,CAAC,IAAI,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC,EAAE;QACf,IAAI,EAAE,gBAAgB,CAAC,KAAK;QAC5B,IAAI,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAA;CACL;AAED,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;AACjE,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAA;AACrE,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;AAE3G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from './cli.js';
1
+ export * from './cli/cli.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -11,5 +11,5 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
- export * from './cli.js';
14
+ export * from './cli/cli.js';
15
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,cAAc,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,cAAc,cAAc,CAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "labels": ["bird", "bus", "car", "cat", "deer", "dog", "horse", "plane", "train"]
3
+ }