@hyperframes/parsers 0.7.69 → 0.7.71

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.
@@ -0,0 +1,17 @@
1
+ declare const COLOR_GRADING_CONTRACT_VERSION = 1;
2
+ declare const COLOR_GRADING_COLOR_SPACE = "rec709";
3
+ declare const COLOR_GRADING_TOP_LEVEL_KEYS: readonly ["enabled", "preset", "intensity", "adjust", "details", "effects", "palette", "lut", "colorSpace"];
4
+ declare const COLOR_GRADING_ADJUST_KEYS: readonly ["exposure", "contrast", "highlights", "shadows", "whites", "blacks", "temperature", "tint", "vibrance", "saturation"];
5
+ declare const COLOR_GRADING_DETAIL_KEYS: readonly ["vignette", "vignetteMidpoint", "vignetteRoundness", "vignetteFeather", "grain", "grainSize", "grainRoughness"];
6
+ 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
+ declare const COLOR_GRADING_LUT_KEYS: readonly ["src", "intensity"];
8
+ interface ColorGradingContractIssue {
9
+ path: string;
10
+ message: string;
11
+ hint?: string;
12
+ }
13
+ declare function isColorGradingVariableRef(value: unknown): value is string;
14
+ /** Browser-safe structural validation shared by Lint, CLI, and Core consumers. */
15
+ declare function validateColorGradingContract(value: unknown): ColorGradingContractIssue[];
16
+
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 };
@@ -0,0 +1,249 @@
1
+ // src/colorGradingContract.ts
2
+ var COLOR_GRADING_CONTRACT_VERSION = 1;
3
+ var COLOR_GRADING_COLOR_SPACE = "rec709";
4
+ var COLOR_GRADING_TOP_LEVEL_KEYS = [
5
+ "enabled",
6
+ "preset",
7
+ "intensity",
8
+ "adjust",
9
+ "details",
10
+ "effects",
11
+ "palette",
12
+ "lut",
13
+ "colorSpace"
14
+ ];
15
+ var COLOR_GRADING_ADJUST_KEYS = [
16
+ "exposure",
17
+ "contrast",
18
+ "highlights",
19
+ "shadows",
20
+ "whites",
21
+ "blacks",
22
+ "temperature",
23
+ "tint",
24
+ "vibrance",
25
+ "saturation"
26
+ ];
27
+ var COLOR_GRADING_DETAIL_KEYS = [
28
+ "vignette",
29
+ "vignetteMidpoint",
30
+ "vignetteRoundness",
31
+ "vignetteFeather",
32
+ "grain",
33
+ "grainSize",
34
+ "grainRoughness"
35
+ ];
36
+ var COLOR_GRADING_EFFECT_KEYS = [
37
+ "blur",
38
+ "pixelate",
39
+ "chromaBleed",
40
+ "tapeDamage",
41
+ "tapeTracking",
42
+ "tapeNoise",
43
+ "tapeSpeed",
44
+ "filmArtifacts",
45
+ "halftone",
46
+ "halftoneSize",
47
+ "twoInkPrint",
48
+ "twoInkPrintSize",
49
+ "ascii",
50
+ "asciiSize",
51
+ "asciiInvert",
52
+ "asciiStyle",
53
+ "asciiColor",
54
+ "asciiRotation",
55
+ "dither",
56
+ "ditherSize",
57
+ "bloom",
58
+ "bloomRadius",
59
+ "monoScreen",
60
+ "monoScreenSize",
61
+ "monoScreenAngle",
62
+ "monoScreenSpread",
63
+ "monoScreenShape",
64
+ "monoScreenInvert",
65
+ "scanlines",
66
+ "scanlineCount",
67
+ "scanlineSoftness",
68
+ "chromaticAberration",
69
+ "chromaticAngle",
70
+ "crtCurvature",
71
+ "digitalGlitch",
72
+ "digitalGlitchColorSplit",
73
+ "digitalGlitchLineTear",
74
+ "digitalGlitchPixelate",
75
+ "digitalGlitchBlockAmount",
76
+ "digitalGlitchBlockDisplacement",
77
+ "digitalGlitchBlockOpacity",
78
+ "digitalGlitchSpeed",
79
+ "engraving",
80
+ "engravingSpacing",
81
+ "engravingMinThickness",
82
+ "engravingMaxThickness",
83
+ "engravingAngle",
84
+ "engravingContrast",
85
+ "engravingSharpness",
86
+ "engravingWave",
87
+ "engravingWaveFrequency",
88
+ "crosshatch",
89
+ "crosshatchSpacing",
90
+ "crosshatchThickness",
91
+ "crosshatchAngle",
92
+ "crosshatchContrast",
93
+ "crosshatchEdges",
94
+ "crosshatchLineWeight",
95
+ "crosshatchWave",
96
+ "crosshatchWaveFrequency",
97
+ "kuwahara",
98
+ "kuwaharaRadius",
99
+ "kuwaharaSharpness",
100
+ "kuwaharaSaturation"
101
+ ];
102
+ var COLOR_GRADING_LUT_KEYS = ["src", "intensity"];
103
+ var UNIT_LIMIT = { min: 0, max: 1 };
104
+ var SIGNED_UNIT_LIMIT = { min: -1, max: 1 };
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
+ };
111
+ var VARIABLE_REF = /^\$(?:\{[A-Za-z0-9_.:-]+\}|[A-Za-z0-9_.:-]+)$/;
112
+ var PALETTE_COLOR = /^#[0-9a-f]{6}$/i;
113
+ var OBJECT_SECTIONS = [
114
+ ["adjust", COLOR_GRADING_ADJUST_KEYS],
115
+ ["details", COLOR_GRADING_DETAIL_KEYS],
116
+ ["effects", COLOR_GRADING_EFFECT_KEYS],
117
+ ["lut", COLOR_GRADING_LUT_KEYS]
118
+ ];
119
+ function isRecord(value) {
120
+ return typeof value === "object" && value !== null && !Array.isArray(value);
121
+ }
122
+ function isColorGradingVariableRef(value) {
123
+ return typeof value === "string" && VARIABLE_REF.test(value.trim());
124
+ }
125
+ function validateObject(value, path, keys, issues) {
126
+ if (isColorGradingVariableRef(value)) return null;
127
+ if (!isRecord(value)) {
128
+ issues.push({ path, message: "must be an object or variable reference" });
129
+ return null;
130
+ }
131
+ const allowed = new Set(keys);
132
+ const unknown = Object.keys(value).filter((key) => !allowed.has(key));
133
+ if (unknown.length > 0) {
134
+ issues.push({ path, message: `has unsupported key(s): ${unknown.join(", ")}` });
135
+ }
136
+ return value;
137
+ }
138
+ function validateNumericField(value, key, path, limit, issues) {
139
+ const candidate = value[key];
140
+ if (candidate === void 0 || isColorGradingVariableRef(candidate)) return;
141
+ if (typeof candidate !== "number" || !Number.isFinite(candidate) || candidate < limit.min || candidate > limit.max) {
142
+ issues.push({
143
+ path: path ? `${path}.${key}` : key,
144
+ message: `must be a finite number from ${limit.min} through ${limit.max}`
145
+ });
146
+ }
147
+ }
148
+ function validateNumericSection(value, path, keys, limitFor, issues) {
149
+ for (const key of keys) validateNumericField(value, key, path, limitFor(key), issues);
150
+ }
151
+ function validatePalette(value, issues) {
152
+ if (value === void 0 || value === null || isColorGradingVariableRef(value)) return;
153
+ if (!Array.isArray(value) || value.length < 2 || value.length > 6) {
154
+ issues.push({ path: "palette", message: "must contain 2 to 6 hex colors" });
155
+ return;
156
+ }
157
+ value.forEach((color, index) => {
158
+ if (typeof color !== "string" || !PALETTE_COLOR.test(color)) {
159
+ issues.push({ path: `palette[${index}]`, message: "must be a six-digit hex color" });
160
+ }
161
+ });
162
+ }
163
+ function validateLut(value, object, issues) {
164
+ if (typeof value === "string") {
165
+ if (!value.trim()) issues.push({ path: "lut", message: "must not be empty" });
166
+ return;
167
+ }
168
+ if (!object) return;
169
+ if (!isColorGradingVariableRef(object.src) && (typeof object.src !== "string" || !object.src.trim())) {
170
+ issues.push({
171
+ path: "lut.src",
172
+ message: "must be a non-empty string or variable reference"
173
+ });
174
+ }
175
+ validateNumericField(object, "intensity", "lut", UNIT_LIMIT, issues);
176
+ }
177
+ function validateEnabled(grading, issues) {
178
+ if (grading.enabled !== void 0 && !isColorGradingVariableRef(grading.enabled) && typeof grading.enabled !== "boolean") {
179
+ issues.push({ path: "enabled", message: "must be a boolean or variable reference" });
180
+ }
181
+ }
182
+ function validatePreset(grading, issues) {
183
+ if (grading.preset !== void 0 && grading.preset !== null && !isColorGradingVariableRef(grading.preset) && (typeof grading.preset !== "string" || !grading.preset.trim())) {
184
+ issues.push({
185
+ path: "preset",
186
+ message: "must be a non-empty string, null, or variable reference"
187
+ });
188
+ }
189
+ }
190
+ function validateColorSpace(grading, issues) {
191
+ if (grading.colorSpace !== void 0 && !isColorGradingVariableRef(grading.colorSpace) && grading.colorSpace !== COLOR_GRADING_COLOR_SPACE) {
192
+ issues.push({
193
+ path: "colorSpace",
194
+ message: `must be "${COLOR_GRADING_COLOR_SPACE}" or a variable reference`
195
+ });
196
+ }
197
+ }
198
+ function validateTopLevel(grading, issues) {
199
+ validateEnabled(grading, issues);
200
+ validateNumericField(grading, "intensity", "", UNIT_LIMIT, issues);
201
+ validatePreset(grading, issues);
202
+ validateColorSpace(grading, issues);
203
+ }
204
+ function validateSection(grading, key, keys, issues) {
205
+ const section = grading[key];
206
+ if (section === void 0 || key === "lut" && section === null) return;
207
+ if (key === "lut" && typeof section === "string") {
208
+ validateLut(section, null, issues);
209
+ return;
210
+ }
211
+ const object = validateObject(section, key, keys, issues);
212
+ if (!object) return;
213
+ if (key === "lut") return validateLut(section, object, issues);
214
+ const limitFor = (control) => {
215
+ if (key === "adjust" && control === "exposure") return { min: -2, max: 2 };
216
+ if (key === "adjust" || key === "details" && control === "vignetteRoundness") {
217
+ return SIGNED_UNIT_LIMIT;
218
+ }
219
+ return key === "effects" ? EFFECT_LIMIT_OVERRIDES[control] ?? UNIT_LIMIT : UNIT_LIMIT;
220
+ };
221
+ validateNumericSection(object, key, keys, limitFor, issues);
222
+ }
223
+ function validateSections(grading, issues) {
224
+ for (const [key, keys] of OBJECT_SECTIONS) validateSection(grading, key, keys, issues);
225
+ }
226
+ function validateColorGradingContract(value) {
227
+ if (typeof value === "string") {
228
+ return value.trim() ? [] : [{ path: "grading", message: "is empty" }];
229
+ }
230
+ const issues = [];
231
+ const grading = validateObject(value, "grading", COLOR_GRADING_TOP_LEVEL_KEYS, issues);
232
+ if (!grading) return issues;
233
+ validateTopLevel(grading, issues);
234
+ validateSections(grading, issues);
235
+ validatePalette(grading.palette, issues);
236
+ return issues;
237
+ }
238
+ export {
239
+ COLOR_GRADING_ADJUST_KEYS,
240
+ COLOR_GRADING_COLOR_SPACE,
241
+ COLOR_GRADING_CONTRACT_VERSION,
242
+ COLOR_GRADING_DETAIL_KEYS,
243
+ COLOR_GRADING_EFFECT_KEYS,
244
+ COLOR_GRADING_LUT_KEYS,
245
+ COLOR_GRADING_TOP_LEVEL_KEYS,
246
+ isColorGradingVariableRef,
247
+ validateColorGradingContract
248
+ };
249
+ //# sourceMappingURL=colorGradingContract.js.map
@@ -0,0 +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 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({ path, message: `has unsupported key(s): ${unknown.join(\", \")}` });\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 if (!Array.isArray(value) || value.length < 2 || value.length > 6) {\n issues.push({ path: \"palette\", message: \"must contain 2 to 6 hex colors\" });\n return;\n }\n value.forEach((color, index) => {\n if (typeof color !== \"string\" || !PALETTE_COLOR.test(color)) {\n issues.push({ path: `palette[${index}]`, message: \"must be a six-digit hex color\" });\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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperframes/parsers",
3
- "version": "0.7.69",
3
+ "version": "0.7.71",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/heygen-com/hyperframes",
@@ -64,6 +64,10 @@
64
64
  "import": "./dist/compositionContract.js",
65
65
  "types": "./dist/compositionContract.d.ts"
66
66
  },
67
+ "./color-grading-contract": {
68
+ "import": "./dist/colorGradingContract.js",
69
+ "types": "./dist/colorGradingContract.d.ts"
70
+ },
67
71
  "./sub-composition-validity": {
68
72
  "import": "./dist/subCompositionValidity.js",
69
73
  "types": "./dist/subCompositionValidity.d.ts"
@@ -94,7 +98,7 @@
94
98
  "tsx": "^4.21.0",
95
99
  "typescript": "^5.0.0",
96
100
  "vitest": "^3.2.4",
97
- "@hyperframes/core": "0.7.69"
101
+ "@hyperframes/core": "0.7.71"
98
102
  },
99
103
  "scripts": {
100
104
  "build": "tsup",