@macrulez/devtoolz 0.4.1 → 0.4.3

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 (90) hide show
  1. package/README.md +16 -1
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/image-batch/cli.js +16 -0
  5. package/dist/commands/image-batch/cli.js.map +1 -1
  6. package/dist/commands/image-batch/config.d.ts +1 -0
  7. package/dist/commands/image-batch/config.js +11 -0
  8. package/dist/commands/image-batch/config.js.map +1 -1
  9. package/dist/commands/image-batch/run.d.ts +5 -1
  10. package/dist/commands/image-batch/run.js +7 -0
  11. package/dist/commands/image-batch/run.js.map +1 -1
  12. package/dist/commands/image-hash/sharp-loader.d.ts +3 -0
  13. package/dist/commands/image-hash/sharp-loader.js.map +1 -1
  14. package/dist/commands/ui/cli.d.ts +2 -0
  15. package/dist/commands/ui/cli.js +78 -0
  16. package/dist/commands/ui/cli.js.map +1 -0
  17. package/dist/commands/ui/fs-routes.d.ts +7 -0
  18. package/dist/commands/ui/fs-routes.js +135 -0
  19. package/dist/commands/ui/fs-routes.js.map +1 -0
  20. package/dist/commands/ui/http.d.ts +41 -0
  21. package/dist/commands/ui/http.js +81 -0
  22. package/dist/commands/ui/http.js.map +1 -0
  23. package/dist/commands/ui/jobs.d.ts +15 -0
  24. package/dist/commands/ui/jobs.js +73 -0
  25. package/dist/commands/ui/jobs.js.map +1 -0
  26. package/dist/commands/ui/modules/checks.d.ts +28 -0
  27. package/dist/commands/ui/modules/checks.js +556 -0
  28. package/dist/commands/ui/modules/checks.js.map +1 -0
  29. package/dist/commands/ui/modules/cleanup.d.ts +2 -0
  30. package/dist/commands/ui/modules/cleanup.js +305 -0
  31. package/dist/commands/ui/modules/cleanup.js.map +1 -0
  32. package/dist/commands/ui/modules/image-batch-backups.d.ts +2 -0
  33. package/dist/commands/ui/modules/image-batch-backups.js +116 -0
  34. package/dist/commands/ui/modules/image-batch-backups.js.map +1 -0
  35. package/dist/commands/ui/modules/image-batch-manage.d.ts +2 -0
  36. package/dist/commands/ui/modules/image-batch-manage.js +245 -0
  37. package/dist/commands/ui/modules/image-batch-manage.js.map +1 -0
  38. package/dist/commands/ui/modules/image-batch.d.ts +2 -0
  39. package/dist/commands/ui/modules/image-batch.js +225 -0
  40. package/dist/commands/ui/modules/image-batch.js.map +1 -0
  41. package/dist/commands/ui/modules/image-hash.d.ts +2 -0
  42. package/dist/commands/ui/modules/image-hash.js +158 -0
  43. package/dist/commands/ui/modules/image-hash.js.map +1 -0
  44. package/dist/commands/ui/modules/index.d.ts +2 -0
  45. package/dist/commands/ui/modules/index.js +11 -0
  46. package/dist/commands/ui/modules/index.js.map +1 -0
  47. package/dist/commands/ui/open-browser.d.ts +1 -0
  48. package/dist/commands/ui/open-browser.js +18 -0
  49. package/dist/commands/ui/open-browser.js.map +1 -0
  50. package/dist/commands/ui/scan.d.ts +20 -0
  51. package/dist/commands/ui/scan.js +57 -0
  52. package/dist/commands/ui/scan.js.map +1 -0
  53. package/dist/commands/ui/server.d.ts +18 -0
  54. package/dist/commands/ui/server.js +196 -0
  55. package/dist/commands/ui/server.js.map +1 -0
  56. package/dist/ui/assets/ChecksPage-Ia4QJkV3.js +1 -0
  57. package/dist/ui/assets/ChecksPage-VewKhd5A.css +1 -0
  58. package/dist/ui/assets/CleanupPage-DqqrgWSI.js +4 -0
  59. package/dist/ui/assets/CleanupPage-nxJE8S0P.css +1 -0
  60. package/dist/ui/assets/FolderBrowser-Cdzt7edI.js +1 -0
  61. package/dist/ui/assets/FolderBrowser-CkH9R4jg.css +1 -0
  62. package/dist/ui/assets/ImageBatchPage-9HgS9uVf.js +4 -0
  63. package/dist/ui/assets/ImageBatchPage-EhlvnXbP.css +1 -0
  64. package/dist/ui/assets/ImageHashPage-BT4S8t3Y.css +1 -0
  65. package/dist/ui/assets/ImageHashPage-C0ltmpOF.js +1 -0
  66. package/dist/ui/assets/SourcePicker-6fQmtLgo.css +1 -0
  67. package/dist/ui/assets/SourcePicker-xk00AG2e.js +1 -0
  68. package/dist/ui/assets/UiSegmented-BT3dOelo.css +1 -0
  69. package/dist/ui/assets/UiSegmented-CsTRUZoX.js +1 -0
  70. package/dist/ui/assets/core-DVezgdzc.js +12 -0
  71. package/dist/ui/assets/css-Z72CF80r.js +1 -0
  72. package/dist/ui/assets/engine-javascript-CNmxVhbB.js +141 -0
  73. package/dist/ui/assets/github-dark-DHJKELXO.js +1 -0
  74. package/dist/ui/assets/github-light-DAi9KRSo.js +1 -0
  75. package/dist/ui/assets/highlight-DT7vvdYt.js +2 -0
  76. package/dist/ui/assets/html-BlS82ilI.js +1 -0
  77. package/dist/ui/assets/index-Ch5kTxCO.css +1 -0
  78. package/dist/ui/assets/index-D8H-zVzo.js +11 -0
  79. package/dist/ui/assets/javascript-wDzz0qaB.js +1 -0
  80. package/dist/ui/assets/json-Cp-IABpG.js +1 -0
  81. package/dist/ui/assets/jsx-g9-lgVsj.js +1 -0
  82. package/dist/ui/assets/markdown-Cvjx9yec.js +1 -0
  83. package/dist/ui/assets/scss-Cw6XMfVs.js +1 -0
  84. package/dist/ui/assets/tsx-COt5Ahok.js +1 -0
  85. package/dist/ui/assets/typescript-BPQ3VLAy.js +1 -0
  86. package/dist/ui/assets/useCopy-i_vlQfC-.js +1 -0
  87. package/dist/ui/assets/vue-CwSeJimo.js +1 -0
  88. package/dist/ui/assets/yaml-Buea-lGh.js +1 -0
  89. package/dist/ui/index.html +17 -0
  90. package/package.json +17 -4
@@ -0,0 +1,245 @@
1
+ import { existsSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { discoverConfigs, parseConfig, readConfigSource, } from '../../image-batch/config.js';
4
+ import { ImageBatchUsageError } from '../../image-batch/errors.js';
5
+ import { configDir, describeConfigLines, describeLocation, removeConfigFile, validName, writeJson, } from '../../image-batch/manage.js';
6
+ import { completeSharpen, parseSharpenFields, sharpenParams, } from '../../image-batch/sharpen.js';
7
+ import { attachSharpenPresets, discoverSharpenPresets, readSharpenPreset, } from '../../image-batch/sharpen-presets.js';
8
+ import { removeSharpenPreset, sharpenDir } from '../../image-batch/sharpen-manage.js';
9
+ import { findSharp, resolveUserPath } from '../fs-routes.js';
10
+ import { HttpError, asObject, sendBytes, sendJson } from '../http.js';
11
+ function usage(task) {
12
+ try {
13
+ return task();
14
+ }
15
+ catch (error) {
16
+ if (error instanceof ImageBatchUsageError)
17
+ throw new HttpError(400, error.message);
18
+ throw error;
19
+ }
20
+ }
21
+ function scopeOf(value) {
22
+ if (value === 'project' || value === 'global')
23
+ return value;
24
+ throw new HttpError(400, 'scope must be "project" or "global"');
25
+ }
26
+ function nameOf(value) {
27
+ if (typeof value !== 'string')
28
+ throw new HttpError(400, 'give a name');
29
+ return usage(() => validName(value));
30
+ }
31
+ function findConfig(ctx, name, scope) {
32
+ const found = discoverConfigs({ cwd: ctx.server.cwd }).find((location) => location.name === name && location.scope === scope);
33
+ if (!found)
34
+ throw new HttpError(404, `no ${scope} config named "${name}"`);
35
+ return found;
36
+ }
37
+ function validateRaw(raw, cwd) {
38
+ const parsed = usage(() => parseConfig(raw, 'config'));
39
+ const config = usage(() => attachSharpenPresets(parsed, { cwd }));
40
+ const lines = describeConfigLines(config, { plain: true })
41
+ .join('\n')
42
+ .split('\n')
43
+ .map((line) => line.replace(/\s+$/, ''))
44
+ .filter((line) => line !== '');
45
+ return { config, lines };
46
+ }
47
+ async function readConfig(ctx) {
48
+ const name = nameOf(ctx.url.searchParams.get('name'));
49
+ const scope = scopeOf(ctx.url.searchParams.get('scope'));
50
+ const location = findConfig(ctx, name, scope);
51
+ if (!location.editable) {
52
+ throw new HttpError(422, `${location.name} is a .${location.kind} file — only .json configs can be edited here`);
53
+ }
54
+ const raw = await readConfigSource(location);
55
+ sendJson(ctx.res, 200, { name, scope, path: location.path, raw });
56
+ }
57
+ async function validateConfig(ctx) {
58
+ const body = asObject(await ctx.readBody());
59
+ try {
60
+ const { lines } = validateRaw(body.raw, ctx.server.cwd);
61
+ sendJson(ctx.res, 200, { ok: true, lines });
62
+ }
63
+ catch (error) {
64
+ if (error instanceof HttpError && error.status === 400) {
65
+ sendJson(ctx.res, 200, { ok: false, error: error.message });
66
+ return;
67
+ }
68
+ throw error;
69
+ }
70
+ }
71
+ async function saveConfig(ctx) {
72
+ const body = asObject(await ctx.readBody());
73
+ const name = nameOf(body.name);
74
+ const scope = scopeOf(body.scope);
75
+ validateRaw(body.raw, ctx.server.cwd);
76
+ const env = { cwd: ctx.server.cwd };
77
+ const path = join(configDir(scope, env), `${name}.json`);
78
+ const original = typeof body.originalName === 'string' && body.originalScope !== undefined
79
+ ? { name: body.originalName, scope: scopeOf(body.originalScope) }
80
+ : undefined;
81
+ const sameAsOriginal = original?.name === name && original.scope === scope;
82
+ if (existsSync(path) && !sameAsOriginal && body.overwrite !== true) {
83
+ sendJson(ctx.res, 409, { error: `${path} already exists`, exists: true, path });
84
+ return;
85
+ }
86
+ const clash = discoverConfigs({ cwd: ctx.server.cwd }).find((location) => location.name === name && location.scope === scope && location.kind !== 'json');
87
+ if (clash)
88
+ throw new HttpError(409, `${clash.path} already exists and is not a JSON file`);
89
+ writeJson(path, body.raw);
90
+ if (original && !sameAsOriginal) {
91
+ const old = discoverConfigs({ cwd: ctx.server.cwd }).find((location) => location.name === original.name && location.scope === original.scope);
92
+ if (old && old.path !== path)
93
+ removeConfigFile(old, true);
94
+ }
95
+ sendJson(ctx.res, 200, { name, scope, path });
96
+ }
97
+ async function deleteConfig(ctx) {
98
+ const body = asObject(await ctx.readBody());
99
+ const location = findConfig(ctx, nameOf(body.name), scopeOf(body.scope));
100
+ const backup = removeConfigFile(location, false);
101
+ sendJson(ctx.res, 200, { deleted: location.path, backup });
102
+ }
103
+ async function listConfigs(ctx) {
104
+ const locations = discoverConfigs({ cwd: ctx.server.cwd });
105
+ const rows = await Promise.all(locations.map(describeLocation));
106
+ sendJson(ctx.res, 200, rows.map((row) => ({
107
+ name: row.location.name,
108
+ scope: row.location.scope,
109
+ path: row.location.path,
110
+ kind: row.location.kind,
111
+ editable: row.location.editable,
112
+ title: row.title,
113
+ description: row.description,
114
+ recipes: row.recipes,
115
+ rules: row.rules,
116
+ error: row.error,
117
+ })));
118
+ }
119
+ function presetRow(location) {
120
+ try {
121
+ const preset = readSharpenPreset(location);
122
+ return {
123
+ name: location.name,
124
+ scope: location.scope,
125
+ path: location.path,
126
+ description: preset.description,
127
+ fields: preset.fields,
128
+ params: sharpenParams(completeSharpen(preset.fields)),
129
+ };
130
+ }
131
+ catch (error) {
132
+ return {
133
+ name: location.name,
134
+ scope: location.scope,
135
+ path: location.path,
136
+ error: error instanceof Error ? error.message : String(error),
137
+ };
138
+ }
139
+ }
140
+ function listPresets(ctx) {
141
+ sendJson(ctx.res, 200, discoverSharpenPresets({ cwd: ctx.server.cwd }).map((location) => presetRow(location)));
142
+ }
143
+ function fieldsFrom(value, allowEmpty = false) {
144
+ const object = asObject(value, 'fields');
145
+ const { preset: _preset, ...rest } = object;
146
+ void _preset;
147
+ if (Object.keys(rest).length === 0) {
148
+ if (allowEmpty)
149
+ return {};
150
+ throw new HttpError(400, 'choose at least one setting: a target, an amount or a fine value');
151
+ }
152
+ return usage(() => parseSharpenFields(rest, 'sharpen', false));
153
+ }
154
+ async function previewParams(ctx) {
155
+ const body = asObject(await ctx.readBody());
156
+ const fields = fieldsFrom(body.fields, true);
157
+ sendJson(ctx.res, 200, { params: sharpenParams(completeSharpen(fields)) });
158
+ }
159
+ async function savePreset(ctx) {
160
+ const body = asObject(await ctx.readBody());
161
+ const name = nameOf(body.name);
162
+ const scope = scopeOf(body.scope);
163
+ const fields = fieldsFrom(body.fields);
164
+ const description = typeof body.description === 'string' && body.description.trim() !== ''
165
+ ? body.description.trim()
166
+ : undefined;
167
+ const path = join(sharpenDir(scope, { cwd: ctx.server.cwd }), `${name}.json`);
168
+ const original = typeof body.originalName === 'string' && body.originalScope !== undefined
169
+ ? { name: body.originalName, scope: scopeOf(body.originalScope) }
170
+ : undefined;
171
+ const same = original?.name === name && original.scope === scope;
172
+ if (existsSync(path) && !same && body.overwrite !== true) {
173
+ sendJson(ctx.res, 409, { error: `${path} already exists`, exists: true, path });
174
+ return;
175
+ }
176
+ writeJson(path, { ...(description ? { description } : {}), ...fields });
177
+ if (original && !same) {
178
+ const old = discoverSharpenPresets({ cwd: ctx.server.cwd }).find((location) => location.name === original.name &&
179
+ location.scope === original.scope &&
180
+ location.path !== path);
181
+ if (old)
182
+ removeSharpenPreset(old, true);
183
+ }
184
+ sendJson(ctx.res, 200, { name, scope, path });
185
+ }
186
+ async function deletePreset(ctx) {
187
+ const body = asObject(await ctx.readBody());
188
+ const name = nameOf(body.name);
189
+ const scope = scopeOf(body.scope);
190
+ const location = discoverSharpenPresets({ cwd: ctx.server.cwd }).find((candidate) => candidate.name === name && candidate.scope === scope);
191
+ if (!location)
192
+ throw new HttpError(404, `no ${scope} sharpen preset named "${name}"`);
193
+ const backup = usage(() => removeSharpenPreset(location, false));
194
+ sendJson(ctx.res, 200, { deleted: location.path, backup });
195
+ }
196
+ async function sharpenPreview(ctx) {
197
+ const { url, res, server } = ctx;
198
+ const path = resolveUserPath(url.searchParams.get('path'), server.cwd);
199
+ if (!statSync(path, { throwIfNoEntry: false })?.isFile())
200
+ throw new HttpError(404, 'no such file');
201
+ const sharp = findSharp(server.cwd);
202
+ if (!sharp)
203
+ throw new HttpError(503, 'the sharp library is not installed');
204
+ const width = Math.min(Math.max(Number(url.searchParams.get('width') ?? 800) || 800, 16), 3000);
205
+ const raw = {};
206
+ for (const key of ['for', 'amount']) {
207
+ const value = url.searchParams.get(key);
208
+ if (value)
209
+ raw[key] = value;
210
+ }
211
+ for (const key of ['radius', 'flat', 'jagged', 'threshold']) {
212
+ const value = url.searchParams.get(key);
213
+ if (value !== null && value !== '')
214
+ raw[key] = Number(value);
215
+ }
216
+ const apply = url.searchParams.get('sharpen') === '1';
217
+ const fields = apply ? fieldsFrom(raw, true) : undefined;
218
+ try {
219
+ let image = sharp(path, { failOn: 'none' })
220
+ .rotate()
221
+ .resize({ width, height: width * 4, fit: 'inside', withoutEnlargement: true });
222
+ if (fields)
223
+ image = image.sharpen(sharpenParams(completeSharpen(fields)));
224
+ const bytes = await image.webp({ quality: 92 }).toBuffer();
225
+ sendBytes(res, 'image/webp', bytes);
226
+ }
227
+ catch (error) {
228
+ if (error instanceof HttpError)
229
+ throw error;
230
+ throw new HttpError(422, 'this image could not be read');
231
+ }
232
+ }
233
+ export const manageRoutes = [
234
+ { method: 'GET', path: '/api/image-batch/configs', handler: listConfigs },
235
+ { method: 'GET', path: '/api/image-batch/config', handler: readConfig },
236
+ { method: 'POST', path: '/api/image-batch/config/validate', handler: validateConfig },
237
+ { method: 'POST', path: '/api/image-batch/config/save', handler: saveConfig },
238
+ { method: 'POST', path: '/api/image-batch/config/delete', handler: deleteConfig },
239
+ { method: 'GET', path: '/api/image-batch/sharpen-presets', handler: listPresets },
240
+ { method: 'POST', path: '/api/image-batch/sharpen-preset/params', handler: previewParams },
241
+ { method: 'POST', path: '/api/image-batch/sharpen-preset/save', handler: savePreset },
242
+ { method: 'POST', path: '/api/image-batch/sharpen-preset/delete', handler: deletePreset },
243
+ { method: 'GET', path: '/api/image-batch/sharpen-preview', handler: sharpenPreview },
244
+ ];
245
+ //# sourceMappingURL=image-batch-manage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-batch-manage.js","sourceRoot":"","sources":["../../../../src/commands/ui/modules/image-batch-manage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type UiModule } from '../http.js';
2
+ export declare const imageBatchModule: UiModule;
@@ -0,0 +1,225 @@
1
+ import { resolve } from 'node:path';
2
+ import { OUTPUT_FORMATS, QUALITY_LEVELS, normalizeFormat, validateQualityInput, } from '../../image-batch/codecs.js';
3
+ import { METADATA_MODES, POSITIONS, discoverConfigs, emptyConfig, loadConfig, parseByteSize, resolveConfigRef, } from '../../image-batch/config.js';
4
+ import { ImageBatchUsageError } from '../../image-batch/errors.js';
5
+ import { FIT_MODES } from '../../image-batch/geometry.js';
6
+ import { BATCH_IMAGE_EXTENSIONS } from '../../image-batch/inputs.js';
7
+ import { runImageBatch, } from '../../image-batch/run.js';
8
+ import { SHARPEN_AMOUNTS, SHARPEN_FINE_KEYS, SHARPEN_RANGES, SHARPEN_TARGETS, parseSharpenLayer, } from '../../image-batch/sharpen.js';
9
+ import { BUILT_IN_SHARPEN_PRESETS } from '../../image-batch/sharpen-presets.js';
10
+ import { TEMPLATE_VARIABLES, defaultTemplate } from '../../image-batch/template.js';
11
+ import { loadSharp } from '../../image-hash/sharp-loader.js';
12
+ import { withUpperCaseVariants } from '../../image-hash/core.js';
13
+ import { findSharp, forgetSharp } from '../fs-routes.js';
14
+ import { HttpError, asObject, sendJson, } from '../http.js';
15
+ import { startJob } from '../jobs.js';
16
+ import { scanHandler, stringList } from '../scan.js';
17
+ import { backupRoutes } from './image-batch-backups.js';
18
+ import { manageRoutes } from './image-batch-manage.js';
19
+ const SIZE_METHODS = [
20
+ 'widths',
21
+ 'heights',
22
+ 'size',
23
+ 'longEdge',
24
+ 'shortEdge',
25
+ 'megapixels',
26
+ 'percent',
27
+ 'original',
28
+ ];
29
+ const PLACEMENTS = ['out', 'beside', 'replace'];
30
+ const OVERWRITE_MODES = ['overwrite', 'skip', 'error'];
31
+ function usage(task) {
32
+ try {
33
+ return task();
34
+ }
35
+ catch (error) {
36
+ if (error instanceof ImageBatchUsageError)
37
+ throw new HttpError(400, error.message);
38
+ throw error;
39
+ }
40
+ }
41
+ function numberList(value, name, min, max, whole) {
42
+ if (!Array.isArray(value) || value.length === 0) {
43
+ throw new HttpError(400, `${name}: give at least one number`);
44
+ }
45
+ const numbers = value.map(Number);
46
+ if (numbers.some((n) => !Number.isFinite(n) || n < min || n > max || (whole && !Number.isInteger(n)))) {
47
+ throw new HttpError(400, `${name}: expected ${whole ? 'whole numbers' : 'numbers'} from ${min} to ${max}`);
48
+ }
49
+ return numbers;
50
+ }
51
+ function overridesFrom(settings) {
52
+ const overrides = {};
53
+ const method = (settings.sizeMethod ?? 'original');
54
+ if (!SIZE_METHODS.includes(method))
55
+ throw new HttpError(400, `sizeMethod: expected one of ${SIZE_METHODS.join(', ')}`);
56
+ if (method === 'widths')
57
+ overrides.widths = numberList(settings.values, 'widths', 1, 65535, true);
58
+ if (method === 'heights')
59
+ overrides.heights = numberList(settings.values, 'heights', 1, 65535, true);
60
+ if (method === 'longEdge')
61
+ overrides.longEdge = numberList(settings.values, 'long side', 1, 65535, true);
62
+ if (method === 'shortEdge')
63
+ overrides.shortEdge = numberList(settings.values, 'short side', 1, 65535, true);
64
+ if (method === 'megapixels')
65
+ overrides.megapixels = numberList(settings.values, 'megapixels', 0.001, 1000, false);
66
+ if (method === 'percent')
67
+ overrides.percent = numberList(settings.values, 'percent', 0.1, 1000, false);
68
+ if (method === 'size') {
69
+ if (typeof settings.box !== 'string')
70
+ throw new HttpError(400, 'box: give a size like 1920x1080');
71
+ overrides.size = settings.box;
72
+ if (settings.matchOrientation === true)
73
+ overrides.matchOrientation = true;
74
+ if (typeof settings.fit === 'string') {
75
+ if (!FIT_MODES.includes(settings.fit)) {
76
+ throw new HttpError(400, `fit: expected one of ${FIT_MODES.join(', ')}`);
77
+ }
78
+ overrides.fit = settings.fit;
79
+ }
80
+ }
81
+ if (settings.formats !== undefined) {
82
+ const formats = stringList(settings.formats, 'formats');
83
+ if (formats.length === 0)
84
+ throw new HttpError(400, 'formats: pick at least one format');
85
+ usage(() => formats.forEach((format) => normalizeFormat(format, 'formats')));
86
+ overrides.formats = formats;
87
+ }
88
+ if (settings.quality !== undefined && settings.quality !== null && settings.quality !== '') {
89
+ const quality = usage(() => validateQualityInput(settings.quality, 'quality'));
90
+ overrides.quality = quality;
91
+ }
92
+ if (settings.maxBytes !== undefined && settings.maxBytes !== null && settings.maxBytes !== '') {
93
+ overrides.maxBytes = usage(() => parseByteSize(settings.maxBytes, 'max size'));
94
+ }
95
+ if (typeof settings.name === 'string' && settings.name.trim() !== '')
96
+ overrides.name = settings.name.trim();
97
+ if (settings.sharpen !== undefined && settings.sharpen !== null) {
98
+ overrides.sharpen = usage(() => parseSharpenLayer(settings.sharpen, 'sharpen'));
99
+ }
100
+ if (settings.flatten === true || typeof settings.flatten === 'string') {
101
+ overrides.flatten = settings.flatten;
102
+ }
103
+ return Object.keys(overrides).length > 0 ? overrides : undefined;
104
+ }
105
+ async function configFor(name, cwd) {
106
+ if (name === undefined || name === '')
107
+ return { config: emptyConfig() };
108
+ const location = usage(() => resolveConfigRef(name, discoverConfigs({ cwd }), cwd));
109
+ const loaded = await usage(() => loadConfig(location));
110
+ return { config: loaded.config, label: location.name };
111
+ }
112
+ async function startRun(ctx) {
113
+ const body = asObject(await ctx.readBody());
114
+ const cwd = ctx.server.cwd;
115
+ const paths = stringList(body.paths, 'paths');
116
+ if (paths.length === 0)
117
+ throw new HttpError(400, 'add at least one folder or image');
118
+ const placement = (body.placement ?? 'out');
119
+ if (!PLACEMENTS.includes(placement))
120
+ throw new HttpError(400, 'placement: out, beside or replace');
121
+ const overwrite = (body.overwrite ?? 'skip');
122
+ if (!OVERWRITE_MODES.includes(overwrite)) {
123
+ throw new HttpError(400, `overwrite: expected one of ${OVERWRITE_MODES.join(', ')}`);
124
+ }
125
+ if (placement === 'out' && (typeof body.out !== 'string' || body.out.trim() === '')) {
126
+ throw new HttpError(400, 'choose the folder for the results');
127
+ }
128
+ const out = typeof body.out === 'string' && body.out.trim() !== ''
129
+ ? resolve(cwd, body.out.trim())
130
+ : undefined;
131
+ const settings = body.settings === undefined ? {} : asObject(body.settings, 'settings');
132
+ const overrides = body.config ? undefined : overridesFrom(settings);
133
+ const loaded = await configFor(typeof body.config === 'string' ? body.config : undefined, cwd);
134
+ const dryRun = body.dryRun === true;
135
+ const installSharp = body.installSharp === true;
136
+ const id = startJob(async (progress) => {
137
+ if (installSharp)
138
+ await loadSharp({ assumeYes: true, cwd, command: 'image-batch' });
139
+ const options = {
140
+ paths: paths.map((path) => resolve(cwd, path)),
141
+ cwd,
142
+ config: loaded.config,
143
+ recursive: body.recursive === true,
144
+ overwrite,
145
+ dryRun,
146
+ assumeYes: true,
147
+ interactive: false,
148
+ concurrency: 4,
149
+ onProgress: progress,
150
+ };
151
+ if (loaded.label !== undefined)
152
+ options.configLabel = loaded.label;
153
+ if (overrides)
154
+ options.overrides = overrides;
155
+ if (placement === 'out' && out)
156
+ options.out = out;
157
+ if (placement === 'out' && body.flat === true)
158
+ options.flat = true;
159
+ if (placement === 'beside')
160
+ options.beside = true;
161
+ if (placement === 'replace') {
162
+ options.replace = true;
163
+ if (body.backup === false)
164
+ options.backup = false;
165
+ if (body.onlyIfSmaller === false)
166
+ options.onlyIfSmaller = false;
167
+ }
168
+ const report = await runImageBatch(options);
169
+ forgetSharp();
170
+ return report;
171
+ });
172
+ sendJson(ctx.res, 202, { jobId: id });
173
+ }
174
+ const routes = [
175
+ {
176
+ method: 'GET',
177
+ path: '/api/image-batch/options',
178
+ handler: ({ res, server }) => {
179
+ sendJson(res, 200, {
180
+ formats: [...OUTPUT_FORMATS, 'original'],
181
+ qualityLevels: QUALITY_LEVELS,
182
+ sizeMethods: SIZE_METHODS,
183
+ fitModes: FIT_MODES,
184
+ positions: POSITIONS,
185
+ metadataModes: METADATA_MODES,
186
+ placements: PLACEMENTS,
187
+ overwriteModes: OVERWRITE_MODES,
188
+ sharpen: {
189
+ targets: SHARPEN_TARGETS,
190
+ amounts: SHARPEN_AMOUNTS,
191
+ fine: SHARPEN_FINE_KEYS.map((key) => ({ key, range: SHARPEN_RANGES[key] })),
192
+ builtIn: Object.keys(BUILT_IN_SHARPEN_PRESETS),
193
+ },
194
+ templateVariables: TEMPLATE_VARIABLES,
195
+ defaultTemplates: {
196
+ original: defaultTemplate({}),
197
+ widths: defaultTemplate({ widths: true }),
198
+ heights: defaultTemplate({ heights: true }),
199
+ size: defaultTemplate({ size: true }),
200
+ longEdge: defaultTemplate({ longEdge: true }),
201
+ shortEdge: defaultTemplate({ shortEdge: true }),
202
+ megapixels: defaultTemplate({ megapixels: true }),
203
+ percent: defaultTemplate({ percent: true }),
204
+ },
205
+ sharp: findSharp(server.cwd) !== null,
206
+ });
207
+ },
208
+ },
209
+ {
210
+ method: 'POST',
211
+ path: '/api/image-batch/scan',
212
+ handler: scanHandler(withUpperCaseVariants(BATCH_IMAGE_EXTENSIONS)),
213
+ },
214
+ ...manageRoutes,
215
+ ...backupRoutes,
216
+ { method: 'POST', path: '/api/image-batch/run', handler: startRun },
217
+ ];
218
+ export const imageBatchModule = {
219
+ id: 'image-batch',
220
+ title: 'Image Batch',
221
+ description: 'Resize, convert and sharpen images in bulk by saved rules.',
222
+ status: 'available',
223
+ routes,
224
+ };
225
+ //# sourceMappingURL=image-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-batch.js","sourceRoot":"","sources":["../../../../src/commands/ui/modules/image-batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type UiModule } from '../http.js';
2
+ export declare const imageHashModule: UiModule;