feat(director): validate scene documents and preserve saved edits

This commit is contained in:
Sameh Khamis committed 2026-09-15 16:20:36 -07:00
1 parent c894d7b920
commit 18300e7e00
13 files changed
+1155 -404

No files matched your search

+2 -1
View File
@@ -732,5 +732,6 @@
"src/director/clock.test.mjs",
"src/director/timeline.test.mjs",
"src/scenes/packs/registry.test.mjs",
"scripts/qa-director-timing.mjs"
"scripts/qa-director-timing.mjs",
"src/director/document.test.mjs"
]
+8 -3
View File
@@ -617,7 +617,8 @@
"modules": [
"src/director/playback.js",
"src/director/clock.js",
"src/director/timeline.js"
"src/director/timeline.js",
"src/director/document.js"
],
"external": []
},
@@ -645,7 +646,9 @@
"src/scenes/shotPresentation.js",
"src/scenes/packs/registry.js",
"src/scenes/packs/defaults.js",
"src/scenes/packs/nepal.js"
"src/scenes/packs/nepal.js",
"src/director/document.js",
"src/scenes/project.js"
],
"external": ["cesium"]
},
@@ -1750,7 +1753,9 @@
"src/scenes/shotPresentation.js",
"src/scenes/packs/registry.js",
"src/scenes/packs/defaults.js",
"src/scenes/packs/nepal.js"
"src/scenes/packs/nepal.js",
"src/director/document.js",
"src/scenes/project.js"
],
"external": [
"@mapbox/vector-tile",
+34
View File
@@ -274,6 +274,40 @@ try {
'QA Scene',
),
);
const savedBefore = await page.evaluate(() =>
localStorage.getItem('godsEyeView.sceneProject.v2'),
);
const futureFile = path.join(shots, 'future.json');
fs.writeFileSync(futureFile, JSON.stringify({ version: 99, scenes: [] }));
await input.uploadFile(futureFile);
await page.waitForFunction(() =>
document.getElementById('scene-status').textContent.includes('$.version'),
);
check(
'Unsupported versions leave authored state and saved bytes unchanged',
await page.evaluate(
(saved) =>
localStorage.getItem('godsEyeView.sceneProject.v2') === saved &&
window.__godsEyeView.sceneDirector._getSelectedScene().title ===
'QA Scene',
savedBefore,
),
);
const malformed = structuredClone(fixture);
malformed.scenes[0].shots[0].camera.lat = 91;
const malformedFile = path.join(shots, 'malformed.json');
fs.writeFileSync(malformedFile, JSON.stringify(malformed));
await input.uploadFile(malformedFile);
await page.waitForFunction(() =>
document.getElementById('scene-status').textContent.includes('camera.lat'),
);
check(
'Invalid camera field identifies its path without replacing the project',
await page.evaluate(
(saved) => localStorage.getItem('godsEyeView.sceneProject.v2') === saved,
savedBefore,
),
);
await page.screenshot({ path: path.join(shots, 'desktop.png') });
await page.setViewport({ width: 390, height: 844 });
await page.screenshot({ path: path.join(shots, 'narrow.png') });