@macrulez/devtoolz 0.4.0 → 0.4.2
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.
- package/README.md +19 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/image-batch/cli.js +4 -5
- package/dist/commands/image-batch/cli.js.map +1 -1
- package/dist/commands/image-batch/config.d.ts +3 -2
- package/dist/commands/image-batch/config.js +6 -20
- package/dist/commands/image-batch/config.js.map +1 -1
- package/dist/commands/image-batch/manage-cli.js +81 -4
- package/dist/commands/image-batch/manage-cli.js.map +1 -1
- package/dist/commands/image-batch/manage.d.ts +3 -2
- package/dist/commands/image-batch/manage.js +55 -14
- package/dist/commands/image-batch/manage.js.map +1 -1
- package/dist/commands/image-batch/run.d.ts +7 -3
- package/dist/commands/image-batch/run.js +11 -1
- package/dist/commands/image-batch/run.js.map +1 -1
- package/dist/commands/image-batch/sharpen-ask.d.ts +6 -0
- package/dist/commands/image-batch/sharpen-ask.js +53 -0
- package/dist/commands/image-batch/sharpen-ask.js.map +1 -0
- package/dist/commands/image-batch/sharpen-manage.d.ts +26 -0
- package/dist/commands/image-batch/sharpen-manage.js +238 -0
- package/dist/commands/image-batch/sharpen-manage.js.map +1 -0
- package/dist/commands/image-batch/sharpen-presets.d.ts +24 -0
- package/dist/commands/image-batch/sharpen-presets.js +145 -0
- package/dist/commands/image-batch/sharpen-presets.js.map +1 -0
- package/dist/commands/image-batch/sharpen.d.ts +33 -3
- package/dist/commands/image-batch/sharpen.js +141 -14
- package/dist/commands/image-batch/sharpen.js.map +1 -1
- package/dist/commands/image-hash/sharp-loader.d.ts +3 -0
- package/dist/commands/image-hash/sharp-loader.js.map +1 -1
- package/dist/commands/ui/cli.d.ts +2 -0
- package/dist/commands/ui/cli.js +78 -0
- package/dist/commands/ui/cli.js.map +1 -0
- package/dist/commands/ui/fs-routes.d.ts +7 -0
- package/dist/commands/ui/fs-routes.js +135 -0
- package/dist/commands/ui/fs-routes.js.map +1 -0
- package/dist/commands/ui/http.d.ts +41 -0
- package/dist/commands/ui/http.js +81 -0
- package/dist/commands/ui/http.js.map +1 -0
- package/dist/commands/ui/jobs.d.ts +15 -0
- package/dist/commands/ui/jobs.js +73 -0
- package/dist/commands/ui/jobs.js.map +1 -0
- package/dist/commands/ui/modules/checks.d.ts +28 -0
- package/dist/commands/ui/modules/checks.js +556 -0
- package/dist/commands/ui/modules/checks.js.map +1 -0
- package/dist/commands/ui/modules/cleanup.d.ts +2 -0
- package/dist/commands/ui/modules/cleanup.js +305 -0
- package/dist/commands/ui/modules/cleanup.js.map +1 -0
- package/dist/commands/ui/modules/image-batch-backups.d.ts +2 -0
- package/dist/commands/ui/modules/image-batch-backups.js +116 -0
- package/dist/commands/ui/modules/image-batch-backups.js.map +1 -0
- package/dist/commands/ui/modules/image-batch-manage.d.ts +2 -0
- package/dist/commands/ui/modules/image-batch-manage.js +245 -0
- package/dist/commands/ui/modules/image-batch-manage.js.map +1 -0
- package/dist/commands/ui/modules/image-batch.d.ts +2 -0
- package/dist/commands/ui/modules/image-batch.js +225 -0
- package/dist/commands/ui/modules/image-batch.js.map +1 -0
- package/dist/commands/ui/modules/image-hash.d.ts +2 -0
- package/dist/commands/ui/modules/image-hash.js +158 -0
- package/dist/commands/ui/modules/image-hash.js.map +1 -0
- package/dist/commands/ui/modules/index.d.ts +2 -0
- package/dist/commands/ui/modules/index.js +11 -0
- package/dist/commands/ui/modules/index.js.map +1 -0
- package/dist/commands/ui/open-browser.d.ts +1 -0
- package/dist/commands/ui/open-browser.js +18 -0
- package/dist/commands/ui/open-browser.js.map +1 -0
- package/dist/commands/ui/scan.d.ts +20 -0
- package/dist/commands/ui/scan.js +57 -0
- package/dist/commands/ui/scan.js.map +1 -0
- package/dist/commands/ui/server.d.ts +18 -0
- package/dist/commands/ui/server.js +196 -0
- package/dist/commands/ui/server.js.map +1 -0
- package/dist/ui/assets/ChecksPage-MLWSelKP.js +1 -0
- package/dist/ui/assets/ChecksPage-pbC0Txsh.css +1 -0
- package/dist/ui/assets/CleanupPage-B2ZTFOpP.js +4 -0
- package/dist/ui/assets/CleanupPage-k7sTI4iz.css +1 -0
- package/dist/ui/assets/FolderBrowser-BX3-y8sM.js +1 -0
- package/dist/ui/assets/FolderBrowser-DRh-WZPz.css +1 -0
- package/dist/ui/assets/ImageBatchPage-CvsCvu1q.js +4 -0
- package/dist/ui/assets/ImageBatchPage-DiK8ODUc.css +1 -0
- package/dist/ui/assets/ImageHashPage-Bbhxvjj0.js +1 -0
- package/dist/ui/assets/ImageHashPage-CUXnoJEA.css +1 -0
- package/dist/ui/assets/SourcePicker-C3qFDUoL.css +1 -0
- package/dist/ui/assets/SourcePicker-CVgtCk78.js +1 -0
- package/dist/ui/assets/UiSegmented-Q_ter8VK.css +1 -0
- package/dist/ui/assets/UiSegmented-YV1YATxM.js +1 -0
- package/dist/ui/assets/core-DVezgdzc.js +12 -0
- package/dist/ui/assets/css-Z72CF80r.js +1 -0
- package/dist/ui/assets/engine-javascript-CNmxVhbB.js +141 -0
- package/dist/ui/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/ui/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/ui/assets/highlight-CsAszz7F.js +2 -0
- package/dist/ui/assets/html-BlS82ilI.js +1 -0
- package/dist/ui/assets/index-BzfkjuG8.css +1 -0
- package/dist/ui/assets/index-pDKL0Y31.js +3 -0
- package/dist/ui/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/ui/assets/json-Cp-IABpG.js +1 -0
- package/dist/ui/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/ui/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/ui/assets/scss-Cw6XMfVs.js +1 -0
- package/dist/ui/assets/tsx-COt5Ahok.js +1 -0
- package/dist/ui/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/ui/assets/useCopy-vCfkPGWW.js +1 -0
- package/dist/ui/assets/vue-CwSeJimo.js +1 -0
- package/dist/ui/assets/yaml-Buea-lGh.js +1 -0
- package/dist/ui/index.html +17 -0
- package/package.json +17 -4
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { basename, dirname, extname, join, resolve } from 'node:path';
|
|
4
|
+
import { didYouMean } from '../../utils/closest.js';
|
|
5
|
+
import { CONFIG_DIR_SEGMENTS, globalConfigDir } from './config.js';
|
|
6
|
+
import { ImageBatchUsageError } from './errors.js';
|
|
7
|
+
import { parseSharpenFields } from './sharpen.js';
|
|
8
|
+
export const SHARPEN_DIR_NAME = 'sharpen';
|
|
9
|
+
export const BUILT_IN_SHARPEN_PRESETS = {
|
|
10
|
+
'web-light': {
|
|
11
|
+
description: 'A light touch for web photos',
|
|
12
|
+
fields: { for: 'screen', amount: 'low' },
|
|
13
|
+
},
|
|
14
|
+
'web-crisp': {
|
|
15
|
+
description: 'Everyday sharpening for the web',
|
|
16
|
+
fields: { for: 'screen', amount: 'standard' },
|
|
17
|
+
},
|
|
18
|
+
'web-detail': {
|
|
19
|
+
description: 'Fine detail for large web photos',
|
|
20
|
+
fields: { for: 'screen', amount: 'high', radius: 0.8 },
|
|
21
|
+
},
|
|
22
|
+
thumbnail: {
|
|
23
|
+
description: 'Small previews: a fine radius, gentle on flat areas',
|
|
24
|
+
fields: { for: 'screen', amount: 'standard', radius: 0.4, flat: 0.6, jagged: 2.5 },
|
|
25
|
+
},
|
|
26
|
+
'print-matte': {
|
|
27
|
+
description: 'Matte paper',
|
|
28
|
+
fields: { for: 'matte', amount: 'standard' },
|
|
29
|
+
},
|
|
30
|
+
'print-glossy': {
|
|
31
|
+
description: 'Glossy paper',
|
|
32
|
+
fields: { for: 'glossy', amount: 'standard' },
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
export function globalSharpenDir(globalDir) {
|
|
36
|
+
return join(globalDir ?? globalConfigDir(homedir()), SHARPEN_DIR_NAME);
|
|
37
|
+
}
|
|
38
|
+
function listPresets(dir, scope) {
|
|
39
|
+
const stat = statSync(dir, { throwIfNoEntry: false });
|
|
40
|
+
if (!stat?.isDirectory())
|
|
41
|
+
return [];
|
|
42
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
43
|
+
.filter((entry) => entry.isFile() && extname(entry.name).toLowerCase() === '.json')
|
|
44
|
+
.sort((a, b) => a.name.localeCompare(b.name))
|
|
45
|
+
.map((entry) => ({
|
|
46
|
+
name: basename(entry.name, extname(entry.name)),
|
|
47
|
+
path: join(dir, entry.name),
|
|
48
|
+
scope,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
export function discoverSharpenPresets(options) {
|
|
52
|
+
const found = [];
|
|
53
|
+
const seen = new Set();
|
|
54
|
+
const globalDir = resolve(globalSharpenDir(options.globalDir));
|
|
55
|
+
const homeGlobalDir = resolve(globalSharpenDir());
|
|
56
|
+
let dir = resolve(options.cwd);
|
|
57
|
+
for (;;) {
|
|
58
|
+
const candidate = join(dir, ...CONFIG_DIR_SEGMENTS, SHARPEN_DIR_NAME);
|
|
59
|
+
const resolved = resolve(candidate);
|
|
60
|
+
if (resolved !== globalDir && resolved !== homeGlobalDir && !seen.has(candidate)) {
|
|
61
|
+
seen.add(candidate);
|
|
62
|
+
found.push(...listPresets(candidate, 'project'));
|
|
63
|
+
}
|
|
64
|
+
if (existsSync(join(dir, '.git')))
|
|
65
|
+
break;
|
|
66
|
+
const parent = dirname(dir);
|
|
67
|
+
if (parent === dir)
|
|
68
|
+
break;
|
|
69
|
+
dir = parent;
|
|
70
|
+
}
|
|
71
|
+
found.push(...listPresets(globalDir, 'global'));
|
|
72
|
+
const own = new Set(found.map((location) => location.name));
|
|
73
|
+
for (const name of Object.keys(BUILT_IN_SHARPEN_PRESETS)) {
|
|
74
|
+
if (!own.has(name))
|
|
75
|
+
found.push({ name, path: `(built-in ${name})`, scope: 'built-in' });
|
|
76
|
+
}
|
|
77
|
+
return found;
|
|
78
|
+
}
|
|
79
|
+
export function readSharpenPreset(location) {
|
|
80
|
+
if (location.scope === 'built-in') {
|
|
81
|
+
const preset = BUILT_IN_SHARPEN_PRESETS[location.name];
|
|
82
|
+
if (!preset)
|
|
83
|
+
throw new ImageBatchUsageError(`${location.name} is not a built-in preset`);
|
|
84
|
+
return preset;
|
|
85
|
+
}
|
|
86
|
+
let parsed;
|
|
87
|
+
try {
|
|
88
|
+
parsed = JSON.parse(readFileSync(location.path, 'utf8'));
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw new ImageBatchUsageError(`${location.path}: not valid JSON — ${error instanceof Error ? error.message : String(error)}`);
|
|
92
|
+
}
|
|
93
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
94
|
+
throw new ImageBatchUsageError(`${location.path}: expected a JSON object`);
|
|
95
|
+
}
|
|
96
|
+
const { description, ...rest } = parsed;
|
|
97
|
+
if (description !== undefined && typeof description !== 'string') {
|
|
98
|
+
throw new ImageBatchUsageError(`${location.path}.description: expected a string`);
|
|
99
|
+
}
|
|
100
|
+
const fields = parseSharpenFields(rest, location.path, false);
|
|
101
|
+
return { ...(description !== undefined ? { description } : {}), fields };
|
|
102
|
+
}
|
|
103
|
+
export function findSharpenPreset(name, discovered) {
|
|
104
|
+
const matches = discovered.filter((location) => location.name === name);
|
|
105
|
+
const chosen = matches.find((match) => match.scope === 'project') ?? matches[0];
|
|
106
|
+
if (!chosen) {
|
|
107
|
+
const names = [...new Set(discovered.map((location) => location.name))];
|
|
108
|
+
throw new ImageBatchUsageError(`no sharpen preset named "${name}".${didYouMean(name, names)} ${names.length > 0
|
|
109
|
+
? `Available: ${names.join(', ')}.`
|
|
110
|
+
: 'None found — create one with `devtoolz image-batch sharpen new`.'}`);
|
|
111
|
+
}
|
|
112
|
+
return chosen;
|
|
113
|
+
}
|
|
114
|
+
function layersOf(config, extra) {
|
|
115
|
+
const recipes = [
|
|
116
|
+
config.defaults,
|
|
117
|
+
...Object.values(config.presets),
|
|
118
|
+
...config.outputs,
|
|
119
|
+
...config.match.flatMap((rule) => rule.outputs),
|
|
120
|
+
];
|
|
121
|
+
const layers = [];
|
|
122
|
+
for (const recipe of recipes)
|
|
123
|
+
if (recipe.sharpen)
|
|
124
|
+
layers.push(recipe.sharpen);
|
|
125
|
+
for (const layer of extra)
|
|
126
|
+
if (layer)
|
|
127
|
+
layers.push(layer);
|
|
128
|
+
return layers;
|
|
129
|
+
}
|
|
130
|
+
export function attachSharpenPresets(config, options) {
|
|
131
|
+
const names = [
|
|
132
|
+
...new Set(layersOf(config, options.extra ?? [])
|
|
133
|
+
.map((layer) => layer.preset)
|
|
134
|
+
.filter((name) => name !== undefined)),
|
|
135
|
+
];
|
|
136
|
+
if (names.length === 0)
|
|
137
|
+
return config;
|
|
138
|
+
const discovered = discoverSharpenPresets(options);
|
|
139
|
+
const presets = {};
|
|
140
|
+
for (const name of names) {
|
|
141
|
+
presets[name] = readSharpenPreset(findSharpenPreset(name, discovered)).fields;
|
|
142
|
+
}
|
|
143
|
+
return { ...config, sharpenPresets: presets };
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=sharpen-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharpen-presets.js","sourceRoot":"","sources":["../../../src/commands/image-batch/sharpen-presets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,22 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
1
2
|
export declare const SHARPEN_TARGETS: readonly ["screen", "matte", "glossy"];
|
|
2
3
|
export declare const SHARPEN_AMOUNTS: readonly ["low", "standard", "high"];
|
|
4
|
+
export declare const SHARPEN_FINE_KEYS: readonly ["radius", "flat", "jagged", "threshold"];
|
|
3
5
|
export type SharpenTarget = (typeof SHARPEN_TARGETS)[number];
|
|
4
6
|
export type SharpenAmount = (typeof SHARPEN_AMOUNTS)[number];
|
|
5
|
-
export
|
|
7
|
+
export type SharpenFineKey = (typeof SHARPEN_FINE_KEYS)[number];
|
|
8
|
+
export interface SharpenFields {
|
|
9
|
+
for?: SharpenTarget;
|
|
10
|
+
amount?: SharpenAmount;
|
|
11
|
+
radius?: number;
|
|
12
|
+
flat?: number;
|
|
13
|
+
jagged?: number;
|
|
14
|
+
threshold?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface SharpenLayer extends SharpenFields {
|
|
17
|
+
preset?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SharpenSpec extends SharpenFields {
|
|
6
20
|
for: SharpenTarget;
|
|
7
21
|
amount: SharpenAmount;
|
|
8
22
|
}
|
|
@@ -10,7 +24,23 @@ export interface SharpenParams {
|
|
|
10
24
|
sigma: number;
|
|
11
25
|
m1: number;
|
|
12
26
|
m2: number;
|
|
27
|
+
x1?: number;
|
|
13
28
|
}
|
|
29
|
+
export declare const SHARPEN_RANGES: Record<SharpenFineKey, readonly [number, number]>;
|
|
30
|
+
export declare function completeSharpen(fields: SharpenFields): SharpenSpec;
|
|
14
31
|
export declare function sharpenParams(spec: SharpenSpec): SharpenParams;
|
|
15
|
-
export declare function
|
|
16
|
-
export declare function
|
|
32
|
+
export declare function describeSharpen(fields: SharpenLayer): string;
|
|
33
|
+
export declare function parseSharpenFields(object: Record<string, unknown>, at: string, allowPreset: boolean): SharpenLayer;
|
|
34
|
+
export declare function parseSharpenLayer(value: unknown, at: string): SharpenLayer;
|
|
35
|
+
export declare function expandSharpen(layer: SharpenLayer, presets: Record<string, SharpenFields> | undefined, at: string): SharpenFields;
|
|
36
|
+
export interface SharpenFlagOptions {
|
|
37
|
+
sharpen?: string;
|
|
38
|
+
sharpenFor?: string;
|
|
39
|
+
sharpenAmount?: string;
|
|
40
|
+
sharpenRadius?: string;
|
|
41
|
+
sharpenFlat?: string;
|
|
42
|
+
sharpenJagged?: string;
|
|
43
|
+
sharpenThreshold?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function parseSharpenFlags(options: SharpenFlagOptions): SharpenLayer | undefined;
|
|
46
|
+
export declare function addSharpenFlags(command: Command, withPreset?: boolean): Command;
|
|
@@ -1,32 +1,159 @@
|
|
|
1
1
|
import { ImageBatchUsageError } from './errors.js';
|
|
2
2
|
export const SHARPEN_TARGETS = ['screen', 'matte', 'glossy'];
|
|
3
3
|
export const SHARPEN_AMOUNTS = ['low', 'standard', 'high'];
|
|
4
|
+
export const SHARPEN_FINE_KEYS = ['radius', 'flat', 'jagged', 'threshold'];
|
|
5
|
+
export const SHARPEN_RANGES = {
|
|
6
|
+
radius: [0.000001, 10],
|
|
7
|
+
flat: [0, 1_000_000],
|
|
8
|
+
jagged: [0, 1_000_000],
|
|
9
|
+
threshold: [0, 1_000_000],
|
|
10
|
+
};
|
|
4
11
|
const RADIUS = { screen: 0.6, matte: 1, glossy: 1.4 };
|
|
5
12
|
const STRENGTH = {
|
|
6
13
|
low: { m1: 0.5, m2: 1.5 },
|
|
7
14
|
standard: { m1: 1, m2: 3 },
|
|
8
15
|
high: { m1: 1.8, m2: 5 },
|
|
9
16
|
};
|
|
17
|
+
const LAYER_KEYS = ['preset', 'for', 'amount', ...SHARPEN_FINE_KEYS];
|
|
18
|
+
const FIELD_KEYS = LAYER_KEYS.filter((key) => key !== 'preset');
|
|
19
|
+
export function completeSharpen(fields) {
|
|
20
|
+
return { ...fields, for: fields.for ?? 'screen', amount: fields.amount ?? 'standard' };
|
|
21
|
+
}
|
|
10
22
|
export function sharpenParams(spec) {
|
|
11
|
-
|
|
23
|
+
const strength = STRENGTH[spec.amount];
|
|
24
|
+
return {
|
|
25
|
+
sigma: spec.radius ?? RADIUS[spec.for],
|
|
26
|
+
m1: spec.flat ?? strength.m1,
|
|
27
|
+
m2: spec.jagged ?? strength.m2,
|
|
28
|
+
...(spec.threshold !== undefined ? { x1: spec.threshold } : {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function describeSharpen(fields) {
|
|
32
|
+
const parts = [];
|
|
33
|
+
if (fields.preset !== undefined)
|
|
34
|
+
parts.push(fields.preset);
|
|
35
|
+
if (fields.for !== undefined)
|
|
36
|
+
parts.push(`for ${fields.for}`);
|
|
37
|
+
if (fields.amount !== undefined)
|
|
38
|
+
parts.push(fields.amount);
|
|
39
|
+
for (const key of SHARPEN_FINE_KEYS) {
|
|
40
|
+
if (fields[key] !== undefined)
|
|
41
|
+
parts.push(`${key} ${fields[key]}`);
|
|
42
|
+
}
|
|
43
|
+
return parts.join(', ');
|
|
44
|
+
}
|
|
45
|
+
function rangeText(key) {
|
|
46
|
+
const [min, max] = SHARPEN_RANGES[key];
|
|
47
|
+
return `${min} to ${max}`;
|
|
12
48
|
}
|
|
13
|
-
|
|
14
|
-
|
|
49
|
+
function checkFine(key, value, where) {
|
|
50
|
+
const [min, max] = SHARPEN_RANGES[key];
|
|
51
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max) {
|
|
52
|
+
throw new ImageBatchUsageError(`${where}: expected a number from ${rangeText(key)}`);
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
15
55
|
}
|
|
16
|
-
export function
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
if (!
|
|
20
|
-
throw new ImageBatchUsageError(
|
|
56
|
+
export function parseSharpenFields(object, at, allowPreset) {
|
|
57
|
+
const allowed = allowPreset ? LAYER_KEYS : FIELD_KEYS;
|
|
58
|
+
for (const key of Object.keys(object)) {
|
|
59
|
+
if (!allowed.includes(key)) {
|
|
60
|
+
throw new ImageBatchUsageError(`${at}: unknown key "${key}" — expected ${allowed.join(', ')}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const layer = {};
|
|
64
|
+
if (object.preset !== undefined) {
|
|
65
|
+
if (typeof object.preset !== 'string' || object.preset === '') {
|
|
66
|
+
throw new ImageBatchUsageError(`${at}.preset: expected the name of a sharpen preset`);
|
|
67
|
+
}
|
|
68
|
+
layer.preset = object.preset;
|
|
69
|
+
}
|
|
70
|
+
if (object.for !== undefined) {
|
|
71
|
+
if (!SHARPEN_TARGETS.includes(object.for)) {
|
|
72
|
+
throw new ImageBatchUsageError(`${at}.for: expected one of ${SHARPEN_TARGETS.join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
layer.for = object.for;
|
|
75
|
+
}
|
|
76
|
+
if (object.amount !== undefined) {
|
|
77
|
+
if (!SHARPEN_AMOUNTS.includes(object.amount)) {
|
|
78
|
+
throw new ImageBatchUsageError(`${at}.amount: expected one of ${SHARPEN_AMOUNTS.join(', ')}`);
|
|
21
79
|
}
|
|
22
|
-
|
|
80
|
+
layer.amount = object.amount;
|
|
23
81
|
}
|
|
24
|
-
|
|
25
|
-
if (
|
|
26
|
-
|
|
82
|
+
for (const key of SHARPEN_FINE_KEYS) {
|
|
83
|
+
if (object[key] !== undefined)
|
|
84
|
+
layer[key] = checkFine(key, object[key], `${at}.${key}`);
|
|
85
|
+
}
|
|
86
|
+
if (Object.keys(layer).length === 0) {
|
|
87
|
+
throw new ImageBatchUsageError(`${at}: expected at least one of ${allowed.join(', ')}`);
|
|
88
|
+
}
|
|
89
|
+
return layer;
|
|
90
|
+
}
|
|
91
|
+
export function parseSharpenLayer(value, at) {
|
|
92
|
+
if (typeof value === 'string') {
|
|
93
|
+
return parseSharpenFields({ preset: value }, at, true);
|
|
94
|
+
}
|
|
95
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
96
|
+
throw new ImageBatchUsageError(`${at}: expected a preset name or an object with ${LAYER_KEYS.join(', ')}`);
|
|
97
|
+
}
|
|
98
|
+
return parseSharpenFields(value, at, true);
|
|
99
|
+
}
|
|
100
|
+
export function expandSharpen(layer, presets, at) {
|
|
101
|
+
const { preset, ...own } = layer;
|
|
102
|
+
if (preset === undefined)
|
|
103
|
+
return own;
|
|
104
|
+
const base = presets?.[preset];
|
|
105
|
+
if (!base) {
|
|
106
|
+
throw new ImageBatchUsageError(`${at}: the sharpen preset "${preset}" is not loaded — see \`devtoolz image-batch sharpen list\``);
|
|
107
|
+
}
|
|
108
|
+
return { ...base, ...own };
|
|
109
|
+
}
|
|
110
|
+
const FLAG_FINE = [
|
|
111
|
+
['radius', 'sharpenRadius'],
|
|
112
|
+
['flat', 'sharpenFlat'],
|
|
113
|
+
['jagged', 'sharpenJagged'],
|
|
114
|
+
['threshold', 'sharpenThreshold'],
|
|
115
|
+
];
|
|
116
|
+
export function parseSharpenFlags(options) {
|
|
117
|
+
const raw = {};
|
|
118
|
+
if (options.sharpen !== undefined)
|
|
119
|
+
raw.preset = options.sharpen;
|
|
120
|
+
if (options.sharpenFor !== undefined)
|
|
121
|
+
raw.for = options.sharpenFor;
|
|
122
|
+
if (options.sharpenAmount !== undefined)
|
|
123
|
+
raw.amount = options.sharpenAmount;
|
|
124
|
+
for (const [key, flag] of FLAG_FINE) {
|
|
125
|
+
const text = options[flag];
|
|
126
|
+
if (text === undefined)
|
|
127
|
+
continue;
|
|
128
|
+
const number = Number(text);
|
|
129
|
+
if (text.trim() === '' || !Number.isFinite(number)) {
|
|
130
|
+
throw new ImageBatchUsageError(`--sharpen-${key} must be a number from ${rangeText(key)}`);
|
|
27
131
|
}
|
|
28
|
-
|
|
132
|
+
raw[key] = number;
|
|
133
|
+
}
|
|
134
|
+
if (Object.keys(raw).length === 0)
|
|
135
|
+
return undefined;
|
|
136
|
+
try {
|
|
137
|
+
return parseSharpenFields(raw, 'sharpen', true);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
141
|
+
throw new ImageBatchUsageError(message
|
|
142
|
+
.replace(/^sharpen\.for/, '--sharpen-for')
|
|
143
|
+
.replace(/^sharpen\.amount/, '--sharpen-amount')
|
|
144
|
+
.replace(/^sharpen\.(radius|flat|jagged|threshold)/, '--sharpen-$1'));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export function addSharpenFlags(command, withPreset = true) {
|
|
148
|
+
if (withPreset) {
|
|
149
|
+
command.option('--sharpen <preset>', 'sharpen with a saved preset (see the sharpen command)');
|
|
29
150
|
}
|
|
30
|
-
return
|
|
151
|
+
return command
|
|
152
|
+
.option('--sharpen-for <target>', 'sharpen the result for: screen, matte or glossy')
|
|
153
|
+
.option('--sharpen-amount <amount>', 'sharpening amount: low, standard or high')
|
|
154
|
+
.option('--sharpen-radius <sigma>', 'sharpening radius (sigma), 0.000001 to 10')
|
|
155
|
+
.option('--sharpen-flat <n>', 'sharpening strength on flat areas, 0 to 1000000')
|
|
156
|
+
.option('--sharpen-jagged <n>', 'sharpening strength on sharp edges, 0 to 1000000')
|
|
157
|
+
.option('--sharpen-threshold <n>', 'edge threshold that separates flat from jagged, 0 to 1000000');
|
|
31
158
|
}
|
|
32
159
|
//# sourceMappingURL=sharpen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharpen.js","sourceRoot":"","sources":["../../../src/commands/image-batch/sharpen.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sharpen.js","sourceRoot":"","sources":["../../../src/commands/image-batch/sharpen.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharp-loader.js","sourceRoot":"","sources":["../../../src/commands/image-hash/sharp-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAA;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"sharp-loader.js","sourceRoot":"","sources":["../../../src/commands/image-hash/sharp-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { createStyle } from '../../format/style.js';
|
|
4
|
+
import { openBrowser } from './open-browser.js';
|
|
5
|
+
import { startUiServer } from './server.js';
|
|
6
|
+
function packageVersion() {
|
|
7
|
+
try {
|
|
8
|
+
const manifest = JSON.parse(readFileSync(new URL('../../../package.json', import.meta.url), 'utf8'));
|
|
9
|
+
return manifest.version ?? '';
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return '';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function parsePort(value) {
|
|
16
|
+
const port = Number(value);
|
|
17
|
+
if (!Number.isInteger(port) || port < 0 || port > 65535) {
|
|
18
|
+
throw new Error(`--port must be a whole number from 0 to 65535 (got "${value}")`);
|
|
19
|
+
}
|
|
20
|
+
return port;
|
|
21
|
+
}
|
|
22
|
+
export function registerUi(program) {
|
|
23
|
+
program
|
|
24
|
+
.command('ui')
|
|
25
|
+
.description('Start a local web interface for devtoolz modules (image-hash first) and open it in the browser')
|
|
26
|
+
.option('--port <n>', 'port to listen on (0 = pick a free one)', '0')
|
|
27
|
+
.option('--host <address>', 'address to listen on; keep the default to stay on this machine', '127.0.0.1')
|
|
28
|
+
.option('--no-open', 'do not open the browser, only print the address')
|
|
29
|
+
.option('--token <value>', 'use this access token instead of a random one (for development)')
|
|
30
|
+
.option('--cwd <path>', 'folder the interface starts in', process.cwd())
|
|
31
|
+
.option('--plain', 'disable color/banner/celebration copy, even in a real terminal', false)
|
|
32
|
+
.option('--color', 'force colored output even when piped or in CI', false)
|
|
33
|
+
.action(async (options) => {
|
|
34
|
+
const style = createStyle({ plain: options.plain, color: options.color });
|
|
35
|
+
let port;
|
|
36
|
+
try {
|
|
37
|
+
port = parsePort(options.port);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error(`error: ${error instanceof Error ? error.message : String(error)}`);
|
|
41
|
+
process.exitCode = 2;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let handle;
|
|
45
|
+
try {
|
|
46
|
+
handle = await startUiServer({
|
|
47
|
+
cwd: resolve(options.cwd),
|
|
48
|
+
host: options.host,
|
|
49
|
+
port,
|
|
50
|
+
...(options.token !== undefined ? { token: options.token } : {}),
|
|
51
|
+
version: packageVersion(),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const code = error.code;
|
|
56
|
+
console.error(code === 'EADDRINUSE'
|
|
57
|
+
? `error: port ${port} is already in use — pick another with --port, or leave it out`
|
|
58
|
+
: `error: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
process.exitCode = 1;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
console.log(`${style.success('devtoolz ui')} is running at ${style.path(handle.url)}`);
|
|
63
|
+
console.log(style.hint('Press Ctrl+C to stop.'));
|
|
64
|
+
if (options.open) {
|
|
65
|
+
if (!openBrowser(handle.url)) {
|
|
66
|
+
console.log(style.warn('Could not open the browser — open the address above yourself.'));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
await new Promise((done) => {
|
|
70
|
+
const stop = () => {
|
|
71
|
+
void handle.close().then(done);
|
|
72
|
+
};
|
|
73
|
+
process.once('SIGINT', stop);
|
|
74
|
+
process.once('SIGTERM', stop);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/commands/ui/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type SharpFactory } from '../image-hash/sharp-loader.js';
|
|
2
|
+
import { type Route } from './http.js';
|
|
3
|
+
export declare function findSharp(cwd: string): SharpFactory | null;
|
|
4
|
+
export declare function forgetSharp(): void;
|
|
5
|
+
export declare function isImagePath(path: string): boolean;
|
|
6
|
+
export declare function resolveUserPath(raw: string | null, fallback: string): string;
|
|
7
|
+
export declare const fsRoutes: Route[];
|