@macrulez/devtoolz 0.3.2 → 0.4.0

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 (87) hide show
  1. package/README.md +80 -5
  2. package/dist/cli.js +9 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/image-batch/backup.d.ts +22 -0
  5. package/dist/commands/image-batch/backup.js +55 -0
  6. package/dist/commands/image-batch/backup.js.map +1 -0
  7. package/dist/commands/image-batch/cache.d.ts +15 -0
  8. package/dist/commands/image-batch/cache.js +38 -0
  9. package/dist/commands/image-batch/cache.js.map +1 -0
  10. package/dist/commands/image-batch/cli.d.ts +15 -0
  11. package/dist/commands/image-batch/cli.js +308 -0
  12. package/dist/commands/image-batch/cli.js.map +1 -0
  13. package/dist/commands/image-batch/codecs.d.ts +38 -0
  14. package/dist/commands/image-batch/codecs.js +366 -0
  15. package/dist/commands/image-batch/codecs.js.map +1 -0
  16. package/dist/commands/image-batch/config.d.ts +119 -0
  17. package/dist/commands/image-batch/config.js +693 -0
  18. package/dist/commands/image-batch/config.js.map +1 -0
  19. package/dist/commands/image-batch/errors.d.ts +5 -0
  20. package/dist/commands/image-batch/errors.js +8 -0
  21. package/dist/commands/image-batch/errors.js.map +1 -0
  22. package/dist/commands/image-batch/geometry.d.ts +26 -0
  23. package/dist/commands/image-batch/geometry.js +90 -0
  24. package/dist/commands/image-batch/geometry.js.map +1 -0
  25. package/dist/commands/image-batch/inputs.d.ts +22 -0
  26. package/dist/commands/image-batch/inputs.js +87 -0
  27. package/dist/commands/image-batch/inputs.js.map +1 -0
  28. package/dist/commands/image-batch/manage-cli.d.ts +2 -0
  29. package/dist/commands/image-batch/manage-cli.js +199 -0
  30. package/dist/commands/image-batch/manage-cli.js.map +1 -0
  31. package/dist/commands/image-batch/manage.d.ts +50 -0
  32. package/dist/commands/image-batch/manage.js +1000 -0
  33. package/dist/commands/image-batch/manage.js.map +1 -0
  34. package/dist/commands/image-batch/overwrite.d.ts +14 -0
  35. package/dist/commands/image-batch/overwrite.js +31 -0
  36. package/dist/commands/image-batch/overwrite.js.map +1 -0
  37. package/dist/commands/image-batch/plan.d.ts +86 -0
  38. package/dist/commands/image-batch/plan.js +396 -0
  39. package/dist/commands/image-batch/plan.js.map +1 -0
  40. package/dist/commands/image-batch/process.d.ts +8 -0
  41. package/dist/commands/image-batch/process.js +97 -0
  42. package/dist/commands/image-batch/process.js.map +1 -0
  43. package/dist/commands/image-batch/report.d.ts +6 -0
  44. package/dist/commands/image-batch/report.js +251 -0
  45. package/dist/commands/image-batch/report.js.map +1 -0
  46. package/dist/commands/image-batch/restore.d.ts +29 -0
  47. package/dist/commands/image-batch/restore.js +125 -0
  48. package/dist/commands/image-batch/restore.js.map +1 -0
  49. package/dist/commands/image-batch/run.d.ts +122 -0
  50. package/dist/commands/image-batch/run.js +644 -0
  51. package/dist/commands/image-batch/run.js.map +1 -0
  52. package/dist/commands/image-batch/sharpen.d.ts +16 -0
  53. package/dist/commands/image-batch/sharpen.js +32 -0
  54. package/dist/commands/image-batch/sharpen.js.map +1 -0
  55. package/dist/commands/image-batch/template.d.ts +45 -0
  56. package/dist/commands/image-batch/template.js +142 -0
  57. package/dist/commands/image-batch/template.js.map +1 -0
  58. package/dist/commands/image-hash/core.d.ts +6 -1
  59. package/dist/commands/image-hash/core.js +12 -2
  60. package/dist/commands/image-hash/core.js.map +1 -1
  61. package/dist/commands/image-hash/hash.d.ts +2 -0
  62. package/dist/commands/image-hash/hash.js +8 -1
  63. package/dist/commands/image-hash/hash.js.map +1 -1
  64. package/dist/commands/image-hash/report.js +2 -0
  65. package/dist/commands/image-hash/report.js.map +1 -1
  66. package/dist/commands/image-hash/run.d.ts +1 -0
  67. package/dist/commands/image-hash/run.js +4 -2
  68. package/dist/commands/image-hash/run.js.map +1 -1
  69. package/dist/commands/image-hash/sharp-loader.d.ts +2 -0
  70. package/dist/commands/image-hash/sharp-loader.js +7 -5
  71. package/dist/commands/image-hash/sharp-loader.js.map +1 -1
  72. package/dist/format/bytes.d.ts +2 -0
  73. package/dist/format/bytes.js +17 -0
  74. package/dist/format/bytes.js.map +1 -0
  75. package/dist/index.d.ts +5 -0
  76. package/dist/index.js +3 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/utils/closest.d.ts +2 -0
  79. package/dist/utils/closest.js +35 -0
  80. package/dist/utils/closest.js.map +1 -0
  81. package/dist/utils/glob.d.ts +4 -0
  82. package/dist/utils/glob.js +86 -0
  83. package/dist/utils/glob.js.map +1 -0
  84. package/dist/utils/tty.d.ts +60 -0
  85. package/dist/utils/tty.js +390 -0
  86. package/dist/utils/tty.js.map +1 -0
  87. package/package.json +2 -1
@@ -0,0 +1,308 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { createStyle } from '../../format/style.js';
4
+ import { askText, defaultTerminal, isInteractive, singleSelect } from '../../utils/tty.js';
5
+ import { splitList } from '../../utils/split-list.js';
6
+ import { MAX_HAZEHASH_BUDGET, MIN_HAZEHASH_BUDGET, parseBudget, parseExtensions, parseFileList, parseMaxPixels, } from '../image-hash/core.js';
7
+ import { parseCodecArgs, parseQualityArg } from './codecs.js';
8
+ import { discoverConfigs, emptyConfig, loadConfig, parseByteSize, resolveConfigRef, } from './config.js';
9
+ import { ImageBatchUsageError } from './errors.js';
10
+ import { FIT_MODES } from './geometry.js';
11
+ import { BATCH_IMAGE_EXTENSIONS } from './inputs.js';
12
+ import { registerImageBatchManagement } from './manage-cli.js';
13
+ import { parseSharpenFlags } from './sharpen.js';
14
+ import { renderImageBatchReport } from './report.js';
15
+ import { runImageBatch } from './run.js';
16
+ function parseNumberList(value, flag) {
17
+ const numbers = splitList(value).map(Number);
18
+ if (numbers.length === 0 || numbers.some((n) => !Number.isInteger(n) || n < 1 || n > 65535)) {
19
+ throw new ImageBatchUsageError(`${flag} must be whole numbers from 1 to 65535, e.g. 400,800,1200`);
20
+ }
21
+ return numbers;
22
+ }
23
+ function parseDecimalList(value, flag, min, max) {
24
+ const numbers = splitList(value).map(Number);
25
+ if (numbers.length === 0 || numbers.some((n) => !Number.isFinite(n) || n < min || n > max)) {
26
+ throw new ImageBatchUsageError(`${flag} must be numbers from ${min} to ${max}, e.g. 2,0.5`);
27
+ }
28
+ return numbers;
29
+ }
30
+ function overridesFrom(options) {
31
+ const overrides = {};
32
+ if (options.widths)
33
+ overrides.widths = parseNumberList(options.widths, '--widths');
34
+ if (options.heights)
35
+ overrides.heights = parseNumberList(options.heights, '--heights');
36
+ if (options.long)
37
+ overrides.longEdge = parseNumberList(options.long, '--long');
38
+ if (options.short)
39
+ overrides.shortEdge = parseNumberList(options.short, '--short');
40
+ if (options.megapixels) {
41
+ overrides.megapixels = parseDecimalList(options.megapixels, '--megapixels', 0.001, 1000);
42
+ }
43
+ if (options.percent)
44
+ overrides.percent = parseDecimalList(options.percent, '--percent', 0.1, 1000);
45
+ if (options.matchOrientation)
46
+ overrides.matchOrientation = true;
47
+ if (options.maxSize)
48
+ overrides.maxBytes = parseByteSize(options.maxSize, '--max-size');
49
+ const sharpen = parseSharpenFlags(options.sharpenFor, options.sharpenAmount);
50
+ if (sharpen)
51
+ overrides.sharpen = sharpen;
52
+ if (options.formats)
53
+ overrides.formats = splitList(options.formats);
54
+ if (options.quality)
55
+ overrides.quality = parseQualityArg(options.quality);
56
+ if (options.codec.length > 0)
57
+ overrides.codecs = parseCodecArgs(options.codec);
58
+ if (options.fit) {
59
+ if (!FIT_MODES.includes(options.fit)) {
60
+ throw new ImageBatchUsageError(`--fit must be one of ${FIT_MODES.join(', ')}`);
61
+ }
62
+ overrides.fit = options.fit;
63
+ }
64
+ if (options.name)
65
+ overrides.name = options.name;
66
+ if (options.flatten !== undefined)
67
+ overrides.flatten = options.flatten;
68
+ return Object.keys(overrides).length > 0 ? overrides : undefined;
69
+ }
70
+ function placeholdersFrom(options) {
71
+ const types = [];
72
+ if (options.hazehash)
73
+ types.push('hazehash');
74
+ if (options.blurhash)
75
+ types.push('blurhash');
76
+ if (options.thumbhash)
77
+ types.push('thumbhash');
78
+ if (options.dominantColor)
79
+ types.push('color');
80
+ if (types.length === 0) {
81
+ if (options.budget !== undefined) {
82
+ throw new ImageBatchUsageError(`--budget is the size of a hazehash (${MIN_HAZEHASH_BUDGET}–${MAX_HAZEHASH_BUDGET} bytes) — add --hazehash`);
83
+ }
84
+ return undefined;
85
+ }
86
+ const settings = { types };
87
+ if (options.budget !== undefined)
88
+ settings.budget = parseBudget(options.budget);
89
+ return settings;
90
+ }
91
+ function overwriteMode(options) {
92
+ if (options.overwrite === true)
93
+ return 'overwrite';
94
+ if (options.overwrite === false)
95
+ return 'error';
96
+ if (options.skipExisting)
97
+ return 'skip';
98
+ return undefined;
99
+ }
100
+ export async function chooseConfig(options, style) {
101
+ const discovered = discoverConfigs({ cwd: options.cwd });
102
+ let location;
103
+ if (options.config !== undefined) {
104
+ location = resolveConfigRef(options.config, discovered, options.cwd);
105
+ }
106
+ else if (!options.adHoc && discovered.length === 1) {
107
+ location = discovered[0];
108
+ }
109
+ else if (!options.adHoc && discovered.length > 1) {
110
+ if (!options.interactive) {
111
+ throw new ImageBatchUsageError(`several configs found — pick one with -c <name>: ${discovered.map((c) => c.name).join(', ')}`);
112
+ }
113
+ const s = createStyle(style);
114
+ const picked = await singleSelect(defaultTerminal(), discovered.map((candidate) => ({
115
+ label: candidate.name,
116
+ hint: `${candidate.scope} · ${candidate.path}`,
117
+ value: candidate,
118
+ })), { title: 'Which config should be applied?', help: 'enter pick · q cancel' }, s);
119
+ if (picked === null)
120
+ throw new ImageBatchUsageError('no config chosen');
121
+ location = picked;
122
+ }
123
+ if (!location)
124
+ return { config: emptyConfig() };
125
+ const { config } = await loadConfig(location);
126
+ return { config, label: location.name };
127
+ }
128
+ export function registerImageBatch(program) {
129
+ const command = program
130
+ .command('image-batch')
131
+ .description('Batch-resize and convert raster images by rules: sizes, formats, codec options and file names from a config or flags (subcommands: init, config, restore)')
132
+ .argument('[paths...]', 'image files, folders and globs to process (several allowed)', [])
133
+ .option('--cwd <path>', 'root paths are resolved against', process.cwd())
134
+ .option('-c, --config <name|file>', 'rules to apply: a saved config name or a path to a config file')
135
+ .option('-o, --out <dir>', 'folder the results go to (or use --beside / --replace); the sources are never touched')
136
+ .option('--beside', 'write the results next to each source, in the same folder (sources are not touched)', false)
137
+ .option('--replace', 'rewrite each source file in place, in its own format (originals are backed up first)', false)
138
+ .option('--backup [dir]', 'with --replace: where the originals are saved first (default: .image-batch-backup/<date>)')
139
+ .option('--no-backup', 'with --replace: do not keep a copy of the originals')
140
+ .option('--no-only-if-smaller', 'with --replace: also replace files when the result is not smaller')
141
+ .option('-r, --recursive', 'also walk subdirectories of every given folder', false)
142
+ .option('--files-from <file>', 'read more paths from a file, one per line (- = stdin, # starts a comment)')
143
+ .option('--ext <list>', 'comma-separated image extensions to pick up from folders', BATCH_IMAGE_EXTENSIONS.join(','))
144
+ .option('--ignore <glob>', 'extra ignore pattern (repeatable), on top of the built-in defaults', (val, prev) => [...prev, val], [])
145
+ .option('--no-respect-gitignore', "don't also honor the project's .gitignore")
146
+ .option('--include <glob>', 'only process images whose path (inside the given folder) matches (repeatable)', (val, prev) => [...prev, val], [])
147
+ .option('--exclude <glob>', 'skip images whose path (inside the given folder) matches (repeatable)', (val, prev) => [...prev, val], [])
148
+ .option('-w, --widths <list>', 'output widths in pixels, comma-separated, e.g. 400,800,1200')
149
+ .option('--heights <list>', 'output heights in pixels, comma-separated')
150
+ .option('--long <list>', 'size by the long side in pixels, comma-separated, whatever the orientation')
151
+ .option('--short <list>', 'size by the short side in pixels, comma-separated')
152
+ .option('--megapixels <list>', 'size by area in megapixels, comma-separated, e.g. 2,0.5')
153
+ .option('--percent <list>', 'size as a percentage of the source, comma-separated, e.g. 50,25')
154
+ .option('--match-orientation', 'turn a width x height box around for images of the other orientation', false)
155
+ .option('--max-size <size>', 'limit each file to this size, e.g. 200KB or 1.5MB, by lowering the quality as far as needed')
156
+ .option('--sharpen-for <target>', 'sharpen the result for: screen, matte or glossy')
157
+ .option('--sharpen-amount <amount>', 'sharpening amount: low, standard or high')
158
+ .option('-f, --formats <list>', 'output formats: jpg, png, webp, avif, gif, tiff, jp2, heif or original')
159
+ .option('-q, --quality <n|level|fmt=n,…>', 'quality: 82, a level (low, medium, high, best) or per format, e.g. jpg=82,webp=high')
160
+ .option('--codec <fmt.option=value>', 'one codec option, e.g. jpg.mozjpeg=true or png.colors=64 (repeatable)', (val, prev) => [...prev, val], [])
161
+ .option('--fit <mode>', `how the image fills the target box: ${FIT_MODES.join(', ')}`)
162
+ .option('--name <template>', 'output file name template: {name} {ext} {format} {dir} {width} {height} {size} {scale} {index} {hash} {date} {orig}')
163
+ .option('--flatten [color]', 'put images with transparency on a solid background (white unless a color is given)')
164
+ .option('--flat', 'put every result into the output folder itself, without the source subfolders', false)
165
+ .option('--hazehash', 'also compute a hazehash of every source (written to --emit)', false)
166
+ .option('--blurhash', 'also compute a blurhash of every source (written to --emit)', false)
167
+ .option('--thumbhash', 'also compute a thumbhash of every source (written to --emit)', false)
168
+ .option('--dominant-color', 'also compute the dominant color of every source (written to --emit)', false)
169
+ .option('--budget <bytes>', `hazehash: size of one hash in bytes, ${MIN_HAZEHASH_BUDGET}-${MAX_HAZEHASH_BUDGET} (default 28)`)
170
+ .option('--emit <file>', 'write a JSON manifest of everything that was produced')
171
+ .option('--key-prefix <text>', 'text put in front of every path in the manifest placeholders, e.g. /images/')
172
+ .option('-i, --select', 'pick the images from an interactive list before processing', false)
173
+ .option('--list', 'only print the images that would be processed', false)
174
+ .option('--overwrite', 'replace existing output files that this command did not make or that are out of date')
175
+ .option('--no-overwrite', 'fail (exit 1) when an output file already exists')
176
+ .option('--skip-existing', 'leave existing output files alone without failing', false)
177
+ .option('--force', 'regenerate everything, ignoring what an earlier run already made', false)
178
+ .option('--cache [file]', 'where the record of what was already made is kept (default: ~/.devtoolz/cache/image-batch)')
179
+ .option('--no-cache', 'do not keep or use that record')
180
+ .option('--concurrency <n>', 'images processed in parallel', '4')
181
+ .option('--max-pixels <n>', 'refuse images with more pixels than this (0 = no limit; default: sharp limit, ~268 million)')
182
+ .option('--dry-run', 'write nothing — show what would be done', false)
183
+ .option('-y, --yes', 'agree without asking: install the missing "sharp" library, confirm --replace', false)
184
+ .option('--json', 'machine-readable output', false)
185
+ .option('--quiet', 'suppress output when there is nothing to report', false)
186
+ .option('--verbose', 'list every produced file, not only problems', false)
187
+ .option('--plain', 'disable color/banner/celebration copy, even in a real terminal', false)
188
+ .option('--color', 'force colored output even when piped or in CI', false);
189
+ command.action(async (paths, options) => {
190
+ const style = { plain: options.plain, color: options.color };
191
+ const io = defaultTerminal();
192
+ const interactive = isInteractive(io) && !options.json;
193
+ const s = createStyle(style);
194
+ const showProgress = !options.json && !options.quiet && Boolean(process.stderr.isTTY) && !options.plain;
195
+ let progressShown = false;
196
+ try {
197
+ const cwd = resolve(options.cwd);
198
+ const listed = options.filesFrom !== undefined
199
+ ? parseFileList(readFileSync(options.filesFrom === '-' ? 0 : options.filesFrom, 'utf8'))
200
+ : [];
201
+ const overrides = overridesFrom(options);
202
+ const adHoc = overrides !== undefined;
203
+ const { config, label } = await chooseConfig({
204
+ cwd,
205
+ adHoc,
206
+ interactive,
207
+ ...(options.config !== undefined ? { config: options.config } : {}),
208
+ }, style);
209
+ let out = options.out;
210
+ if (out === undefined &&
211
+ !options.beside &&
212
+ !options.replace &&
213
+ interactive &&
214
+ !options.list) {
215
+ const answer = await askText(io, 'Where should the results go? (output folder)', s);
216
+ if (answer === null || answer.trim() === '') {
217
+ throw new ImageBatchUsageError('no output folder given');
218
+ }
219
+ out = answer.trim();
220
+ }
221
+ const mode = overwriteMode(options);
222
+ const placeholders = placeholdersFrom(options);
223
+ const report = await runImageBatch({
224
+ paths: [...paths, ...listed],
225
+ cwd,
226
+ ...(out !== undefined ? { out } : {}),
227
+ beside: options.beside,
228
+ replace: options.replace,
229
+ ...(options.backup === false
230
+ ? { backup: false }
231
+ : typeof options.backup === 'string'
232
+ ? { backup: options.backup }
233
+ : {}),
234
+ ...(options.onlyIfSmaller === false ? { onlyIfSmaller: false } : {}),
235
+ config,
236
+ ...(label !== undefined ? { configLabel: label } : {}),
237
+ ...(overrides ? { overrides } : {}),
238
+ recursive: options.recursive,
239
+ extensions: parseExtensions(options.ext),
240
+ ignoreGlobs: options.ignore,
241
+ respectGitignore: options.respectGitignore,
242
+ include: options.include,
243
+ exclude: options.exclude,
244
+ flat: options.flat,
245
+ list: options.list,
246
+ select: options.select,
247
+ ...(mode ? { overwrite: mode } : {}),
248
+ force: options.force,
249
+ ...(placeholders ? { placeholders } : {}),
250
+ ...(options.emit !== undefined ? { emit: options.emit } : {}),
251
+ ...(options.keyPrefix !== undefined ? { keyPrefix: options.keyPrefix } : {}),
252
+ ...(options.cache === false
253
+ ? { cache: false }
254
+ : typeof options.cache === 'string'
255
+ ? { cache: options.cache }
256
+ : {}),
257
+ concurrency: Math.max(1, Number.parseInt(options.concurrency, 10) || 4),
258
+ ...(options.maxPixels !== undefined
259
+ ? { maxPixels: parseMaxPixels(options.maxPixels) }
260
+ : {}),
261
+ dryRun: options.dryRun,
262
+ assumeYes: options.yes,
263
+ interactive,
264
+ io,
265
+ style,
266
+ ...(showProgress
267
+ ? {
268
+ onProgress: ({ done, total }) => {
269
+ if (total < 2)
270
+ return;
271
+ progressShown = true;
272
+ process.stderr.write(`\r${s.info(`Processing ${done}/${total}`)}`);
273
+ },
274
+ }
275
+ : {}),
276
+ });
277
+ if (progressShown)
278
+ process.stderr.write('\r\x1b[K');
279
+ if (options.json) {
280
+ const { ...printable } = report;
281
+ console.log(JSON.stringify(printable, null, 2));
282
+ }
283
+ else {
284
+ const text = renderImageBatchReport(report, {
285
+ ...style,
286
+ quiet: options.quiet,
287
+ verbose: options.verbose,
288
+ });
289
+ if (text)
290
+ console.log(text);
291
+ }
292
+ process.exitCode = report.exitCode;
293
+ }
294
+ catch (error) {
295
+ if (progressShown)
296
+ process.stderr.write('\r\x1b[K');
297
+ if (error instanceof ImageBatchUsageError) {
298
+ console.error(`error: ${error.message}`);
299
+ process.exitCode = 2;
300
+ return;
301
+ }
302
+ throw error;
303
+ }
304
+ });
305
+ command.enablePositionalOptions();
306
+ registerImageBatchManagement(command);
307
+ }
308
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/commands/image-batch/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export declare const OUTPUT_FORMATS: readonly ["jpg", "png", "webp", "avif", "gif", "tiff", "jp2", "heif"];
2
+ export type OutputFormatName = (typeof OUTPUT_FORMATS)[number];
3
+ export type FormatChoice = OutputFormatName | 'original';
4
+ export declare const QUALITY_LEVELS: readonly ["low", "medium", "high", "best"];
5
+ export type QualityLevel = (typeof QUALITY_LEVELS)[number];
6
+ export type QualityValue = number | QualityLevel;
7
+ export type QualityInput = QualityValue | Partial<Record<OutputFormatName, QualityValue>>;
8
+ export type CodecValue = number | boolean | string;
9
+ export type CodecOptions = Record<string, CodecValue>;
10
+ export type CodecMap = Partial<Record<OutputFormatName, CodecOptions>>;
11
+ interface OptionSpec {
12
+ kind: 'quality' | 'int' | 'number' | 'bool' | 'enum' | 'enum-int';
13
+ min?: number;
14
+ max?: number;
15
+ values?: readonly (string | number)[];
16
+ }
17
+ export declare const CODEC_SPECS: Record<OutputFormatName, Record<string, OptionSpec>>;
18
+ export declare const BUILTIN_DEFAULTS: Record<OutputFormatName, CodecOptions>;
19
+ export declare const FORMAT_EXTENSIONS: Record<OutputFormatName, string>;
20
+ export declare function normalizeFormat(raw: string, where?: string): FormatChoice;
21
+ export declare function isQualityLevel(value: unknown): value is QualityLevel;
22
+ export declare function validateCodecOptions(format: OutputFormatName, options: Record<string, unknown>, where: string): CodecOptions;
23
+ export declare function validateCodecMap(map: unknown, where: string): CodecMap;
24
+ export declare function validateQualityInput(input: unknown, where: string): QualityInput;
25
+ export declare function parseQualityArg(text: string): QualityInput;
26
+ export declare function parseCodecArgs(args: string[]): CodecMap;
27
+ export interface CodecLayer {
28
+ codecs?: CodecMap;
29
+ quality?: QualityInput;
30
+ }
31
+ export declare function resolveCodecOptions(format: OutputFormatName, layers: CodecLayer[]): CodecOptions;
32
+ export declare function unsupportedFormats(sharp: unknown, formats: Iterable<OutputFormatName>): OutputFormatName[];
33
+ export declare function supportsQualityLimit(format: OutputFormatName, codec: CodecOptions): boolean;
34
+ export declare function qualityOf(format: OutputFormatName, codec: CodecOptions): number;
35
+ export declare function sharpFormatName(format: OutputFormatName): string;
36
+ export declare function toSharpOptions(options: CodecOptions): Record<string, CodecValue>;
37
+ export declare function describeOptions(options: CodecOptions): string;
38
+ export {};