@memberjunction/video-studio-render-worker 0.0.1-seed.1 → 6.2.0-edge.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +139 -4
  3. package/assets/fonts/Inter-OFL.txt +93 -0
  4. package/assets/fonts/Inter-Regular.ttf +0 -0
  5. package/assets/fonts/JetBrainsMono-OFL.txt +93 -0
  6. package/assets/fonts/JetBrainsMono-Regular.ttf +0 -0
  7. package/dist/backend.d.ts +201 -0
  8. package/dist/backend.d.ts.map +1 -0
  9. package/dist/backend.js +205 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/bundle.d.ts +112 -0
  12. package/dist/bundle.d.ts.map +1 -0
  13. package/dist/bundle.js +433 -0
  14. package/dist/bundle.js.map +1 -0
  15. package/dist/checks/dom-rules.d.ts +57 -0
  16. package/dist/checks/dom-rules.d.ts.map +1 -0
  17. package/dist/checks/dom-rules.js +205 -0
  18. package/dist/checks/dom-rules.js.map +1 -0
  19. package/dist/checks/hyperframes-check.d.ts +37 -0
  20. package/dist/checks/hyperframes-check.d.ts.map +1 -0
  21. package/dist/checks/hyperframes-check.js +161 -0
  22. package/dist/checks/hyperframes-check.js.map +1 -0
  23. package/dist/checks/static-checks.d.ts +46 -0
  24. package/dist/checks/static-checks.d.ts.map +1 -0
  25. package/dist/checks/static-checks.js +681 -0
  26. package/dist/checks/static-checks.js.map +1 -0
  27. package/dist/hyperframes-backend.d.ts +53 -0
  28. package/dist/hyperframes-backend.d.ts.map +1 -0
  29. package/dist/hyperframes-backend.js +733 -0
  30. package/dist/hyperframes-backend.js.map +1 -0
  31. package/dist/index.d.ts +20 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +20 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/jobs.d.ts +88 -0
  36. package/dist/jobs.d.ts.map +1 -0
  37. package/dist/jobs.js +650 -0
  38. package/dist/jobs.js.map +1 -0
  39. package/dist/lint-gate.d.ts +21 -0
  40. package/dist/lint-gate.d.ts.map +1 -0
  41. package/dist/lint-gate.js +528 -0
  42. package/dist/lint-gate.js.map +1 -0
  43. package/dist/main.d.ts +47 -0
  44. package/dist/main.d.ts.map +1 -0
  45. package/dist/main.js +195 -0
  46. package/dist/main.js.map +1 -0
  47. package/dist/one-shot.d.ts +37 -0
  48. package/dist/one-shot.d.ts.map +1 -0
  49. package/dist/one-shot.js +228 -0
  50. package/dist/one-shot.js.map +1 -0
  51. package/dist/preamble.d.ts +69 -0
  52. package/dist/preamble.d.ts.map +1 -0
  53. package/dist/preamble.js +331 -0
  54. package/dist/preamble.js.map +1 -0
  55. package/dist/server.d.ts +75 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +526 -0
  58. package/dist/server.js.map +1 -0
  59. package/package.json +43 -5
@@ -0,0 +1,205 @@
1
+ import { ExtractNumericLiteralTokens, } from '@memberjunction/video-studio-core';
2
+ import { IsAllowedNumericLiteral } from './static-checks.js';
3
+ /** Check issue code emitted when a rendered text box extends outside the format's safe area. */
4
+ export const MJ_SAFE_AREA_CODE = 'MJ_SAFE_AREA';
5
+ /** Check issue code emitted when rendered text has `FontSizePx` below the minimum threshold. */
6
+ export const MJ_MIN_TEXT_SIZE_CODE = 'MJ_MIN_TEXT_SIZE';
7
+ /** Check issue code emitted when rendered text outside `data-mj-bound` contains an unapproved numeric literal. */
8
+ export const MJ_UNBOUND_LITERAL_RENDERED_CODE = 'MJ_UNBOUND_LITERAL_RENDERED';
9
+ /** Check issue code emitted when a `data-mj-bound="<key>"` attribute is empty or not in `BoundDataLiterals`. */
10
+ export const MJ_BOUND_KEY_UNKNOWN_CODE = 'MJ_BOUND_KEY_UNKNOWN';
11
+ /** Check issue code emitted at a settle timestamp when a `data-mj-bound="<key>"` element renders a numeric token not in `BoundDataLiterals[key]`. */
12
+ export const MJ_BOUND_VALUE_MISMATCH_CODE = 'MJ_BOUND_VALUE_MISMATCH';
13
+ /** Check issue code emitted when a required provenance / as-of card substring is missing on the final frame. */
14
+ export const MJ_ASOF_CARD_MISSING_CODE = 'MJ_ASOF_CARD_MISSING';
15
+ /** Check issue code emitted when rendered text uses a font family that is not bundled. */
16
+ export const MJ_UNBUNDLED_FONT_CODE = 'MJ_UNBUNDLED_FONT';
17
+ /**
18
+ * Tunable safe-area inset fractions per `VideoFormat` (VS-RND-5 Decision 3).
19
+ *
20
+ * - `16:9` and `1:1`: `0.05` on every side.
21
+ * - `9:16`: top `0.10`, bottom `0.20`, left `0.06`, right `0.12`.
22
+ */
23
+ export const SAFE_AREA_INSETS = Object.freeze({
24
+ '16:9': Object.freeze({ Top: 0.05, Bottom: 0.05, Left: 0.05, Right: 0.05 }),
25
+ '1:1': Object.freeze({ Top: 0.05, Bottom: 0.05, Left: 0.05, Right: 0.05 }),
26
+ '9:16': Object.freeze({ Top: 0.1, Bottom: 0.2, Left: 0.06, Right: 0.12 }),
27
+ });
28
+ /**
29
+ * Tunable minimum text size as a fraction of the frame's short edge (VS-RND-5 Decision 3).
30
+ * At `1920x1080` or `1080x1920` (short edge `1080`), `0.025 * 1080 = 27px`.
31
+ */
32
+ export const MIN_TEXT_SIZE_SHORT_EDGE_RATIO = 0.025;
33
+ const FLOAT_EPSILON = 1e-6;
34
+ const TIMESTAMP_MATCH_TOLERANCE = 1e-3;
35
+ /**
36
+ * Evaluates pure DOM rules (`MJ_SAFE_AREA`, `MJ_MIN_TEXT_SIZE`, `MJ_UNBOUND_LITERAL_RENDERED`,
37
+ * `MJ_BOUND_KEY_UNKNOWN`, `MJ_BOUND_VALUE_MISMATCH`, `MJ_ASOF_CARD_MISSING`, `MJ_UNBUNDLED_FONT`)
38
+ * over a flat or per-timestamp list of `MeasuredText` items.
39
+ */
40
+ export function EvaluateDomRules(measurements, options) {
41
+ const issues = [];
42
+ const insets = SAFE_AREA_INSETS[options.Format] ?? SAFE_AREA_INSETS['16:9'];
43
+ const minLeft = options.Width * insets.Left;
44
+ const maxRight = options.Width * (1 - insets.Right);
45
+ const minTop = options.Height * insets.Top;
46
+ const maxBottom = options.Height * (1 - insets.Bottom);
47
+ const shortEdge = Math.min(options.Width, options.Height);
48
+ const minFontSizePx = shortEdge * MIN_TEXT_SIZE_SHORT_EDGE_RATIO;
49
+ const allowedSet = new Set((options.AllowedDataLiterals ?? []).map((item) => item.trim()).filter((item) => item.length > 0));
50
+ const boundAllowedByKey = buildBoundAllowedMap(options.BoundDataLiterals);
51
+ const settleTimestamps = options.SettleTimestampsSeconds ?? [];
52
+ for (const item of measurements) {
53
+ checkSafeArea(item, minLeft, minTop, maxRight, maxBottom, options.Format, issues);
54
+ checkMinTextSize(item, minFontSizePx, issues);
55
+ checkRenderedLiterals(item, allowedSet, boundAllowedByKey, settleTimestamps, issues);
56
+ checkBundledFont(item, issues);
57
+ }
58
+ checkRequiredFinalFrameText(measurements, options.RequiredFinalFrameText, options.FinalFrameTimestampSeconds, issues);
59
+ return issues;
60
+ }
61
+ function buildBoundAllowedMap(boundDataLiterals) {
62
+ if (!boundDataLiterals) {
63
+ return undefined;
64
+ }
65
+ const map = new Map();
66
+ for (const [key, values] of Object.entries(boundDataLiterals)) {
67
+ const set = new Set((Array.isArray(values) ? values : [])
68
+ .map((v) => String(v).trim())
69
+ .filter((v) => v.length > 0));
70
+ map.set(key, set);
71
+ }
72
+ return map;
73
+ }
74
+ function isAtSettleTimestamp(timestampSeconds, settleTimestamps) {
75
+ for (const settleTs of settleTimestamps) {
76
+ if (Math.abs(timestampSeconds - settleTs) <= TIMESTAMP_MATCH_TOLERANCE) {
77
+ return true;
78
+ }
79
+ }
80
+ return false;
81
+ }
82
+ function checkSafeArea(item, minLeft, minTop, maxRight, maxBottom, format, issues) {
83
+ const right = item.Left + item.Width;
84
+ const bottom = item.Top + item.Height;
85
+ const outsideLeft = item.Left < minLeft - FLOAT_EPSILON;
86
+ const outsideTop = item.Top < minTop - FLOAT_EPSILON;
87
+ const outsideRight = right > maxRight + FLOAT_EPSILON;
88
+ const outsideBottom = bottom > maxBottom + FLOAT_EPSILON;
89
+ if (outsideLeft || outsideTop || outsideRight || outsideBottom) {
90
+ issues.push({
91
+ Code: MJ_SAFE_AREA_CODE,
92
+ Category: 'SafeArea',
93
+ Severity: 'Error',
94
+ Message: `Text element "${item.Selector}" box (${Math.round(item.Left)}, ${Math.round(item.Top)}, ` +
95
+ `${Math.round(item.Width)}x${Math.round(item.Height)}) extends outside the ${format} safe area ` +
96
+ `[${Math.round(minLeft)}..${Math.round(maxRight)}, ${Math.round(minTop)}..${Math.round(maxBottom)}].`,
97
+ Selector: item.Selector,
98
+ TimestampSeconds: item.TimestampSeconds,
99
+ });
100
+ }
101
+ }
102
+ function checkMinTextSize(item, minFontSizePx, issues) {
103
+ if (item.FontSizePx < minFontSizePx - FLOAT_EPSILON) {
104
+ issues.push({
105
+ Code: MJ_MIN_TEXT_SIZE_CODE,
106
+ Category: 'MinTextSize',
107
+ Severity: 'Error',
108
+ Message: `Text element "${item.Selector}" has font-size ${Number(item.FontSizePx.toFixed(2))}px, ` +
109
+ `below the minimum ${Number(minFontSizePx.toFixed(2))}px.`,
110
+ Selector: item.Selector,
111
+ TimestampSeconds: item.TimestampSeconds,
112
+ });
113
+ }
114
+ }
115
+ function checkRenderedLiterals(item, allowedSet, boundAllowedByKey, settleTimestamps, issues) {
116
+ if (item.IsBound) {
117
+ const boundKey = (item.BoundKey ?? '').trim();
118
+ const allowedForKey = boundKey.length > 0 ? boundAllowedByKey?.get(boundKey) : undefined;
119
+ if (boundKey.length === 0 || !allowedForKey) {
120
+ issues.push({
121
+ Code: MJ_BOUND_KEY_UNKNOWN_CODE,
122
+ Category: 'DataLiteral',
123
+ Severity: 'Error',
124
+ Message: boundKey.length === 0
125
+ ? `Bound text element "${item.Selector}" has an empty data-mj-bound key.`
126
+ : `Bound text element "${item.Selector}" references unknown data-mj-bound key "${boundKey}".`,
127
+ Selector: item.Selector,
128
+ TimestampSeconds: item.TimestampSeconds,
129
+ });
130
+ return;
131
+ }
132
+ if (!isAtSettleTimestamp(item.TimestampSeconds, settleTimestamps)) {
133
+ return;
134
+ }
135
+ const tokens = ExtractNumericLiteralTokens(item.Text);
136
+ for (const token of tokens) {
137
+ if (!IsAllowedNumericLiteral(token, allowedForKey)) {
138
+ issues.push({
139
+ Code: MJ_BOUND_VALUE_MISMATCH_CODE,
140
+ Category: 'DataLiteral',
141
+ Severity: 'Error',
142
+ Message: `Bound rendered numeric literal "${token}" in "${item.Selector}" ` +
143
+ `[data-mj-bound="${boundKey}"] is not in BoundDataLiterals["${boundKey}"].`,
144
+ Selector: item.Selector,
145
+ TimestampSeconds: item.TimestampSeconds,
146
+ });
147
+ }
148
+ }
149
+ return;
150
+ }
151
+ const tokens = ExtractNumericLiteralTokens(item.Text);
152
+ for (const token of tokens) {
153
+ if (!IsAllowedNumericLiteral(token, allowedSet)) {
154
+ issues.push({
155
+ Code: MJ_UNBOUND_LITERAL_RENDERED_CODE,
156
+ Category: 'DataLiteral',
157
+ Severity: 'Error',
158
+ Message: `Unbound rendered numeric literal "${token}" in "${item.Selector}" is not in AllowedDataLiterals.`,
159
+ Selector: item.Selector,
160
+ TimestampSeconds: item.TimestampSeconds,
161
+ });
162
+ }
163
+ }
164
+ }
165
+ function checkRequiredFinalFrameText(measurements, requiredTexts, explicitFinalFrameTs, issues) {
166
+ if (!requiredTexts || requiredTexts.length === 0) {
167
+ return;
168
+ }
169
+ const normalizedRequired = requiredTexts
170
+ .map((s) => s.trim())
171
+ .filter((s) => s.length > 0);
172
+ if (normalizedRequired.length === 0) {
173
+ return;
174
+ }
175
+ const finalTs = explicitFinalFrameTs ??
176
+ (measurements.length > 0
177
+ ? Math.max(...measurements.map((m) => m.TimestampSeconds))
178
+ : 0);
179
+ const finalFrameMeasurements = measurements.filter((m) => Math.abs(m.TimestampSeconds - finalTs) <= TIMESTAMP_MATCH_TOLERANCE);
180
+ for (const required of normalizedRequired) {
181
+ const present = finalFrameMeasurements.some((m) => m.Text.includes(required));
182
+ if (!present) {
183
+ issues.push({
184
+ Code: MJ_ASOF_CARD_MISSING_CODE,
185
+ Category: 'Provenance',
186
+ Severity: 'Error',
187
+ Message: `Required final-frame provenance text "${required}" was not found in any visible text element at t=${Number(finalTs.toFixed(3))}s.`,
188
+ TimestampSeconds: finalTs,
189
+ });
190
+ }
191
+ }
192
+ }
193
+ function checkBundledFont(item, issues) {
194
+ if (!item.FontIsBundled) {
195
+ issues.push({
196
+ Code: MJ_UNBUNDLED_FONT_CODE,
197
+ Category: 'Lint',
198
+ Severity: 'Error',
199
+ Message: `Text element "${item.Selector}" uses unbundled font family "${item.FontFamily}".`,
200
+ Selector: item.Selector,
201
+ TimestampSeconds: item.TimestampSeconds,
202
+ });
203
+ }
204
+ }
205
+ //# sourceMappingURL=dom-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-rules.js","sourceRoot":"","sources":["../../src/checks/dom-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { CheckIssue } from '@memberjunction/video-studio-core';
2
+ /** Check issue code emitted when `hyperframes check --json` output cannot be parsed. */
3
+ export declare const MJ_CHECK_CLI_UNREADABLE_CODE = "MJ_CHECK_CLI_UNREADABLE";
4
+ /** Check issue code emitted when the `hyperframes check` CLI subprocess fails or crashes. */
5
+ export declare const MJ_CHECK_CLI_FAILED_CODE = "MJ_CHECK_CLI_FAILED";
6
+ /**
7
+ * Builds the strict six-key environment passed to the `hyperframes check --json`
8
+ * subprocess (VS-RND-5 Step 3 / Round 1 Fix 1):
9
+ * - `PATH`: `sourceEnv.PATH ?? ''`
10
+ * - `TMPDIR`: `sourceEnv.TMPDIR ?? os.tmpdir()`
11
+ * - `HOME`: isolated per-job directory so `~/.cache/puppeteer` and `~/.hyperframes/telemetry.json` are not used
12
+ * - `HYPERFRAMES_NO_TELEMETRY: '1'`
13
+ * - `DO_NOT_TRACK: '1'`
14
+ * - `HYPERFRAMES_BROWSER_PATH`: the worker's resolved headless browser binary path
15
+ */
16
+ export declare function BuildReducedCheckCliEnv(sourceEnv?: NodeJS.ProcessEnv, homeDir?: string, browserPath?: string): NodeJS.ProcessEnv;
17
+ /**
18
+ * Builds a single `MJ_CHECK_CLI_FAILED` Warning issue when the `hyperframes check` CLI subprocess
19
+ * crashes, times out, or fails to execute.
20
+ */
21
+ export declare function BuildCheckCliFailedIssue(reason: string): CheckIssue;
22
+ /**
23
+ * Builds a single `MJ_CHECK_CLI_UNREADABLE` Warning issue when `hyperframes check --json` stdout
24
+ * is empty, malformed JSON, or missing expected audit sections.
25
+ */
26
+ export declare function BuildCheckCliUnreadableIssue(reason: string): CheckIssue;
27
+ /**
28
+ * Maps `hyperframes check --json` output into `CheckIssue[]` (VS-RND-5 Step 7):
29
+ * - `layout.findings` → `Layout`
30
+ * - `contrast.findings` → `Contrast`
31
+ * - `motion.findings` → `Lint`
32
+ * - `severity === 'error'` → `'Error'`, anything else → `'Warning'`
33
+ * - `{"ok":false,"error":"..."}` → one `MJ_CHECK_CLI_FAILED` Warning with that error message
34
+ * - Unparseable output → one `MJ_CHECK_CLI_UNREADABLE` Warning with the reason.
35
+ */
36
+ export declare function MapHyperFramesCheckOutput(json: string | unknown): CheckIssue[];
37
+ //# sourceMappingURL=hyperframes-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyperframes-check.d.ts","sourceRoot":"","sources":["../../src/checks/hyperframes-check.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,UAAU,EAGb,MAAM,mCAAmC,CAAC;AAE3C,wFAAwF;AACxF,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;AAEtE,6FAA6F;AAC7F,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AA0B9D;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACnC,SAAS,GAAE,MAAM,CAAC,UAAwB,EAC1C,OAAO,GAAE,MAAoB,EAC7B,WAAW,SAAK,GACjB,MAAM,CAAC,UAAU,CASnB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAQnE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAQvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,EAAE,CAiB9E"}
@@ -0,0 +1,161 @@
1
+ import * as os from 'node:os';
2
+ /** Check issue code emitted when `hyperframes check --json` output cannot be parsed. */
3
+ export const MJ_CHECK_CLI_UNREADABLE_CODE = 'MJ_CHECK_CLI_UNREADABLE';
4
+ /** Check issue code emitted when the `hyperframes check` CLI subprocess fails or crashes. */
5
+ export const MJ_CHECK_CLI_FAILED_CODE = 'MJ_CHECK_CLI_FAILED';
6
+ /**
7
+ * Builds the strict six-key environment passed to the `hyperframes check --json`
8
+ * subprocess (VS-RND-5 Step 3 / Round 1 Fix 1):
9
+ * - `PATH`: `sourceEnv.PATH ?? ''`
10
+ * - `TMPDIR`: `sourceEnv.TMPDIR ?? os.tmpdir()`
11
+ * - `HOME`: isolated per-job directory so `~/.cache/puppeteer` and `~/.hyperframes/telemetry.json` are not used
12
+ * - `HYPERFRAMES_NO_TELEMETRY: '1'`
13
+ * - `DO_NOT_TRACK: '1'`
14
+ * - `HYPERFRAMES_BROWSER_PATH`: the worker's resolved headless browser binary path
15
+ */
16
+ export function BuildReducedCheckCliEnv(sourceEnv = process.env, homeDir = os.tmpdir(), browserPath = '') {
17
+ return {
18
+ PATH: sourceEnv.PATH ?? '',
19
+ TMPDIR: sourceEnv.TMPDIR ?? os.tmpdir(),
20
+ HOME: homeDir,
21
+ HYPERFRAMES_NO_TELEMETRY: '1',
22
+ DO_NOT_TRACK: '1',
23
+ HYPERFRAMES_BROWSER_PATH: browserPath,
24
+ };
25
+ }
26
+ /**
27
+ * Builds a single `MJ_CHECK_CLI_FAILED` Warning issue when the `hyperframes check` CLI subprocess
28
+ * crashes, times out, or fails to execute.
29
+ */
30
+ export function BuildCheckCliFailedIssue(reason) {
31
+ const trimmed = reason.trim() || 'Unknown CLI failure';
32
+ return {
33
+ Code: MJ_CHECK_CLI_FAILED_CODE,
34
+ Category: 'Lint',
35
+ Severity: 'Warning',
36
+ Message: `HyperFrames check CLI failed: ${trimmed}`,
37
+ };
38
+ }
39
+ /**
40
+ * Builds a single `MJ_CHECK_CLI_UNREADABLE` Warning issue when `hyperframes check --json` stdout
41
+ * is empty, malformed JSON, or missing expected audit sections.
42
+ */
43
+ export function BuildCheckCliUnreadableIssue(reason) {
44
+ const trimmed = reason.trim() || 'Unparseable CLI JSON output';
45
+ return {
46
+ Code: MJ_CHECK_CLI_UNREADABLE_CODE,
47
+ Category: 'Lint',
48
+ Severity: 'Warning',
49
+ Message: `HyperFrames check CLI output was unreadable: ${trimmed}`,
50
+ };
51
+ }
52
+ /**
53
+ * Maps `hyperframes check --json` output into `CheckIssue[]` (VS-RND-5 Step 7):
54
+ * - `layout.findings` → `Layout`
55
+ * - `contrast.findings` → `Contrast`
56
+ * - `motion.findings` → `Lint`
57
+ * - `severity === 'error'` → `'Error'`, anything else → `'Warning'`
58
+ * - `{"ok":false,"error":"..."}` → one `MJ_CHECK_CLI_FAILED` Warning with that error message
59
+ * - Unparseable output → one `MJ_CHECK_CLI_UNREADABLE` Warning with the reason.
60
+ */
61
+ export function MapHyperFramesCheckOutput(json) {
62
+ const parsed = parseCliReport(json);
63
+ if (parsed.cliError) {
64
+ return [BuildCheckCliFailedIssue(parsed.cliError)];
65
+ }
66
+ if (!parsed.report) {
67
+ return [BuildCheckCliUnreadableIssue(parsed.reason ?? 'Unparseable CLI JSON output')];
68
+ }
69
+ const report = parsed.report;
70
+ const issues = [];
71
+ appendSectionFindings(report.layout, 'Layout', issues);
72
+ appendSectionFindings(report.contrast, 'Contrast', issues);
73
+ appendSectionFindings(report.motion, 'Lint', issues);
74
+ return issues;
75
+ }
76
+ function parseCliReport(input) {
77
+ let value = input;
78
+ if (typeof input === 'string') {
79
+ const trimmed = input.trim();
80
+ if (!trimmed) {
81
+ return { reason: 'CLI stdout was empty.' };
82
+ }
83
+ try {
84
+ value = JSON.parse(trimmed);
85
+ }
86
+ catch (error) {
87
+ return {
88
+ reason: error instanceof Error ? error.message : String(error),
89
+ };
90
+ }
91
+ }
92
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
93
+ return { reason: 'CLI output root is not a JSON object.' };
94
+ }
95
+ const candidate = value;
96
+ const hasSection = isSectionObject(candidate.layout) ||
97
+ isSectionObject(candidate.contrast) ||
98
+ isSectionObject(candidate.motion);
99
+ if (!hasSection) {
100
+ if (typeof candidate.error === 'string' && candidate.error.trim().length > 0) {
101
+ return { cliError: candidate.error.trim() };
102
+ }
103
+ return {
104
+ reason: 'CLI JSON object does not contain layout, contrast, or motion sections.',
105
+ };
106
+ }
107
+ return { report: candidate };
108
+ }
109
+ function isSectionObject(section) {
110
+ return (Boolean(section) &&
111
+ typeof section === 'object' &&
112
+ !Array.isArray(section) &&
113
+ Array.isArray(section.findings));
114
+ }
115
+ function appendSectionFindings(section, category, out) {
116
+ if (!isSectionObject(section) || !Array.isArray(section.findings)) {
117
+ return;
118
+ }
119
+ for (const raw of section.findings) {
120
+ if (!raw || typeof raw !== 'object') {
121
+ continue;
122
+ }
123
+ const finding = raw;
124
+ const code = typeof finding.code === 'string' && finding.code.trim()
125
+ ? finding.code.trim()
126
+ : `hyperframes_${category.toLowerCase()}_finding`;
127
+ const severity = typeof finding.severity === 'string' && finding.severity.toLowerCase() === 'error'
128
+ ? 'Error'
129
+ : 'Warning';
130
+ const message = typeof finding.message === 'string' && finding.message.trim()
131
+ ? finding.message.trim()
132
+ : `HyperFrames ${category.toLowerCase()} check reported ${code}.`;
133
+ const selector = typeof finding.selector === 'string' && finding.selector.trim()
134
+ ? finding.selector.trim()
135
+ : undefined;
136
+ const file = typeof finding.sourceFile === 'string' && finding.sourceFile.trim()
137
+ ? finding.sourceFile.trim()
138
+ : typeof finding.file === 'string' && finding.file.trim()
139
+ ? finding.file.trim()
140
+ : undefined;
141
+ const line = typeof finding.line === 'number' && Number.isFinite(finding.line)
142
+ ? finding.line
143
+ : undefined;
144
+ const time = typeof finding.time === 'number' && Number.isFinite(finding.time)
145
+ ? finding.time
146
+ : typeof finding.firstSeen === 'number' && Number.isFinite(finding.firstSeen)
147
+ ? finding.firstSeen
148
+ : undefined;
149
+ out.push({
150
+ Code: code,
151
+ Category: category,
152
+ Severity: severity,
153
+ Message: message,
154
+ ...(file !== undefined ? { File: file } : {}),
155
+ ...(line !== undefined ? { Line: line } : {}),
156
+ ...(time !== undefined ? { TimestampSeconds: time } : {}),
157
+ ...(selector !== undefined ? { Selector: selector } : {}),
158
+ });
159
+ }
160
+ }
161
+ //# sourceMappingURL=hyperframes-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyperframes-check.js","sourceRoot":"","sources":["../../src/checks/hyperframes-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type CheckIssue, type RenderProjectBundle } from '@memberjunction/video-studio-core';
2
+ /** Issue code emitted when a relative asset reference is missing from `Bundle.Files` and `Bundle.Assets`. */
3
+ export declare const MJ_MISSING_ASSET_CODE = "MJ_MISSING_ASSET";
4
+ /** Issue code emitted when a composition script calls a non-deterministic time or timer API. */
5
+ export declare const MJ_NONDETERMINISTIC_API_CODE = "MJ_NONDETERMINISTIC_API";
6
+ /** Issue code emitted when authored HTML contains an unbound numeric literal outside `data-mj-bound`. */
7
+ export declare const MJ_UNBOUND_LITERAL_SOURCE_CODE = "MJ_UNBOUND_LITERAL_SOURCE";
8
+ /**
9
+ * `@hyperframes/lint` rule codes that already flag `Date.now(`, `new Date()`, `performance.now(`,
10
+ * and `requestAnimationFrame(` inside HTML inline `<script>` blocks (verified in Step 1c).
11
+ */
12
+ export declare const HYPERFRAMES_LINT_NONDETERMINISTIC_CODES: readonly ["non_deterministic_code", "requestanimationframe_in_composition"];
13
+ /**
14
+ * Options for `RunStaticChecks`.
15
+ */
16
+ export interface StaticCheckOptions {
17
+ /**
18
+ * Explicit list of allowed numeric literal tokens (e.g. from `CheckRequest.AllowedDataLiterals`).
19
+ * When omitted or empty, no unbound numeric literals are allowed (Decision 1).
20
+ */
21
+ AllowedDataLiterals?: readonly string[];
22
+ /**
23
+ * Existing issues returned by `RunLintGate` (`@hyperframes/lint`). Used to skip emitting
24
+ * duplicate `MJ_NONDETERMINISTIC_API` findings on the same `(File, Line)` when HyperFrames
25
+ * lint has already reported `non_deterministic_code` or `requestanimationframe_in_composition`.
26
+ */
27
+ ExistingLintIssues?: readonly CheckIssue[];
28
+ /**
29
+ * When true, skips the 4 non-deterministic APIs (`Date.now(`, `new Date()`, `performance.now(`,
30
+ * `requestAnimationFrame(`) inside HTML inline `<script>` tags that `@hyperframes/lint` scans,
31
+ * even if `ExistingLintIssues` is not passed.
32
+ */
33
+ SkipHyperFramesHtmlDuplicates?: boolean;
34
+ }
35
+ /**
36
+ * Runs pure static checks over authored files in `bundle`:
37
+ * - `MJ_MISSING_ASSET` (`MissingAsset`, Error)
38
+ * - `MJ_NONDETERMINISTIC_API` (`Lint`, Error)
39
+ * - `MJ_UNBOUND_LITERAL_SOURCE` (`DataLiteral`, Error)
40
+ */
41
+ export declare function RunStaticChecks(bundle: RenderProjectBundle, options?: StaticCheckOptions | readonly string[]): CheckIssue[];
42
+ /**
43
+ * Checks whether an extracted numeric literal token matches `allowedLiterals`.
44
+ */
45
+ export declare function IsAllowedNumericLiteral(token: string, allowedLiterals: ReadonlySet<string>): boolean;
46
+ //# sourceMappingURL=static-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-checks.d.ts","sourceRoot":"","sources":["../../src/checks/static-checks.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,KAAK,UAAU,EAEf,KAAK,mBAAmB,EAC3B,MAAM,mCAAmC,CAAC;AAE3C,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD,gGAAgG;AAChG,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;AAEtE,yGAAyG;AACzG,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,uCAAuC,6EAG1C,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC3C;;;;OAIG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;CAC3C;AAkDD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,MAAM,EAAE,GACjD,UAAU,EAAE,CAyCd;AAkoBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAEpG"}