@hyperframes/parsers 0.7.72 → 0.7.73
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.
|
@@ -1,7 +1,62 @@
|
|
|
1
|
-
declare const COLOR_GRADING_CONTRACT_VERSION =
|
|
1
|
+
declare const COLOR_GRADING_CONTRACT_VERSION = 2;
|
|
2
2
|
declare const COLOR_GRADING_COLOR_SPACE = "rec709";
|
|
3
|
-
declare const
|
|
3
|
+
declare const COLOR_GRADING_MAX_CURVE_POINTS = 16;
|
|
4
|
+
declare const COLOR_GRADING_MAX_SECONDARIES = 4;
|
|
5
|
+
declare const COLOR_GRADING_ADVANCED_LIMITS: {
|
|
6
|
+
readonly hueDegrees: {
|
|
7
|
+
readonly min: 0;
|
|
8
|
+
readonly max: 360;
|
|
9
|
+
readonly inclusiveMax: false;
|
|
10
|
+
};
|
|
11
|
+
readonly unit: {
|
|
12
|
+
readonly min: 0;
|
|
13
|
+
readonly max: 1;
|
|
14
|
+
};
|
|
15
|
+
readonly signedUnit: {
|
|
16
|
+
readonly min: -1;
|
|
17
|
+
readonly max: 1;
|
|
18
|
+
};
|
|
19
|
+
readonly secondaryHueRange: {
|
|
20
|
+
readonly min: 0;
|
|
21
|
+
readonly max: 180;
|
|
22
|
+
};
|
|
23
|
+
readonly secondaryHueSoftness: {
|
|
24
|
+
readonly min: 0;
|
|
25
|
+
readonly max: 180;
|
|
26
|
+
};
|
|
27
|
+
readonly secondaryHueCombinedMax: 180;
|
|
28
|
+
readonly secondarySoftRangeSoftness: {
|
|
29
|
+
readonly min: 0;
|
|
30
|
+
readonly max: 0.5;
|
|
31
|
+
};
|
|
32
|
+
readonly secondaryHueShift: {
|
|
33
|
+
readonly min: -180;
|
|
34
|
+
readonly max: 180;
|
|
35
|
+
};
|
|
36
|
+
readonly effects: {
|
|
37
|
+
readonly asciiStyle: {
|
|
38
|
+
readonly min: 0;
|
|
39
|
+
readonly max: 7;
|
|
40
|
+
};
|
|
41
|
+
readonly bloom: {
|
|
42
|
+
readonly min: 0;
|
|
43
|
+
readonly max: 3;
|
|
44
|
+
};
|
|
45
|
+
readonly bloomRadius: {
|
|
46
|
+
readonly min: 1;
|
|
47
|
+
readonly max: 100;
|
|
48
|
+
};
|
|
49
|
+
readonly monoScreenShape: {
|
|
50
|
+
readonly min: 0;
|
|
51
|
+
readonly max: 4;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
declare const COLOR_GRADING_TOP_LEVEL_KEYS: readonly ["enabled", "preset", "intensity", "adjust", "wheels", "curves", "hueCurves", "secondaries", "details", "effects", "palette", "lut", "colorSpace"];
|
|
4
56
|
declare const COLOR_GRADING_ADJUST_KEYS: readonly ["exposure", "contrast", "highlights", "shadows", "whites", "blacks", "temperature", "tint", "vibrance", "saturation"];
|
|
57
|
+
declare const COLOR_GRADING_WHEEL_KEYS: readonly ["shadows", "midtones", "highlights"];
|
|
58
|
+
declare const COLOR_GRADING_CURVE_KEYS: readonly ["master", "red", "green", "blue"];
|
|
59
|
+
declare const COLOR_GRADING_HUE_CURVE_KEYS: readonly ["hueVsHue", "hueVsSaturation", "hueVsLuma"];
|
|
5
60
|
declare const COLOR_GRADING_DETAIL_KEYS: readonly ["vignette", "vignetteMidpoint", "vignetteRoundness", "vignetteFeather", "grain", "grainSize", "grainRoughness"];
|
|
6
61
|
declare const COLOR_GRADING_EFFECT_KEYS: readonly ["blur", "pixelate", "chromaBleed", "tapeDamage", "tapeTracking", "tapeNoise", "tapeSpeed", "filmArtifacts", "halftone", "halftoneSize", "twoInkPrint", "twoInkPrintSize", "ascii", "asciiSize", "asciiInvert", "asciiStyle", "asciiColor", "asciiRotation", "dither", "ditherSize", "bloom", "bloomRadius", "monoScreen", "monoScreenSize", "monoScreenAngle", "monoScreenSpread", "monoScreenShape", "monoScreenInvert", "scanlines", "scanlineCount", "scanlineSoftness", "chromaticAberration", "chromaticAngle", "crtCurvature", "digitalGlitch", "digitalGlitchColorSplit", "digitalGlitchLineTear", "digitalGlitchPixelate", "digitalGlitchBlockAmount", "digitalGlitchBlockDisplacement", "digitalGlitchBlockOpacity", "digitalGlitchSpeed", "engraving", "engravingSpacing", "engravingMinThickness", "engravingMaxThickness", "engravingAngle", "engravingContrast", "engravingSharpness", "engravingWave", "engravingWaveFrequency", "crosshatch", "crosshatchSpacing", "crosshatchThickness", "crosshatchAngle", "crosshatchContrast", "crosshatchEdges", "crosshatchLineWeight", "crosshatchWave", "crosshatchWaveFrequency", "kuwahara", "kuwaharaRadius", "kuwaharaSharpness", "kuwaharaSaturation"];
|
|
7
62
|
declare const COLOR_GRADING_LUT_KEYS: readonly ["src", "intensity"];
|
|
@@ -14,4 +69,4 @@ declare function isColorGradingVariableRef(value: unknown): value is string;
|
|
|
14
69
|
/** Browser-safe structural validation shared by Lint, CLI, and Core consumers. */
|
|
15
70
|
declare function validateColorGradingContract(value: unknown): ColorGradingContractIssue[];
|
|
16
71
|
|
|
17
|
-
export { COLOR_GRADING_ADJUST_KEYS, COLOR_GRADING_COLOR_SPACE, COLOR_GRADING_CONTRACT_VERSION, COLOR_GRADING_DETAIL_KEYS, COLOR_GRADING_EFFECT_KEYS, COLOR_GRADING_LUT_KEYS, COLOR_GRADING_TOP_LEVEL_KEYS, type ColorGradingContractIssue, isColorGradingVariableRef, validateColorGradingContract };
|
|
72
|
+
export { COLOR_GRADING_ADJUST_KEYS, COLOR_GRADING_ADVANCED_LIMITS, COLOR_GRADING_COLOR_SPACE, COLOR_GRADING_CONTRACT_VERSION, COLOR_GRADING_CURVE_KEYS, COLOR_GRADING_DETAIL_KEYS, COLOR_GRADING_EFFECT_KEYS, COLOR_GRADING_HUE_CURVE_KEYS, COLOR_GRADING_LUT_KEYS, COLOR_GRADING_MAX_CURVE_POINTS, COLOR_GRADING_MAX_SECONDARIES, COLOR_GRADING_TOP_LEVEL_KEYS, COLOR_GRADING_WHEEL_KEYS, type ColorGradingContractIssue, isColorGradingVariableRef, validateColorGradingContract };
|
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
// src/colorGradingContract.ts
|
|
2
|
-
var COLOR_GRADING_CONTRACT_VERSION =
|
|
2
|
+
var COLOR_GRADING_CONTRACT_VERSION = 2;
|
|
3
3
|
var COLOR_GRADING_COLOR_SPACE = "rec709";
|
|
4
|
+
var COLOR_GRADING_MAX_CURVE_POINTS = 16;
|
|
5
|
+
var COLOR_GRADING_MAX_SECONDARIES = 4;
|
|
6
|
+
var COLOR_GRADING_ADVANCED_LIMITS = {
|
|
7
|
+
hueDegrees: { min: 0, max: 360, inclusiveMax: false },
|
|
8
|
+
unit: { min: 0, max: 1 },
|
|
9
|
+
signedUnit: { min: -1, max: 1 },
|
|
10
|
+
secondaryHueRange: { min: 0, max: 180 },
|
|
11
|
+
secondaryHueSoftness: { min: 0, max: 180 },
|
|
12
|
+
secondaryHueCombinedMax: 180,
|
|
13
|
+
secondarySoftRangeSoftness: { min: 0, max: 0.5 },
|
|
14
|
+
secondaryHueShift: { min: -180, max: 180 },
|
|
15
|
+
effects: {
|
|
16
|
+
asciiStyle: { min: 0, max: 7 },
|
|
17
|
+
bloom: { min: 0, max: 3 },
|
|
18
|
+
bloomRadius: { min: 1, max: 100 },
|
|
19
|
+
monoScreenShape: { min: 0, max: 4 }
|
|
20
|
+
}
|
|
21
|
+
};
|
|
4
22
|
var COLOR_GRADING_TOP_LEVEL_KEYS = [
|
|
5
23
|
"enabled",
|
|
6
24
|
"preset",
|
|
7
25
|
"intensity",
|
|
8
26
|
"adjust",
|
|
27
|
+
"wheels",
|
|
28
|
+
"curves",
|
|
29
|
+
"hueCurves",
|
|
30
|
+
"secondaries",
|
|
9
31
|
"details",
|
|
10
32
|
"effects",
|
|
11
33
|
"palette",
|
|
@@ -24,6 +46,21 @@ var COLOR_GRADING_ADJUST_KEYS = [
|
|
|
24
46
|
"vibrance",
|
|
25
47
|
"saturation"
|
|
26
48
|
];
|
|
49
|
+
var COLOR_GRADING_WHEEL_KEYS = ["shadows", "midtones", "highlights"];
|
|
50
|
+
var COLOR_GRADING_CURVE_KEYS = ["master", "red", "green", "blue"];
|
|
51
|
+
var COLOR_GRADING_HUE_CURVE_KEYS = ["hueVsHue", "hueVsSaturation", "hueVsLuma"];
|
|
52
|
+
var COLOR_GRADING_WHEEL_CONTROL_KEYS = ["hue", "amount", "level"];
|
|
53
|
+
var COLOR_GRADING_SECONDARY_KEYS = ["enabled", "key", "correction"];
|
|
54
|
+
var COLOR_GRADING_SECONDARY_KEY_KEYS = ["hue", "saturation", "luma"];
|
|
55
|
+
var COLOR_GRADING_HUE_RANGE_KEYS = ["center", "range", "softness"];
|
|
56
|
+
var COLOR_GRADING_SOFT_RANGE_KEYS = ["min", "max", "softness"];
|
|
57
|
+
var COLOR_GRADING_SECONDARY_CORRECTION_KEYS = [
|
|
58
|
+
"hueShift",
|
|
59
|
+
"saturation",
|
|
60
|
+
"luma",
|
|
61
|
+
"temperature",
|
|
62
|
+
"tint"
|
|
63
|
+
];
|
|
27
64
|
var COLOR_GRADING_DETAIL_KEYS = [
|
|
28
65
|
"vignette",
|
|
29
66
|
"vignetteMidpoint",
|
|
@@ -100,14 +137,9 @@ var COLOR_GRADING_EFFECT_KEYS = [
|
|
|
100
137
|
"kuwaharaSaturation"
|
|
101
138
|
];
|
|
102
139
|
var COLOR_GRADING_LUT_KEYS = ["src", "intensity"];
|
|
103
|
-
var UNIT_LIMIT =
|
|
104
|
-
var SIGNED_UNIT_LIMIT =
|
|
105
|
-
var EFFECT_LIMIT_OVERRIDES =
|
|
106
|
-
asciiStyle: { min: 0, max: 7 },
|
|
107
|
-
bloom: { min: 0, max: 3 },
|
|
108
|
-
bloomRadius: { min: 1, max: 100 },
|
|
109
|
-
monoScreenShape: { min: 0, max: 4 }
|
|
110
|
-
};
|
|
140
|
+
var UNIT_LIMIT = COLOR_GRADING_ADVANCED_LIMITS.unit;
|
|
141
|
+
var SIGNED_UNIT_LIMIT = COLOR_GRADING_ADVANCED_LIMITS.signedUnit;
|
|
142
|
+
var EFFECT_LIMIT_OVERRIDES = COLOR_GRADING_ADVANCED_LIMITS.effects;
|
|
111
143
|
var VARIABLE_REF = /^\$(?:\{[A-Za-z0-9_.:-]+\}|[A-Za-z0-9_.:-]+)$/;
|
|
112
144
|
var PALETTE_COLOR = /^#[0-9a-f]{6}$/i;
|
|
113
145
|
var OBJECT_SECTIONS = [
|
|
@@ -150,16 +182,81 @@ function validateObject(value, path, keys, issues) {
|
|
|
150
182
|
}
|
|
151
183
|
return value;
|
|
152
184
|
}
|
|
153
|
-
function
|
|
185
|
+
function isNumberInRange(value, limit, inclusiveMax) {
|
|
186
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < limit.min) return false;
|
|
187
|
+
return inclusiveMax ? value <= limit.max : value < limit.max;
|
|
188
|
+
}
|
|
189
|
+
function validateNumericField(value, key, path, limit, issues, inclusiveMax = true) {
|
|
154
190
|
const candidate = value[key];
|
|
155
191
|
if (candidate === void 0 || isColorGradingVariableRef(candidate)) return;
|
|
156
|
-
if (
|
|
192
|
+
if (isNumberInRange(candidate, limit, inclusiveMax)) return;
|
|
193
|
+
issues.push({
|
|
194
|
+
path: path ? `${path}.${key}` : key,
|
|
195
|
+
message: `must be a finite number from ${limit.min} ${inclusiveMax ? "through" : "up to"} ${limit.max}`
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
function isFiniteTuple(value) {
|
|
199
|
+
return Array.isArray(value) && value.length === 2 && value.every((coordinate) => typeof coordinate === "number" && Number.isFinite(coordinate));
|
|
200
|
+
}
|
|
201
|
+
function validateCurve(value, path, issues) {
|
|
202
|
+
if (isColorGradingVariableRef(value)) return;
|
|
203
|
+
if (!Array.isArray(value) || value.length < 2 || value.length > COLOR_GRADING_MAX_CURVE_POINTS) {
|
|
204
|
+
issues.push({
|
|
205
|
+
path,
|
|
206
|
+
message: `must contain 2 to ${COLOR_GRADING_MAX_CURVE_POINTS} [input, output] points`
|
|
207
|
+
});
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const inputs = /* @__PURE__ */ new Set();
|
|
211
|
+
value.forEach((point, index) => {
|
|
212
|
+
if (!isFiniteTuple(point)) {
|
|
213
|
+
issues.push({ path: `${path}[${index}]`, message: "must be a finite [input, output] tuple" });
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const [input, output] = point;
|
|
217
|
+
if (input < 0 || input > 1 || output < 0 || output > 1) {
|
|
218
|
+
issues.push({ path: `${path}[${index}]`, message: "coordinates must be between 0 and 1" });
|
|
219
|
+
}
|
|
220
|
+
if (inputs.has(input)) issues.push({ path, message: `contains duplicate input ${input}` });
|
|
221
|
+
inputs.add(input);
|
|
222
|
+
});
|
|
223
|
+
const inferredPointCount = value.length + (inputs.has(0) ? 0 : 1) + (inputs.has(1) ? 0 : 1);
|
|
224
|
+
if (inferredPointCount > COLOR_GRADING_MAX_CURVE_POINTS) {
|
|
157
225
|
issues.push({
|
|
158
|
-
path
|
|
159
|
-
message: `must
|
|
226
|
+
path,
|
|
227
|
+
message: `must contain at most ${COLOR_GRADING_MAX_CURVE_POINTS} points including inferred 0 and 1 endpoints`
|
|
160
228
|
});
|
|
161
229
|
}
|
|
162
230
|
}
|
|
231
|
+
function validateHueCurve(value, path, outputMin, outputMax, issues) {
|
|
232
|
+
if (isColorGradingVariableRef(value)) return;
|
|
233
|
+
if (!Array.isArray(value) || value.length < 3 || value.length > COLOR_GRADING_MAX_CURVE_POINTS) {
|
|
234
|
+
issues.push({
|
|
235
|
+
path,
|
|
236
|
+
message: `must contain 3 to ${COLOR_GRADING_MAX_CURVE_POINTS} [hueDegrees, delta] points`
|
|
237
|
+
});
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const hues = /* @__PURE__ */ new Set();
|
|
241
|
+
value.forEach((point, index) => {
|
|
242
|
+
if (!isFiniteTuple(point)) {
|
|
243
|
+
issues.push({ path: `${path}[${index}]`, message: "must be a finite [hue, delta] tuple" });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const [hue, delta] = point;
|
|
247
|
+
if (hue < 0 || hue >= 360) {
|
|
248
|
+
issues.push({ path: `${path}[${index}][0]`, message: "must be from 0 up to 360 degrees" });
|
|
249
|
+
}
|
|
250
|
+
if (delta < outputMin || delta > outputMax) {
|
|
251
|
+
issues.push({
|
|
252
|
+
path: `${path}[${index}][1]`,
|
|
253
|
+
message: `must be between ${outputMin} and ${outputMax}`
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
if (hues.has(hue)) issues.push({ path, message: `contains duplicate hue ${hue}` });
|
|
257
|
+
hues.add(hue);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
163
260
|
function validateNumericSection(value, path, keys, limitFor, issues) {
|
|
164
261
|
for (const key of keys) validateNumericField(value, key, path, limitFor(key), issues);
|
|
165
262
|
}
|
|
@@ -243,6 +340,134 @@ function validateSection(grading, key, keys, issues) {
|
|
|
243
340
|
function validateSections(grading, issues) {
|
|
244
341
|
for (const [key, keys] of OBJECT_SECTIONS) validateSection(grading, key, keys, issues);
|
|
245
342
|
}
|
|
343
|
+
function validateWheels(value, issues) {
|
|
344
|
+
if (value === void 0 || isColorGradingVariableRef(value)) return;
|
|
345
|
+
const wheels = validateObject(value, "wheels", COLOR_GRADING_WHEEL_KEYS, issues);
|
|
346
|
+
if (!wheels) return;
|
|
347
|
+
for (const wheel of COLOR_GRADING_WHEEL_KEYS) {
|
|
348
|
+
if (wheels[wheel] === void 0) continue;
|
|
349
|
+
const path = `wheels.${wheel}`;
|
|
350
|
+
const controls = validateObject(wheels[wheel], path, COLOR_GRADING_WHEEL_CONTROL_KEYS, issues);
|
|
351
|
+
if (!controls) continue;
|
|
352
|
+
validateNumericField(
|
|
353
|
+
controls,
|
|
354
|
+
"hue",
|
|
355
|
+
path,
|
|
356
|
+
COLOR_GRADING_ADVANCED_LIMITS.hueDegrees,
|
|
357
|
+
issues,
|
|
358
|
+
COLOR_GRADING_ADVANCED_LIMITS.hueDegrees.inclusiveMax
|
|
359
|
+
);
|
|
360
|
+
validateNumericField(controls, "amount", path, UNIT_LIMIT, issues);
|
|
361
|
+
validateNumericField(controls, "level", path, SIGNED_UNIT_LIMIT, issues);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
function validateCurves(value, issues) {
|
|
365
|
+
if (value === void 0 || isColorGradingVariableRef(value)) return;
|
|
366
|
+
const curves = validateObject(value, "curves", COLOR_GRADING_CURVE_KEYS, issues);
|
|
367
|
+
if (!curves) return;
|
|
368
|
+
for (const key of COLOR_GRADING_CURVE_KEYS) {
|
|
369
|
+
if (curves[key] !== void 0) validateCurve(curves[key], `curves.${key}`, issues);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
function validateHueCurves(value, issues) {
|
|
373
|
+
if (value === void 0 || isColorGradingVariableRef(value)) return;
|
|
374
|
+
const curves = validateObject(value, "hueCurves", COLOR_GRADING_HUE_CURVE_KEYS, issues);
|
|
375
|
+
if (!curves) return;
|
|
376
|
+
const limits = {
|
|
377
|
+
hueVsHue: [-180, 180],
|
|
378
|
+
hueVsSaturation: [-1, 1],
|
|
379
|
+
hueVsLuma: [-1, 1]
|
|
380
|
+
};
|
|
381
|
+
for (const key of COLOR_GRADING_HUE_CURVE_KEYS) {
|
|
382
|
+
if (curves[key] !== void 0) {
|
|
383
|
+
validateHueCurve(curves[key], `hueCurves.${key}`, limits[key][0], limits[key][1], issues);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
function validateSoftRange(value, path, issues) {
|
|
388
|
+
const range = validateObject(value, path, COLOR_GRADING_SOFT_RANGE_KEYS, issues);
|
|
389
|
+
if (!range) return;
|
|
390
|
+
validateNumericField(range, "min", path, UNIT_LIMIT, issues);
|
|
391
|
+
validateNumericField(range, "max", path, UNIT_LIMIT, issues);
|
|
392
|
+
validateNumericField(
|
|
393
|
+
range,
|
|
394
|
+
"softness",
|
|
395
|
+
path,
|
|
396
|
+
COLOR_GRADING_ADVANCED_LIMITS.secondarySoftRangeSoftness,
|
|
397
|
+
issues
|
|
398
|
+
);
|
|
399
|
+
if (typeof range.min === "number" && typeof range.max === "number" && range.min >= range.max) {
|
|
400
|
+
issues.push({ path, message: "min must be smaller than max" });
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
function validateSecondaryHue(value, path, issues) {
|
|
404
|
+
const hue = validateObject(value, path, COLOR_GRADING_HUE_RANGE_KEYS, issues);
|
|
405
|
+
if (!hue) return;
|
|
406
|
+
validateNumericField(
|
|
407
|
+
hue,
|
|
408
|
+
"center",
|
|
409
|
+
path,
|
|
410
|
+
COLOR_GRADING_ADVANCED_LIMITS.hueDegrees,
|
|
411
|
+
issues,
|
|
412
|
+
COLOR_GRADING_ADVANCED_LIMITS.hueDegrees.inclusiveMax
|
|
413
|
+
);
|
|
414
|
+
validateNumericField(hue, "range", path, COLOR_GRADING_ADVANCED_LIMITS.secondaryHueRange, issues);
|
|
415
|
+
validateNumericField(
|
|
416
|
+
hue,
|
|
417
|
+
"softness",
|
|
418
|
+
path,
|
|
419
|
+
COLOR_GRADING_ADVANCED_LIMITS.secondaryHueSoftness,
|
|
420
|
+
issues
|
|
421
|
+
);
|
|
422
|
+
if (typeof hue.range === "number" && typeof hue.softness === "number" && hue.range + hue.softness > COLOR_GRADING_ADVANCED_LIMITS.secondaryHueCombinedMax) {
|
|
423
|
+
issues.push({
|
|
424
|
+
path,
|
|
425
|
+
message: `range plus softness must not exceed ${COLOR_GRADING_ADVANCED_LIMITS.secondaryHueCombinedMax} degrees`
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
function validateSecondaryKey(value, path, issues) {
|
|
430
|
+
const key = validateObject(value, path, COLOR_GRADING_SECONDARY_KEY_KEYS, issues);
|
|
431
|
+
if (!key) return;
|
|
432
|
+
if (key.hue !== void 0) validateSecondaryHue(key.hue, `${path}.hue`, issues);
|
|
433
|
+
if (key.saturation !== void 0) validateSoftRange(key.saturation, `${path}.saturation`, issues);
|
|
434
|
+
if (key.luma !== void 0) validateSoftRange(key.luma, `${path}.luma`, issues);
|
|
435
|
+
}
|
|
436
|
+
function validateSecondaryCorrection(value, path, issues) {
|
|
437
|
+
const correction = validateObject(value, path, COLOR_GRADING_SECONDARY_CORRECTION_KEYS, issues);
|
|
438
|
+
if (!correction) return;
|
|
439
|
+
validateNumericField(
|
|
440
|
+
correction,
|
|
441
|
+
"hueShift",
|
|
442
|
+
path,
|
|
443
|
+
COLOR_GRADING_ADVANCED_LIMITS.secondaryHueShift,
|
|
444
|
+
issues
|
|
445
|
+
);
|
|
446
|
+
for (const key of ["saturation", "luma", "temperature", "tint"]) {
|
|
447
|
+
validateNumericField(correction, key, path, SIGNED_UNIT_LIMIT, issues);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
function validateSecondary(value, index, issues) {
|
|
451
|
+
const path = `secondaries[${index}]`;
|
|
452
|
+
const secondary = validateObject(value, path, COLOR_GRADING_SECONDARY_KEYS, issues);
|
|
453
|
+
if (!secondary) return;
|
|
454
|
+
if (secondary.enabled !== void 0 && typeof secondary.enabled !== "boolean" && !isColorGradingVariableRef(secondary.enabled)) {
|
|
455
|
+
issues.push({ path: `${path}.enabled`, message: "must be a boolean" });
|
|
456
|
+
}
|
|
457
|
+
validateSecondaryKey(secondary.key, `${path}.key`, issues);
|
|
458
|
+
validateSecondaryCorrection(secondary.correction, `${path}.correction`, issues);
|
|
459
|
+
}
|
|
460
|
+
function validateSecondaries(value, issues) {
|
|
461
|
+
if (value === void 0 || isColorGradingVariableRef(value)) return;
|
|
462
|
+
if (!Array.isArray(value) || value.length > COLOR_GRADING_MAX_SECONDARIES) {
|
|
463
|
+
issues.push({
|
|
464
|
+
path: "secondaries",
|
|
465
|
+
message: `must be an array of at most ${COLOR_GRADING_MAX_SECONDARIES} selections`
|
|
466
|
+
});
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
value.forEach((secondary, index) => validateSecondary(secondary, index, issues));
|
|
470
|
+
}
|
|
246
471
|
function validateColorGradingContract(value) {
|
|
247
472
|
if (typeof value === "string") {
|
|
248
473
|
return value.trim() ? [] : [{ path: "grading", message: "is empty" }];
|
|
@@ -252,17 +477,27 @@ function validateColorGradingContract(value) {
|
|
|
252
477
|
if (!grading) return issues;
|
|
253
478
|
validateTopLevel(grading, issues);
|
|
254
479
|
validateSections(grading, issues);
|
|
480
|
+
validateWheels(grading.wheels, issues);
|
|
481
|
+
validateCurves(grading.curves, issues);
|
|
482
|
+
validateHueCurves(grading.hueCurves, issues);
|
|
483
|
+
validateSecondaries(grading.secondaries, issues);
|
|
255
484
|
validatePalette(grading.palette, issues);
|
|
256
485
|
return issues;
|
|
257
486
|
}
|
|
258
487
|
export {
|
|
259
488
|
COLOR_GRADING_ADJUST_KEYS,
|
|
489
|
+
COLOR_GRADING_ADVANCED_LIMITS,
|
|
260
490
|
COLOR_GRADING_COLOR_SPACE,
|
|
261
491
|
COLOR_GRADING_CONTRACT_VERSION,
|
|
492
|
+
COLOR_GRADING_CURVE_KEYS,
|
|
262
493
|
COLOR_GRADING_DETAIL_KEYS,
|
|
263
494
|
COLOR_GRADING_EFFECT_KEYS,
|
|
495
|
+
COLOR_GRADING_HUE_CURVE_KEYS,
|
|
264
496
|
COLOR_GRADING_LUT_KEYS,
|
|
497
|
+
COLOR_GRADING_MAX_CURVE_POINTS,
|
|
498
|
+
COLOR_GRADING_MAX_SECONDARIES,
|
|
265
499
|
COLOR_GRADING_TOP_LEVEL_KEYS,
|
|
500
|
+
COLOR_GRADING_WHEEL_KEYS,
|
|
266
501
|
isColorGradingVariableRef,
|
|
267
502
|
validateColorGradingContract
|
|
268
503
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/colorGradingContract.ts"],"sourcesContent":["export const COLOR_GRADING_CONTRACT_VERSION = 1;\nexport const COLOR_GRADING_COLOR_SPACE = \"rec709\";\n\nexport const COLOR_GRADING_TOP_LEVEL_KEYS = [\n \"enabled\",\n \"preset\",\n \"intensity\",\n \"adjust\",\n \"details\",\n \"effects\",\n \"palette\",\n \"lut\",\n \"colorSpace\",\n] as const;\n\nexport const COLOR_GRADING_ADJUST_KEYS = [\n \"exposure\",\n \"contrast\",\n \"highlights\",\n \"shadows\",\n \"whites\",\n \"blacks\",\n \"temperature\",\n \"tint\",\n \"vibrance\",\n \"saturation\",\n] as const;\n\nexport const COLOR_GRADING_DETAIL_KEYS = [\n \"vignette\",\n \"vignetteMidpoint\",\n \"vignetteRoundness\",\n \"vignetteFeather\",\n \"grain\",\n \"grainSize\",\n \"grainRoughness\",\n] as const;\n\nexport const COLOR_GRADING_EFFECT_KEYS = [\n \"blur\",\n \"pixelate\",\n \"chromaBleed\",\n \"tapeDamage\",\n \"tapeTracking\",\n \"tapeNoise\",\n \"tapeSpeed\",\n \"filmArtifacts\",\n \"halftone\",\n \"halftoneSize\",\n \"twoInkPrint\",\n \"twoInkPrintSize\",\n \"ascii\",\n \"asciiSize\",\n \"asciiInvert\",\n \"asciiStyle\",\n \"asciiColor\",\n \"asciiRotation\",\n \"dither\",\n \"ditherSize\",\n \"bloom\",\n \"bloomRadius\",\n \"monoScreen\",\n \"monoScreenSize\",\n \"monoScreenAngle\",\n \"monoScreenSpread\",\n \"monoScreenShape\",\n \"monoScreenInvert\",\n \"scanlines\",\n \"scanlineCount\",\n \"scanlineSoftness\",\n \"chromaticAberration\",\n \"chromaticAngle\",\n \"crtCurvature\",\n \"digitalGlitch\",\n \"digitalGlitchColorSplit\",\n \"digitalGlitchLineTear\",\n \"digitalGlitchPixelate\",\n \"digitalGlitchBlockAmount\",\n \"digitalGlitchBlockDisplacement\",\n \"digitalGlitchBlockOpacity\",\n \"digitalGlitchSpeed\",\n \"engraving\",\n \"engravingSpacing\",\n \"engravingMinThickness\",\n \"engravingMaxThickness\",\n \"engravingAngle\",\n \"engravingContrast\",\n \"engravingSharpness\",\n \"engravingWave\",\n \"engravingWaveFrequency\",\n \"crosshatch\",\n \"crosshatchSpacing\",\n \"crosshatchThickness\",\n \"crosshatchAngle\",\n \"crosshatchContrast\",\n \"crosshatchEdges\",\n \"crosshatchLineWeight\",\n \"crosshatchWave\",\n \"crosshatchWaveFrequency\",\n \"kuwahara\",\n \"kuwaharaRadius\",\n \"kuwaharaSharpness\",\n \"kuwaharaSaturation\",\n] as const;\n\nexport const COLOR_GRADING_LUT_KEYS = [\"src\", \"intensity\"] as const;\n\ntype NumericLimit = Readonly<{ min: number; max: number }>;\n\nconst UNIT_LIMIT: NumericLimit = { min: 0, max: 1 };\nconst SIGNED_UNIT_LIMIT: NumericLimit = { min: -1, max: 1 };\nconst EFFECT_LIMIT_OVERRIDES: Readonly<Record<string, NumericLimit>> = {\n asciiStyle: { min: 0, max: 7 },\n bloom: { min: 0, max: 3 },\n bloomRadius: { min: 1, max: 100 },\n monoScreenShape: { min: 0, max: 4 },\n};\nconst VARIABLE_REF = /^\\$(?:\\{[A-Za-z0-9_.:-]+\\}|[A-Za-z0-9_.:-]+)$/;\nconst PALETTE_COLOR = /^#[0-9a-f]{6}$/i;\n\nconst OBJECT_SECTIONS = [\n [\"adjust\", COLOR_GRADING_ADJUST_KEYS],\n [\"details\", COLOR_GRADING_DETAIL_KEYS],\n [\"effects\", COLOR_GRADING_EFFECT_KEYS],\n [\"lut\", COLOR_GRADING_LUT_KEYS],\n] as const;\n\nexport interface ColorGradingContractIssue {\n path: string;\n message: string;\n hint?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isColorGradingVariableRef(value: unknown): value is string {\n return typeof value === \"string\" && VARIABLE_REF.test(value.trim());\n}\n\nfunction unknownKeysHint(path: string, unknown: readonly string[]): string {\n if (path !== \"grading\") return `Correct or remove the unsupported \"${path}\" keys.`;\n const sections = new Set(\n unknown.flatMap((key) =>\n OBJECT_SECTIONS.filter(([, keys]) => (keys as readonly string[]).includes(key)).map(\n ([section]) => section,\n ),\n ),\n );\n return sections.size === 1\n ? `Move those controls under \"${[...sections][0]}\".`\n : \"Use only the documented media-treatment keys at the top level.\";\n}\n\nfunction validateObject(\n value: unknown,\n path: string,\n keys: readonly string[],\n issues: ColorGradingContractIssue[],\n): Record<string, unknown> | null {\n if (isColorGradingVariableRef(value)) return null;\n if (!isRecord(value)) {\n issues.push({ path, message: \"must be an object or variable reference\" });\n return null;\n }\n const allowed = new Set(keys);\n const unknown = Object.keys(value).filter((key) => !allowed.has(key));\n if (unknown.length > 0) {\n issues.push({\n path,\n message: `has unsupported key(s): ${unknown.join(\", \")}`,\n hint: unknownKeysHint(path, unknown),\n });\n }\n return value;\n}\n\nfunction validateNumericField(\n value: Record<string, unknown>,\n key: string,\n path: string,\n limit: NumericLimit,\n issues: ColorGradingContractIssue[],\n): void {\n const candidate = value[key];\n if (candidate === undefined || isColorGradingVariableRef(candidate)) return;\n if (\n typeof candidate !== \"number\" ||\n !Number.isFinite(candidate) ||\n candidate < limit.min ||\n candidate > limit.max\n ) {\n issues.push({\n path: path ? `${path}.${key}` : key,\n message: `must be a finite number from ${limit.min} through ${limit.max}`,\n });\n }\n}\n\nfunction validateNumericSection(\n value: Record<string, unknown>,\n path: string,\n keys: readonly string[],\n limitFor: (key: string) => NumericLimit,\n issues: ColorGradingContractIssue[],\n): void {\n for (const key of keys) validateNumericField(value, key, path, limitFor(key), issues);\n}\n\nfunction validatePalette(value: unknown, issues: ColorGradingContractIssue[]): void {\n if (value === undefined || value === null || isColorGradingVariableRef(value)) return;\n const hint =\n 'Use 2 to 6 colors in the intended mapping order, each written as exact \"#RRGGBB\", or use a project variable reference.';\n if (!Array.isArray(value) || value.length < 2 || value.length > 6) {\n issues.push({ path: \"palette\", message: \"must contain 2 to 6 hex colors\", hint });\n return;\n }\n value.forEach((color, index) => {\n if (typeof color !== \"string\" || !PALETTE_COLOR.test(color)) {\n issues.push({\n path: `palette[${index}]`,\n message: \"must be a six-digit hex color\",\n hint,\n });\n }\n });\n}\n\nfunction validateLut(\n value: unknown,\n object: Record<string, unknown> | null,\n issues: ColorGradingContractIssue[],\n): void {\n if (typeof value === \"string\") {\n if (!value.trim()) issues.push({ path: \"lut\", message: \"must not be empty\" });\n return;\n }\n if (!object) return;\n if (\n !isColorGradingVariableRef(object.src) &&\n (typeof object.src !== \"string\" || !object.src.trim())\n ) {\n issues.push({\n path: \"lut.src\",\n message: \"must be a non-empty string or variable reference\",\n });\n }\n validateNumericField(object, \"intensity\", \"lut\", UNIT_LIMIT, issues);\n}\n\nfunction validateEnabled(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.enabled !== undefined &&\n !isColorGradingVariableRef(grading.enabled) &&\n typeof grading.enabled !== \"boolean\"\n ) {\n issues.push({ path: \"enabled\", message: \"must be a boolean or variable reference\" });\n }\n}\n\nfunction validatePreset(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.preset !== undefined &&\n grading.preset !== null &&\n !isColorGradingVariableRef(grading.preset) &&\n (typeof grading.preset !== \"string\" || !grading.preset.trim())\n ) {\n issues.push({\n path: \"preset\",\n message: \"must be a non-empty string, null, or variable reference\",\n });\n }\n}\n\nfunction validateColorSpace(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.colorSpace !== undefined &&\n !isColorGradingVariableRef(grading.colorSpace) &&\n grading.colorSpace !== COLOR_GRADING_COLOR_SPACE\n ) {\n issues.push({\n path: \"colorSpace\",\n message: `must be \"${COLOR_GRADING_COLOR_SPACE}\" or a variable reference`,\n });\n }\n}\n\nfunction validateTopLevel(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n validateEnabled(grading, issues);\n validateNumericField(grading, \"intensity\", \"\", UNIT_LIMIT, issues);\n validatePreset(grading, issues);\n validateColorSpace(grading, issues);\n}\n\nfunction validateSection(\n grading: Record<string, unknown>,\n key: (typeof OBJECT_SECTIONS)[number][0],\n keys: readonly string[],\n issues: ColorGradingContractIssue[],\n): void {\n const section = grading[key];\n if (section === undefined || (key === \"lut\" && section === null)) return;\n if (key === \"lut\" && typeof section === \"string\") {\n validateLut(section, null, issues);\n return;\n }\n const object = validateObject(section, key, keys, issues);\n if (!object) return;\n if (key === \"lut\") return validateLut(section, object, issues);\n\n const limitFor = (control: string): NumericLimit => {\n if (key === \"adjust\" && control === \"exposure\") return { min: -2, max: 2 };\n if (key === \"adjust\" || (key === \"details\" && control === \"vignetteRoundness\")) {\n return SIGNED_UNIT_LIMIT;\n }\n return key === \"effects\" ? (EFFECT_LIMIT_OVERRIDES[control] ?? UNIT_LIMIT) : UNIT_LIMIT;\n };\n validateNumericSection(object, key, keys, limitFor, issues);\n}\n\nfunction validateSections(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n for (const [key, keys] of OBJECT_SECTIONS) validateSection(grading, key, keys, issues);\n}\n\n/** Browser-safe structural validation shared by Lint, CLI, and Core consumers. */\nexport function validateColorGradingContract(value: unknown): ColorGradingContractIssue[] {\n if (typeof value === \"string\") {\n return value.trim() ? [] : [{ path: \"grading\", message: \"is empty\" }];\n }\n\n const issues: ColorGradingContractIssue[] = [];\n const grading = validateObject(value, \"grading\", COLOR_GRADING_TOP_LEVEL_KEYS, issues);\n if (!grading) return issues;\n\n validateTopLevel(grading, issues);\n validateSections(grading, issues);\n validatePalette(grading.palette, issues);\n return issues;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/colorGradingContract.ts"],"sourcesContent":["export const COLOR_GRADING_CONTRACT_VERSION = 2;\nexport const COLOR_GRADING_COLOR_SPACE = \"rec709\";\nexport const COLOR_GRADING_MAX_CURVE_POINTS = 16;\nexport const COLOR_GRADING_MAX_SECONDARIES = 4;\nexport const COLOR_GRADING_ADVANCED_LIMITS = {\n hueDegrees: { min: 0, max: 360, inclusiveMax: false },\n unit: { min: 0, max: 1 },\n signedUnit: { min: -1, max: 1 },\n secondaryHueRange: { min: 0, max: 180 },\n secondaryHueSoftness: { min: 0, max: 180 },\n secondaryHueCombinedMax: 180,\n secondarySoftRangeSoftness: { min: 0, max: 0.5 },\n secondaryHueShift: { min: -180, max: 180 },\n effects: {\n asciiStyle: { min: 0, max: 7 },\n bloom: { min: 0, max: 3 },\n bloomRadius: { min: 1, max: 100 },\n monoScreenShape: { min: 0, max: 4 },\n },\n} as const;\n\nexport const COLOR_GRADING_TOP_LEVEL_KEYS = [\n \"enabled\",\n \"preset\",\n \"intensity\",\n \"adjust\",\n \"wheels\",\n \"curves\",\n \"hueCurves\",\n \"secondaries\",\n \"details\",\n \"effects\",\n \"palette\",\n \"lut\",\n \"colorSpace\",\n] as const;\n\nexport const COLOR_GRADING_ADJUST_KEYS = [\n \"exposure\",\n \"contrast\",\n \"highlights\",\n \"shadows\",\n \"whites\",\n \"blacks\",\n \"temperature\",\n \"tint\",\n \"vibrance\",\n \"saturation\",\n] as const;\n\nexport const COLOR_GRADING_WHEEL_KEYS = [\"shadows\", \"midtones\", \"highlights\"] as const;\nexport const COLOR_GRADING_CURVE_KEYS = [\"master\", \"red\", \"green\", \"blue\"] as const;\nexport const COLOR_GRADING_HUE_CURVE_KEYS = [\"hueVsHue\", \"hueVsSaturation\", \"hueVsLuma\"] as const;\n\nconst COLOR_GRADING_WHEEL_CONTROL_KEYS = [\"hue\", \"amount\", \"level\"] as const;\nconst COLOR_GRADING_SECONDARY_KEYS = [\"enabled\", \"key\", \"correction\"] as const;\nconst COLOR_GRADING_SECONDARY_KEY_KEYS = [\"hue\", \"saturation\", \"luma\"] as const;\nconst COLOR_GRADING_HUE_RANGE_KEYS = [\"center\", \"range\", \"softness\"] as const;\nconst COLOR_GRADING_SOFT_RANGE_KEYS = [\"min\", \"max\", \"softness\"] as const;\nconst COLOR_GRADING_SECONDARY_CORRECTION_KEYS = [\n \"hueShift\",\n \"saturation\",\n \"luma\",\n \"temperature\",\n \"tint\",\n] as const;\n\nexport const COLOR_GRADING_DETAIL_KEYS = [\n \"vignette\",\n \"vignetteMidpoint\",\n \"vignetteRoundness\",\n \"vignetteFeather\",\n \"grain\",\n \"grainSize\",\n \"grainRoughness\",\n] as const;\n\nexport const COLOR_GRADING_EFFECT_KEYS = [\n \"blur\",\n \"pixelate\",\n \"chromaBleed\",\n \"tapeDamage\",\n \"tapeTracking\",\n \"tapeNoise\",\n \"tapeSpeed\",\n \"filmArtifacts\",\n \"halftone\",\n \"halftoneSize\",\n \"twoInkPrint\",\n \"twoInkPrintSize\",\n \"ascii\",\n \"asciiSize\",\n \"asciiInvert\",\n \"asciiStyle\",\n \"asciiColor\",\n \"asciiRotation\",\n \"dither\",\n \"ditherSize\",\n \"bloom\",\n \"bloomRadius\",\n \"monoScreen\",\n \"monoScreenSize\",\n \"monoScreenAngle\",\n \"monoScreenSpread\",\n \"monoScreenShape\",\n \"monoScreenInvert\",\n \"scanlines\",\n \"scanlineCount\",\n \"scanlineSoftness\",\n \"chromaticAberration\",\n \"chromaticAngle\",\n \"crtCurvature\",\n \"digitalGlitch\",\n \"digitalGlitchColorSplit\",\n \"digitalGlitchLineTear\",\n \"digitalGlitchPixelate\",\n \"digitalGlitchBlockAmount\",\n \"digitalGlitchBlockDisplacement\",\n \"digitalGlitchBlockOpacity\",\n \"digitalGlitchSpeed\",\n \"engraving\",\n \"engravingSpacing\",\n \"engravingMinThickness\",\n \"engravingMaxThickness\",\n \"engravingAngle\",\n \"engravingContrast\",\n \"engravingSharpness\",\n \"engravingWave\",\n \"engravingWaveFrequency\",\n \"crosshatch\",\n \"crosshatchSpacing\",\n \"crosshatchThickness\",\n \"crosshatchAngle\",\n \"crosshatchContrast\",\n \"crosshatchEdges\",\n \"crosshatchLineWeight\",\n \"crosshatchWave\",\n \"crosshatchWaveFrequency\",\n \"kuwahara\",\n \"kuwaharaRadius\",\n \"kuwaharaSharpness\",\n \"kuwaharaSaturation\",\n] as const;\n\nexport const COLOR_GRADING_LUT_KEYS = [\"src\", \"intensity\"] as const;\n\ntype NumericLimit = Readonly<{ min: number; max: number }>;\n\nconst UNIT_LIMIT: NumericLimit = COLOR_GRADING_ADVANCED_LIMITS.unit;\nconst SIGNED_UNIT_LIMIT: NumericLimit = COLOR_GRADING_ADVANCED_LIMITS.signedUnit;\nconst EFFECT_LIMIT_OVERRIDES: Readonly<Record<string, NumericLimit>> =\n COLOR_GRADING_ADVANCED_LIMITS.effects;\nconst VARIABLE_REF = /^\\$(?:\\{[A-Za-z0-9_.:-]+\\}|[A-Za-z0-9_.:-]+)$/;\nconst PALETTE_COLOR = /^#[0-9a-f]{6}$/i;\n\nconst OBJECT_SECTIONS = [\n [\"adjust\", COLOR_GRADING_ADJUST_KEYS],\n [\"details\", COLOR_GRADING_DETAIL_KEYS],\n [\"effects\", COLOR_GRADING_EFFECT_KEYS],\n [\"lut\", COLOR_GRADING_LUT_KEYS],\n] as const;\n\nexport interface ColorGradingContractIssue {\n path: string;\n message: string;\n hint?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isColorGradingVariableRef(value: unknown): value is string {\n return typeof value === \"string\" && VARIABLE_REF.test(value.trim());\n}\n\nfunction unknownKeysHint(path: string, unknown: readonly string[]): string {\n if (path !== \"grading\") return `Correct or remove the unsupported \"${path}\" keys.`;\n const sections = new Set(\n unknown.flatMap((key) =>\n OBJECT_SECTIONS.filter(([, keys]) => (keys as readonly string[]).includes(key)).map(\n ([section]) => section,\n ),\n ),\n );\n return sections.size === 1\n ? `Move those controls under \"${[...sections][0]}\".`\n : \"Use only the documented media-treatment keys at the top level.\";\n}\n\nfunction validateObject(\n value: unknown,\n path: string,\n keys: readonly string[],\n issues: ColorGradingContractIssue[],\n): Record<string, unknown> | null {\n if (isColorGradingVariableRef(value)) return null;\n if (!isRecord(value)) {\n issues.push({ path, message: \"must be an object or variable reference\" });\n return null;\n }\n const allowed = new Set(keys);\n const unknown = Object.keys(value).filter((key) => !allowed.has(key));\n if (unknown.length > 0) {\n issues.push({\n path,\n message: `has unsupported key(s): ${unknown.join(\", \")}`,\n hint: unknownKeysHint(path, unknown),\n });\n }\n return value;\n}\n\nfunction isNumberInRange(value: unknown, limit: NumericLimit, inclusiveMax: boolean): boolean {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < limit.min) return false;\n return inclusiveMax ? value <= limit.max : value < limit.max;\n}\n\nfunction validateNumericField(\n value: Record<string, unknown>,\n key: string,\n path: string,\n limit: NumericLimit,\n issues: ColorGradingContractIssue[],\n inclusiveMax = true,\n): void {\n const candidate = value[key];\n if (candidate === undefined || isColorGradingVariableRef(candidate)) return;\n if (isNumberInRange(candidate, limit, inclusiveMax)) return;\n issues.push({\n path: path ? `${path}.${key}` : key,\n message: `must be a finite number from ${limit.min} ${inclusiveMax ? \"through\" : \"up to\"} ${limit.max}`,\n });\n}\n\nfunction isFiniteTuple(value: unknown): value is readonly [number, number] {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n value.every((coordinate) => typeof coordinate === \"number\" && Number.isFinite(coordinate))\n );\n}\n\nfunction validateCurve(value: unknown, path: string, issues: ColorGradingContractIssue[]): void {\n if (isColorGradingVariableRef(value)) return;\n if (!Array.isArray(value) || value.length < 2 || value.length > COLOR_GRADING_MAX_CURVE_POINTS) {\n issues.push({\n path,\n message: `must contain 2 to ${COLOR_GRADING_MAX_CURVE_POINTS} [input, output] points`,\n });\n return;\n }\n\n const inputs = new Set<number>();\n value.forEach((point, index) => {\n if (!isFiniteTuple(point)) {\n issues.push({ path: `${path}[${index}]`, message: \"must be a finite [input, output] tuple\" });\n return;\n }\n const [input, output] = point;\n if (input < 0 || input > 1 || output < 0 || output > 1) {\n issues.push({ path: `${path}[${index}]`, message: \"coordinates must be between 0 and 1\" });\n }\n if (inputs.has(input)) issues.push({ path, message: `contains duplicate input ${input}` });\n inputs.add(input);\n });\n\n const inferredPointCount = value.length + (inputs.has(0) ? 0 : 1) + (inputs.has(1) ? 0 : 1);\n if (inferredPointCount > COLOR_GRADING_MAX_CURVE_POINTS) {\n issues.push({\n path,\n message: `must contain at most ${COLOR_GRADING_MAX_CURVE_POINTS} points including inferred 0 and 1 endpoints`,\n });\n }\n}\n\nfunction validateHueCurve(\n value: unknown,\n path: string,\n outputMin: number,\n outputMax: number,\n issues: ColorGradingContractIssue[],\n): void {\n if (isColorGradingVariableRef(value)) return;\n if (!Array.isArray(value) || value.length < 3 || value.length > COLOR_GRADING_MAX_CURVE_POINTS) {\n issues.push({\n path,\n message: `must contain 3 to ${COLOR_GRADING_MAX_CURVE_POINTS} [hueDegrees, delta] points`,\n });\n return;\n }\n\n const hues = new Set<number>();\n value.forEach((point, index) => {\n if (!isFiniteTuple(point)) {\n issues.push({ path: `${path}[${index}]`, message: \"must be a finite [hue, delta] tuple\" });\n return;\n }\n const [hue, delta] = point;\n if (hue < 0 || hue >= 360) {\n issues.push({ path: `${path}[${index}][0]`, message: \"must be from 0 up to 360 degrees\" });\n }\n if (delta < outputMin || delta > outputMax) {\n issues.push({\n path: `${path}[${index}][1]`,\n message: `must be between ${outputMin} and ${outputMax}`,\n });\n }\n if (hues.has(hue)) issues.push({ path, message: `contains duplicate hue ${hue}` });\n hues.add(hue);\n });\n}\n\nfunction validateNumericSection(\n value: Record<string, unknown>,\n path: string,\n keys: readonly string[],\n limitFor: (key: string) => NumericLimit,\n issues: ColorGradingContractIssue[],\n): void {\n for (const key of keys) validateNumericField(value, key, path, limitFor(key), issues);\n}\n\nfunction validatePalette(value: unknown, issues: ColorGradingContractIssue[]): void {\n if (value === undefined || value === null || isColorGradingVariableRef(value)) return;\n const hint =\n 'Use 2 to 6 colors in the intended mapping order, each written as exact \"#RRGGBB\", or use a project variable reference.';\n if (!Array.isArray(value) || value.length < 2 || value.length > 6) {\n issues.push({ path: \"palette\", message: \"must contain 2 to 6 hex colors\", hint });\n return;\n }\n value.forEach((color, index) => {\n if (typeof color !== \"string\" || !PALETTE_COLOR.test(color)) {\n issues.push({\n path: `palette[${index}]`,\n message: \"must be a six-digit hex color\",\n hint,\n });\n }\n });\n}\n\nfunction validateLut(\n value: unknown,\n object: Record<string, unknown> | null,\n issues: ColorGradingContractIssue[],\n): void {\n if (typeof value === \"string\") {\n if (!value.trim()) issues.push({ path: \"lut\", message: \"must not be empty\" });\n return;\n }\n if (!object) return;\n if (\n !isColorGradingVariableRef(object.src) &&\n (typeof object.src !== \"string\" || !object.src.trim())\n ) {\n issues.push({\n path: \"lut.src\",\n message: \"must be a non-empty string or variable reference\",\n });\n }\n validateNumericField(object, \"intensity\", \"lut\", UNIT_LIMIT, issues);\n}\n\nfunction validateEnabled(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.enabled !== undefined &&\n !isColorGradingVariableRef(grading.enabled) &&\n typeof grading.enabled !== \"boolean\"\n ) {\n issues.push({ path: \"enabled\", message: \"must be a boolean or variable reference\" });\n }\n}\n\nfunction validatePreset(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.preset !== undefined &&\n grading.preset !== null &&\n !isColorGradingVariableRef(grading.preset) &&\n (typeof grading.preset !== \"string\" || !grading.preset.trim())\n ) {\n issues.push({\n path: \"preset\",\n message: \"must be a non-empty string, null, or variable reference\",\n });\n }\n}\n\nfunction validateColorSpace(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.colorSpace !== undefined &&\n !isColorGradingVariableRef(grading.colorSpace) &&\n grading.colorSpace !== COLOR_GRADING_COLOR_SPACE\n ) {\n issues.push({\n path: \"colorSpace\",\n message: `must be \"${COLOR_GRADING_COLOR_SPACE}\" or a variable reference`,\n });\n }\n}\n\nfunction validateTopLevel(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n validateEnabled(grading, issues);\n validateNumericField(grading, \"intensity\", \"\", UNIT_LIMIT, issues);\n validatePreset(grading, issues);\n validateColorSpace(grading, issues);\n}\n\nfunction validateSection(\n grading: Record<string, unknown>,\n key: (typeof OBJECT_SECTIONS)[number][0],\n keys: readonly string[],\n issues: ColorGradingContractIssue[],\n): void {\n const section = grading[key];\n if (section === undefined || (key === \"lut\" && section === null)) return;\n if (key === \"lut\" && typeof section === \"string\") {\n validateLut(section, null, issues);\n return;\n }\n const object = validateObject(section, key, keys, issues);\n if (!object) return;\n if (key === \"lut\") return validateLut(section, object, issues);\n\n const limitFor = (control: string): NumericLimit => {\n if (key === \"adjust\" && control === \"exposure\") return { min: -2, max: 2 };\n if (key === \"adjust\" || (key === \"details\" && control === \"vignetteRoundness\")) {\n return SIGNED_UNIT_LIMIT;\n }\n return key === \"effects\" ? (EFFECT_LIMIT_OVERRIDES[control] ?? UNIT_LIMIT) : UNIT_LIMIT;\n };\n validateNumericSection(object, key, keys, limitFor, issues);\n}\n\nfunction validateSections(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n for (const [key, keys] of OBJECT_SECTIONS) validateSection(grading, key, keys, issues);\n}\n\nfunction validateWheels(value: unknown, issues: ColorGradingContractIssue[]): void {\n if (value === undefined || isColorGradingVariableRef(value)) return;\n const wheels = validateObject(value, \"wheels\", COLOR_GRADING_WHEEL_KEYS, issues);\n if (!wheels) return;\n\n for (const wheel of COLOR_GRADING_WHEEL_KEYS) {\n if (wheels[wheel] === undefined) continue;\n const path = `wheels.${wheel}`;\n const controls = validateObject(wheels[wheel], path, COLOR_GRADING_WHEEL_CONTROL_KEYS, issues);\n if (!controls) continue;\n validateNumericField(\n controls,\n \"hue\",\n path,\n COLOR_GRADING_ADVANCED_LIMITS.hueDegrees,\n issues,\n COLOR_GRADING_ADVANCED_LIMITS.hueDegrees.inclusiveMax,\n );\n validateNumericField(controls, \"amount\", path, UNIT_LIMIT, issues);\n validateNumericField(controls, \"level\", path, SIGNED_UNIT_LIMIT, issues);\n }\n}\n\nfunction validateCurves(value: unknown, issues: ColorGradingContractIssue[]): void {\n if (value === undefined || isColorGradingVariableRef(value)) return;\n const curves = validateObject(value, \"curves\", COLOR_GRADING_CURVE_KEYS, issues);\n if (!curves) return;\n for (const key of COLOR_GRADING_CURVE_KEYS) {\n if (curves[key] !== undefined) validateCurve(curves[key], `curves.${key}`, issues);\n }\n}\n\nfunction validateHueCurves(value: unknown, issues: ColorGradingContractIssue[]): void {\n if (value === undefined || isColorGradingVariableRef(value)) return;\n const curves = validateObject(value, \"hueCurves\", COLOR_GRADING_HUE_CURVE_KEYS, issues);\n if (!curves) return;\n const limits = {\n hueVsHue: [-180, 180],\n hueVsSaturation: [-1, 1],\n hueVsLuma: [-1, 1],\n } as const;\n for (const key of COLOR_GRADING_HUE_CURVE_KEYS) {\n if (curves[key] !== undefined) {\n validateHueCurve(curves[key], `hueCurves.${key}`, limits[key][0], limits[key][1], issues);\n }\n }\n}\n\nfunction validateSoftRange(\n value: unknown,\n path: string,\n issues: ColorGradingContractIssue[],\n): void {\n const range = validateObject(value, path, COLOR_GRADING_SOFT_RANGE_KEYS, issues);\n if (!range) return;\n validateNumericField(range, \"min\", path, UNIT_LIMIT, issues);\n validateNumericField(range, \"max\", path, UNIT_LIMIT, issues);\n validateNumericField(\n range,\n \"softness\",\n path,\n COLOR_GRADING_ADVANCED_LIMITS.secondarySoftRangeSoftness,\n issues,\n );\n if (typeof range.min === \"number\" && typeof range.max === \"number\" && range.min >= range.max) {\n issues.push({ path, message: \"min must be smaller than max\" });\n }\n}\n\nfunction validateSecondaryHue(\n value: unknown,\n path: string,\n issues: ColorGradingContractIssue[],\n): void {\n const hue = validateObject(value, path, COLOR_GRADING_HUE_RANGE_KEYS, issues);\n if (!hue) return;\n validateNumericField(\n hue,\n \"center\",\n path,\n COLOR_GRADING_ADVANCED_LIMITS.hueDegrees,\n issues,\n COLOR_GRADING_ADVANCED_LIMITS.hueDegrees.inclusiveMax,\n );\n validateNumericField(hue, \"range\", path, COLOR_GRADING_ADVANCED_LIMITS.secondaryHueRange, issues);\n validateNumericField(\n hue,\n \"softness\",\n path,\n COLOR_GRADING_ADVANCED_LIMITS.secondaryHueSoftness,\n issues,\n );\n if (\n typeof hue.range === \"number\" &&\n typeof hue.softness === \"number\" &&\n hue.range + hue.softness > COLOR_GRADING_ADVANCED_LIMITS.secondaryHueCombinedMax\n ) {\n issues.push({\n path,\n message: `range plus softness must not exceed ${COLOR_GRADING_ADVANCED_LIMITS.secondaryHueCombinedMax} degrees`,\n });\n }\n}\n\nfunction validateSecondaryKey(\n value: unknown,\n path: string,\n issues: ColorGradingContractIssue[],\n): void {\n const key = validateObject(value, path, COLOR_GRADING_SECONDARY_KEY_KEYS, issues);\n if (!key) return;\n if (key.hue !== undefined) validateSecondaryHue(key.hue, `${path}.hue`, issues);\n if (key.saturation !== undefined) validateSoftRange(key.saturation, `${path}.saturation`, issues);\n if (key.luma !== undefined) validateSoftRange(key.luma, `${path}.luma`, issues);\n}\n\nfunction validateSecondaryCorrection(\n value: unknown,\n path: string,\n issues: ColorGradingContractIssue[],\n): void {\n const correction = validateObject(value, path, COLOR_GRADING_SECONDARY_CORRECTION_KEYS, issues);\n if (!correction) return;\n validateNumericField(\n correction,\n \"hueShift\",\n path,\n COLOR_GRADING_ADVANCED_LIMITS.secondaryHueShift,\n issues,\n );\n for (const key of [\"saturation\", \"luma\", \"temperature\", \"tint\"] as const) {\n validateNumericField(correction, key, path, SIGNED_UNIT_LIMIT, issues);\n }\n}\n\nfunction validateSecondary(\n value: unknown,\n index: number,\n issues: ColorGradingContractIssue[],\n): void {\n const path = `secondaries[${index}]`;\n const secondary = validateObject(value, path, COLOR_GRADING_SECONDARY_KEYS, issues);\n if (!secondary) return;\n if (\n secondary.enabled !== undefined &&\n typeof secondary.enabled !== \"boolean\" &&\n !isColorGradingVariableRef(secondary.enabled)\n ) {\n issues.push({ path: `${path}.enabled`, message: \"must be a boolean\" });\n }\n validateSecondaryKey(secondary.key, `${path}.key`, issues);\n validateSecondaryCorrection(secondary.correction, `${path}.correction`, issues);\n}\n\nfunction validateSecondaries(value: unknown, issues: ColorGradingContractIssue[]): void {\n if (value === undefined || isColorGradingVariableRef(value)) return;\n if (!Array.isArray(value) || value.length > COLOR_GRADING_MAX_SECONDARIES) {\n issues.push({\n path: \"secondaries\",\n message: `must be an array of at most ${COLOR_GRADING_MAX_SECONDARIES} selections`,\n });\n return;\n }\n\n value.forEach((secondary, index) => validateSecondary(secondary, index, issues));\n}\n\n/** Browser-safe structural validation shared by Lint, CLI, and Core consumers. */\nexport function validateColorGradingContract(value: unknown): ColorGradingContractIssue[] {\n if (typeof value === \"string\") {\n return value.trim() ? [] : [{ path: \"grading\", message: \"is empty\" }];\n }\n\n const issues: ColorGradingContractIssue[] = [];\n const grading = validateObject(value, \"grading\", COLOR_GRADING_TOP_LEVEL_KEYS, issues);\n if (!grading) return issues;\n\n validateTopLevel(grading, issues);\n validateSections(grading, issues);\n validateWheels(grading.wheels, issues);\n validateCurves(grading.curves, issues);\n validateHueCurves(grading.hueCurves, issues);\n validateSecondaries(grading.secondaries, issues);\n validatePalette(grading.palette, issues);\n return issues;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperframes/parsers",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.73",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/heygen-com/hyperframes",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"tsx": "^4.21.0",
|
|
99
99
|
"typescript": "^5.0.0",
|
|
100
100
|
"vitest": "^3.2.4",
|
|
101
|
-
"@hyperframes/core": "0.7.
|
|
101
|
+
"@hyperframes/core": "0.7.73"
|
|
102
102
|
},
|
|
103
103
|
"scripts": {
|
|
104
104
|
"build": "tsup",
|