@editframe/elements 0.37.3-beta → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EF_FRAMEGEN.js +17 -14
- package/dist/EF_FRAMEGEN.js.map +1 -1
- package/dist/EF_RENDERING.js.map +1 -1
- package/dist/canvas/EFCanvas.d.ts +9 -2
- package/dist/canvas/EFCanvas.js +14 -4
- package/dist/canvas/EFCanvas.js.map +1 -1
- package/dist/canvas/EFCanvasItem.d.ts +4 -4
- package/dist/canvas/overlays/SelectionOverlay.d.ts +10 -2
- package/dist/canvas/overlays/SelectionOverlay.js +5 -12
- package/dist/canvas/overlays/SelectionOverlay.js.map +1 -1
- package/dist/canvas/overlays/overlayState.js.map +1 -1
- package/dist/canvas/selection/SelectionController.js.map +1 -1
- package/dist/elements/EFAudio.d.ts +1 -11
- package/dist/elements/EFAudio.js +2 -10
- package/dist/elements/EFAudio.js.map +1 -1
- package/dist/elements/EFCaptions.d.ts +5 -9
- package/dist/elements/EFCaptions.js +34 -11
- package/dist/elements/EFCaptions.js.map +1 -1
- package/dist/elements/EFImage.d.ts +10 -8
- package/dist/elements/EFImage.js +117 -32
- package/dist/elements/EFImage.js.map +1 -1
- package/dist/elements/EFMedia/AssetMediaEngine.js +2 -2
- package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -1
- package/dist/elements/EFMedia/BaseMediaEngine.js +15 -92
- package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -1
- package/dist/elements/EFMedia/BufferedSeekingInput.js +10 -11
- package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -1
- package/dist/elements/EFMedia/{AssetIdMediaEngine.js → FileMediaEngine.js} +44 -24
- package/dist/elements/EFMedia/FileMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/JitMediaEngine.js +14 -13
- package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -1
- package/dist/elements/EFMedia/shared/AudioSpanUtils.js +3 -3
- package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +12 -7
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
- package/dist/elements/EFMedia/shared/timeoutUtils.js +44 -0
- package/dist/elements/EFMedia/shared/timeoutUtils.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +1 -1
- package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
- package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +4 -4
- package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
- package/dist/elements/EFMedia.d.ts +14 -8
- package/dist/elements/EFMedia.js +52 -19
- package/dist/elements/EFMedia.js.map +1 -1
- package/dist/elements/EFPanZoom.d.ts +2 -2
- package/dist/elements/EFPanZoom.js +1 -1
- package/dist/elements/EFPanZoom.js.map +1 -1
- package/dist/elements/EFSourceMixin.js +16 -8
- package/dist/elements/EFSourceMixin.js.map +1 -1
- package/dist/elements/EFSurface.d.ts +7 -10
- package/dist/elements/EFSurface.js +4 -43
- package/dist/elements/EFSurface.js.map +1 -1
- package/dist/elements/EFTemporal.d.ts +33 -8
- package/dist/elements/EFTemporal.js +92 -40
- package/dist/elements/EFTemporal.js.map +1 -1
- package/dist/elements/EFText.d.ts +3 -0
- package/dist/elements/EFText.js +54 -21
- package/dist/elements/EFText.js.map +1 -1
- package/dist/elements/EFTextSegment.js +8 -4
- package/dist/elements/EFTextSegment.js.map +1 -1
- package/dist/elements/EFTimegroup.d.ts +26 -43
- package/dist/elements/EFTimegroup.js +295 -314
- package/dist/elements/EFTimegroup.js.map +1 -1
- package/dist/elements/EFVideo.d.ts +44 -42
- package/dist/elements/EFVideo.js +259 -172
- package/dist/elements/EFVideo.js.map +1 -1
- package/dist/elements/EFWaveform.d.ts +3 -8
- package/dist/elements/EFWaveform.js +18 -13
- package/dist/elements/EFWaveform.js.map +1 -1
- package/dist/elements/ElementPositionInfo.js.map +1 -1
- package/dist/elements/FetchMixin.js.map +1 -1
- package/dist/elements/TargetController.d.ts +0 -3
- package/dist/elements/TargetController.js +12 -35
- package/dist/elements/TargetController.js.map +1 -1
- package/dist/elements/TimegroupController.js.map +1 -1
- package/dist/elements/cloneFactoryRegistry.d.ts +14 -0
- package/dist/elements/cloneFactoryRegistry.js +15 -0
- package/dist/elements/cloneFactoryRegistry.js.map +1 -0
- package/dist/elements/renderTemporalAudio.js +8 -6
- package/dist/elements/renderTemporalAudio.js.map +1 -1
- package/dist/elements/setupTemporalHierarchy.js +62 -0
- package/dist/elements/setupTemporalHierarchy.js.map +1 -0
- package/dist/elements/updateAnimations.js +62 -87
- package/dist/elements/updateAnimations.js.map +1 -1
- package/dist/getRenderInfo.d.ts +3 -2
- package/dist/getRenderInfo.js +20 -4
- package/dist/getRenderInfo.js.map +1 -1
- package/dist/gui/ContextMixin.js +68 -12
- package/dist/gui/ContextMixin.js.map +1 -1
- package/dist/gui/Controllable.js +1 -1
- package/dist/gui/Controllable.js.map +1 -1
- package/dist/gui/EFActiveRootTemporal.d.ts +4 -4
- package/dist/gui/EFActiveRootTemporal.js.map +1 -1
- package/dist/gui/EFControls.d.ts +2 -2
- package/dist/gui/EFControls.js +2 -2
- package/dist/gui/EFControls.js.map +1 -1
- package/dist/gui/EFDial.d.ts +4 -4
- package/dist/gui/EFDial.js +12 -9
- package/dist/gui/EFDial.js.map +1 -1
- package/dist/gui/EFFilmstrip.d.ts +2 -0
- package/dist/gui/EFFilmstrip.js +18 -10
- package/dist/gui/EFFilmstrip.js.map +1 -1
- package/dist/gui/EFFitScale.d.ts +28 -4
- package/dist/gui/EFFitScale.js +88 -26
- package/dist/gui/EFFitScale.js.map +1 -1
- package/dist/gui/EFFocusOverlay.d.ts +4 -4
- package/dist/gui/EFFocusOverlay.js +3 -3
- package/dist/gui/EFFocusOverlay.js.map +1 -1
- package/dist/gui/EFOverlayItem.d.ts +4 -4
- package/dist/gui/EFOverlayLayer.d.ts +4 -4
- package/dist/gui/EFPause.d.ts +4 -4
- package/dist/gui/EFPause.js +1 -1
- package/dist/gui/EFPlay.d.ts +4 -4
- package/dist/gui/EFPlay.js +1 -1
- package/dist/gui/EFPreview.js +1 -1
- package/dist/gui/EFResizableBox.d.ts +4 -4
- package/dist/gui/EFResizableBox.js +5 -5
- package/dist/gui/EFResizableBox.js.map +1 -1
- package/dist/gui/EFScrubber.d.ts +4 -4
- package/dist/gui/EFScrubber.js +8 -13
- package/dist/gui/EFScrubber.js.map +1 -1
- package/dist/gui/EFTimeDisplay.d.ts +8 -4
- package/dist/gui/EFTimeDisplay.js +25 -7
- package/dist/gui/EFTimeDisplay.js.map +1 -1
- package/dist/gui/EFTimelineRuler.d.ts +4 -4
- package/dist/gui/EFTimelineRuler.js +3 -3
- package/dist/gui/EFTimelineRuler.js.map +1 -1
- package/dist/gui/EFToggleLoop.d.ts +4 -4
- package/dist/gui/EFToggleLoop.js +1 -1
- package/dist/gui/EFTogglePlay.d.ts +4 -4
- package/dist/gui/EFTogglePlay.js +1 -1
- package/dist/gui/EFTransformHandles.d.ts +4 -4
- package/dist/gui/EFTransformHandles.js +6 -6
- package/dist/gui/EFTransformHandles.js.map +1 -1
- package/dist/gui/EFWorkbench.d.ts +40 -36
- package/dist/gui/EFWorkbench.js +436 -822
- package/dist/gui/EFWorkbench.js.map +1 -1
- package/dist/gui/FitScaleHelpers.js.map +1 -1
- package/dist/gui/PlaybackController.d.ts +3 -8
- package/dist/gui/PlaybackController.js +59 -56
- package/dist/gui/PlaybackController.js.map +1 -1
- package/dist/gui/TWMixin.js +1 -1
- package/dist/gui/TWMixin.js.map +1 -1
- package/dist/gui/TargetOrContextMixin.js +43 -6
- package/dist/gui/TargetOrContextMixin.js.map +1 -1
- package/dist/gui/ef-theme.css +136 -0
- package/dist/gui/hierarchy/EFHierarchy.d.ts +2 -2
- package/dist/gui/hierarchy/EFHierarchy.js +14 -24
- package/dist/gui/hierarchy/EFHierarchy.js.map +1 -1
- package/dist/gui/hierarchy/EFHierarchyItem.d.ts +3 -3
- package/dist/gui/hierarchy/EFHierarchyItem.js +22 -10
- package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -1
- package/dist/gui/icons.js.map +1 -1
- package/dist/gui/previewSettingsContext.d.ts +18 -0
- package/dist/gui/previewSettingsContext.js.map +1 -1
- package/dist/gui/theme.js +34 -0
- package/dist/gui/theme.js.map +1 -0
- package/dist/gui/timeline/EFTimeline.d.ts +2 -2
- package/dist/gui/timeline/EFTimeline.js +70 -52
- package/dist/gui/timeline/EFTimeline.js.map +1 -1
- package/dist/gui/timeline/EFTimelineRow.d.ts +3 -1
- package/dist/gui/timeline/EFTimelineRow.js +55 -32
- package/dist/gui/timeline/EFTimelineRow.js.map +1 -1
- package/dist/gui/timeline/TrimHandles.d.ts +23 -9
- package/dist/gui/timeline/TrimHandles.js +224 -51
- package/dist/gui/timeline/TrimHandles.js.map +1 -1
- package/dist/gui/timeline/flattenHierarchy.js.map +1 -1
- package/dist/gui/timeline/timelineEditingContext.d.ts +34 -0
- package/dist/gui/timeline/timelineEditingContext.js +24 -0
- package/dist/gui/timeline/timelineEditingContext.js.map +1 -0
- package/dist/gui/timeline/timelineStateContext.js.map +1 -1
- package/dist/gui/timeline/tracks/AudioTrack.js +1 -1
- package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -1
- package/dist/gui/timeline/tracks/CaptionsTrack.d.ts +2 -3
- package/dist/gui/timeline/tracks/CaptionsTrack.js +17 -75
- package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -1
- package/dist/gui/timeline/tracks/EFThumbnailStrip.d.ts +52 -0
- package/dist/gui/timeline/tracks/EFThumbnailStrip.js +596 -0
- package/dist/gui/timeline/tracks/EFThumbnailStrip.js.map +1 -0
- package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -1
- package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -1
- package/dist/gui/timeline/tracks/TextTrack.d.ts +3 -2
- package/dist/gui/timeline/tracks/TextTrack.js +17 -43
- package/dist/gui/timeline/tracks/TextTrack.js.map +1 -1
- package/dist/gui/timeline/tracks/TimegroupTrack.d.ts +3 -4
- package/dist/gui/timeline/tracks/TimegroupTrack.js +33 -23
- package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -1
- package/dist/gui/timeline/tracks/TrackItem.d.ts +7 -9
- package/dist/gui/timeline/tracks/TrackItem.js +18 -17
- package/dist/gui/timeline/tracks/TrackItem.js.map +1 -1
- package/dist/gui/timeline/tracks/VideoTrack.d.ts +3 -3
- package/dist/gui/timeline/tracks/VideoTrack.js +11 -14
- package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -1
- package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -1
- package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -1
- package/dist/gui/timeline/tracks/waveformUtils.js +1 -1
- package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -1
- package/dist/gui/tree/EFTree.d.ts +4 -4
- package/dist/gui/tree/EFTree.js +8 -14
- package/dist/gui/tree/EFTree.js.map +1 -1
- package/dist/gui/tree/EFTreeItem.d.ts +4 -4
- package/dist/gui/tree/EFTreeItem.js +3 -3
- package/dist/gui/tree/EFTreeItem.js.map +1 -1
- package/dist/gui/tree/treeContext.js.map +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +2 -2
- package/dist/node.js +2 -2
- package/dist/preview/AdaptiveResolutionTracker.js +3 -3
- package/dist/preview/AdaptiveResolutionTracker.js.map +1 -1
- package/dist/preview/FrameController.d.ts +2 -17
- package/dist/preview/FrameController.js +40 -63
- package/dist/preview/FrameController.js.map +1 -1
- package/dist/preview/QualityUpgradeScheduler.d.ts +76 -0
- package/dist/preview/QualityUpgradeScheduler.js +158 -0
- package/dist/preview/QualityUpgradeScheduler.js.map +1 -0
- package/dist/preview/RenderContext.d.ts +119 -1
- package/dist/preview/RenderContext.js +21 -3
- package/dist/preview/RenderContext.js.map +1 -1
- package/dist/preview/RenderProfiler.js.map +1 -1
- package/dist/preview/RenderStats.js +85 -0
- package/dist/preview/RenderStats.js.map +1 -0
- package/dist/preview/encoding/canvasEncoder.js +2 -52
- package/dist/preview/encoding/canvasEncoder.js.map +1 -1
- package/dist/preview/encoding/mainThreadEncoder.js.map +1 -1
- package/dist/preview/encoding/workerEncoder.js.map +1 -1
- package/dist/preview/logger.js.map +1 -1
- package/dist/preview/previewSettings.d.ts +34 -0
- package/dist/preview/previewSettings.js +29 -17
- package/dist/preview/previewSettings.js.map +1 -1
- package/dist/preview/previewTypes.js +4 -4
- package/dist/preview/previewTypes.js.map +1 -1
- package/dist/preview/renderElementToCanvas.d.ts +44 -0
- package/dist/preview/renderElementToCanvas.js +72 -0
- package/dist/preview/renderElementToCanvas.js.map +1 -0
- package/dist/preview/renderTimegroupToCanvas.js +267 -145
- package/dist/preview/renderTimegroupToCanvas.js.map +1 -1
- package/dist/preview/renderTimegroupToCanvas.types.d.ts +30 -0
- package/dist/preview/renderTimegroupToVideo.js +85 -105
- package/dist/preview/renderTimegroupToVideo.js.map +1 -1
- package/dist/preview/{renderTimegroupToVideo.d.ts → renderTimegroupToVideo.types.d.ts} +9 -9
- package/dist/preview/renderVideoToVideo.js +286 -0
- package/dist/preview/renderVideoToVideo.js.map +1 -0
- package/dist/preview/renderers.js.map +1 -1
- package/dist/preview/rendering/ScaleConfig.js +74 -0
- package/dist/preview/rendering/ScaleConfig.js.map +1 -0
- package/dist/preview/rendering/inlineImages.js +1 -44
- package/dist/preview/rendering/inlineImages.js.map +1 -1
- package/dist/preview/rendering/loadImage.js +22 -0
- package/dist/preview/rendering/loadImage.js.map +1 -0
- package/dist/preview/rendering/renderToImageNative.js +3 -3
- package/dist/preview/rendering/renderToImageNative.js.map +1 -1
- package/dist/preview/rendering/serializeTimelineDirect.js +224 -68
- package/dist/preview/rendering/serializeTimelineDirect.js.map +1 -1
- package/dist/preview/statsTrackingStrategy.js +1 -101
- package/dist/preview/statsTrackingStrategy.js.map +1 -1
- package/dist/preview/workers/WorkerPool.js +0 -1
- package/dist/preview/workers/WorkerPool.js.map +1 -1
- package/dist/preview/workers/encoderWorkerInline.js +21 -54
- package/dist/preview/workers/encoderWorkerInline.js.map +1 -1
- package/dist/render/EFRenderAPI.d.ts +2 -1
- package/dist/render/EFRenderAPI.js +12 -36
- package/dist/render/EFRenderAPI.js.map +1 -1
- package/dist/render/getRenderData.js +4 -4
- package/dist/render/getRenderData.js.map +1 -1
- package/dist/style.css +114 -163
- package/dist/transcoding/cache/RequestDeduplicator.js +1 -0
- package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -1
- package/dist/transcoding/types/index.d.ts +1 -1
- package/dist/transcoding/utils/UrlGenerator.js +10 -3
- package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
- package/dist/utils/LRUCache.js +1 -0
- package/dist/utils/LRUCache.js.map +1 -1
- package/dist/utils/frameTime.js +23 -1
- package/dist/utils/frameTime.js.map +1 -1
- package/package.json +21 -8
- package/scripts/build-css.js +8 -1
- package/test/setup.ts +0 -1
- package/test/useAssetMSW.ts +50 -0
- package/test/visualRegressionUtils.ts +23 -9
- package/dist/_virtual/rolldown_runtime.js +0 -27
- package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +0 -1
- package/dist/elements/EFThumbnailStrip.d.ts +0 -167
- package/dist/elements/EFThumbnailStrip.js +0 -731
- package/dist/elements/EFThumbnailStrip.js.map +0 -1
- package/dist/elements/SessionThumbnailCache.js +0 -154
- package/dist/elements/SessionThumbnailCache.js.map +0 -1
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +0 -688
- package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +0 -1
- package/dist/node_modules/react/cjs/react.development.js +0 -1521
- package/dist/node_modules/react/cjs/react.development.js.map +0 -1
- package/dist/node_modules/react/index.js +0 -13
- package/dist/node_modules/react/index.js.map +0 -1
- package/dist/node_modules/react/jsx-runtime.js +0 -13
- package/dist/node_modules/react/jsx-runtime.js.map +0 -1
- package/dist/preview/encoding/types.d.ts +0 -1
- package/dist/preview/renderTimegroupPreview.js +0 -686
- package/dist/preview/renderTimegroupPreview.js.map +0 -1
- package/dist/preview/renderTimegroupToCanvas.d.ts +0 -42
- package/dist/preview/rendering/renderToImage.d.ts +0 -2
- package/dist/preview/rendering/renderToImage.js +0 -95
- package/dist/preview/rendering/renderToImage.js.map +0 -1
- package/dist/preview/rendering/renderToImageForeignObject.js +0 -163
- package/dist/preview/rendering/renderToImageForeignObject.js.map +0 -1
- package/dist/preview/rendering/renderToImageNative.d.ts +0 -1
- package/dist/preview/rendering/svgSerializer.js +0 -43
- package/dist/preview/rendering/svgSerializer.js.map +0 -1
- package/dist/preview/rendering/types.d.ts +0 -2
- package/dist/preview/thumbnailCacheSettings.js +0 -52
- package/dist/preview/thumbnailCacheSettings.js.map +0 -1
- package/dist/sandbox/PlaybackControls.d.ts +0 -1
- package/dist/sandbox/PlaybackControls.js +0 -10
- package/dist/sandbox/PlaybackControls.js.map +0 -1
- package/dist/sandbox/ScenarioRunner.d.ts +0 -1
- package/dist/sandbox/ScenarioRunner.js +0 -1
- package/dist/sandbox/defineSandbox.d.ts +0 -1
- package/dist/sandbox/index.d.ts +0 -3
- package/dist/sandbox/index.js +0 -2
- package/test/EFVideo.framegen.browsertest.ts +0 -80
- package/test/thumbnail-performance-test.html +0 -116
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { renderTimegroupToVideo } from "../preview/renderTimegroupToVideo.js";
|
|
2
1
|
import { getRenderInfo } from "../getRenderInfo.js";
|
|
3
2
|
|
|
4
3
|
//#region src/render/EFRenderAPI.ts
|
|
@@ -15,47 +14,23 @@ function setWorkbenchRendering(rendering) {
|
|
|
15
14
|
if (workbench) workbench.rendering = rendering;
|
|
16
15
|
}
|
|
17
16
|
async function waitForTimegroupDimensions(timegroup) {
|
|
18
|
-
console.log("[EFRenderAPI] Waiting for stylesheets to load...");
|
|
19
|
-
console.log(`[EFRenderAPI] Found ${document.styleSheets.length} stylesheets`);
|
|
20
|
-
const styleLinks = Array.from(document.querySelectorAll("link[rel=\"stylesheet\"]"));
|
|
21
|
-
console.log(`[EFRenderAPI] Found ${styleLinks.length} stylesheet <link> elements`);
|
|
22
|
-
styleLinks.forEach((link, i) => {
|
|
23
|
-
const href = link.href;
|
|
24
|
-
const sheet = link.sheet;
|
|
25
|
-
console.log(`[EFRenderAPI] [${i}] ${href}`);
|
|
26
|
-
try {
|
|
27
|
-
const rulesCount = sheet ? sheet.cssRules.length : 0;
|
|
28
|
-
console.log(`[EFRenderAPI] loaded: ${!!sheet}, rules: ${rulesCount}`);
|
|
29
|
-
if (sheet && sheet.cssRules.length > 0) {
|
|
30
|
-
const firstRules = Array.from(sheet.cssRules).slice(0, 5).map((r) => r.cssText.substring(0, 100));
|
|
31
|
-
console.log(`[EFRenderAPI] first rules:`, firstRules);
|
|
32
|
-
const hasWidthClass = Array.from(sheet.cssRules).some((r) => r.cssText.includes("w-\\[1080px\\]") || r.cssText.includes("width: 1080px"));
|
|
33
|
-
console.log(`[EFRenderAPI] has w-[1080px] class: ${hasWidthClass}`);
|
|
34
|
-
}
|
|
35
|
-
} catch (e) {
|
|
36
|
-
console.log(`[EFRenderAPI] Error reading stylesheet rules:`, e);
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
17
|
await Promise.all(Array.from(document.styleSheets).map((sheet) => {
|
|
40
18
|
if (sheet.href) {
|
|
41
19
|
const link = Array.from(document.querySelectorAll("link[rel=\"stylesheet\"]")).find((l) => l.href === sheet.href);
|
|
42
|
-
if (link && !link.sheet) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
link.addEventListener("error", resolve);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
20
|
+
if (link && !link.sheet) return new Promise((resolve) => {
|
|
21
|
+
link.addEventListener("load", resolve);
|
|
22
|
+
link.addEventListener("error", resolve);
|
|
23
|
+
});
|
|
49
24
|
}
|
|
50
25
|
return Promise.resolve();
|
|
51
26
|
}));
|
|
52
27
|
timegroup.offsetHeight;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
28
|
+
const rect = timegroup.getBoundingClientRect();
|
|
29
|
+
const hasOffset = timegroup.offsetWidth > 0 && timegroup.offsetHeight > 0;
|
|
30
|
+
const hasRect = rect.width > 0 && rect.height > 0;
|
|
31
|
+
const computedWidth = getComputedStyle(timegroup).width;
|
|
32
|
+
const computedHeight = getComputedStyle(timegroup).height;
|
|
33
|
+
if (!hasOffset && !hasRect && !(parseFloat(computedWidth) > 0 && parseFloat(computedHeight) > 0)) throw new Error(`Timegroup has no dimensions (${timegroup.offsetWidth}x${timegroup.offsetHeight}). Computed styles: width=${computedWidth}, height=${computedHeight}. Classes: "${timegroup.className}". \n\nTailwind CSS did not generate styles for these classes. Check that:\n1. Your Tailwind config 'content' array includes the HTML file\n2. Tailwind CSS is properly configured in your project\n3. The dev server successfully compiled CSS (check for Tailwind warnings above)`);
|
|
59
34
|
}
|
|
60
35
|
const api = {
|
|
61
36
|
async renderStreaming(options = {}) {
|
|
@@ -67,10 +42,10 @@ const api = {
|
|
|
67
42
|
await waitForTimegroupDimensions(timegroup);
|
|
68
43
|
await timegroup.waitForMediaDurations();
|
|
69
44
|
const chunkWriter = new WritableStream({ write(chunk) {
|
|
70
|
-
console.error("Writing chunk", chunk);
|
|
71
45
|
if (window.onRenderChunk) window.onRenderChunk(chunk);
|
|
72
46
|
} });
|
|
73
47
|
const onProgress = options.onProgress || window.onRenderProgress;
|
|
48
|
+
const { renderTimegroupToVideo } = await import("../preview/renderTimegroupToVideo.js");
|
|
74
49
|
await renderTimegroupToVideo(timegroup, {
|
|
75
50
|
...options,
|
|
76
51
|
customWritableStream: chunkWriter,
|
|
@@ -89,6 +64,7 @@ const api = {
|
|
|
89
64
|
await waitForTimegroupDimensions(timegroup);
|
|
90
65
|
await timegroup.waitForMediaDurations();
|
|
91
66
|
const onProgress = options.onProgress || window.onRenderProgress;
|
|
67
|
+
const { renderTimegroupToVideo } = await import("../preview/renderTimegroupToVideo.js");
|
|
92
68
|
const buffer = await renderTimegroupToVideo(timegroup, {
|
|
93
69
|
...options,
|
|
94
70
|
returnBuffer: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EFRenderAPI.js","names":["api: IEFRenderAPI"],"sources":["../../src/render/EFRenderAPI.ts"],"sourcesContent":["/**\n * Window API for programmatic video rendering.\n * \n * Exposes renderTimegroupToVideo for use from Playwright/CLI.\n * Supports streaming output and custom data injection.\n */\n\nimport type { EFTimegroup } from \"../elements/EFTimegroup.js\";\nimport type { EFWorkbench } from \"../gui/EFWorkbench.js\";\nimport { getRenderInfo, type RenderInfo } from \"../getRenderInfo.js\";\nimport {\n renderTimegroupToVideo,\n type RenderToVideoOptions,\n type RenderProgress,\n} from \"../preview/renderTimegroupToVideo.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface IEFRenderAPI {\n /**\n * Render with streaming output (calls window.onRenderChunk for each chunk).\n * Use this for CLI/Playwright to avoid memory buffering.\n */\n renderStreaming(options?: RenderToVideoOptions): Promise<void>;\n\n /**\n * Render and return buffer (for shorter videos or in-browser use).\n * Returns the video as Uint8Array.\n */\n render(options?: RenderToVideoOptions): Promise<Uint8Array>;\n\n /**\n * Get render info (dimensions, duration, assets).\n * Same as the exported getRenderInfo function.\n */\n getRenderInfo(): Promise<RenderInfo>;\n\n /**\n * Check if SDK is ready for rendering.\n * Returns true if a root timegroup is found.\n */\n isReady(): boolean;\n}\n\ndeclare global {\n interface Window {\n EF_RENDER?: IEFRenderAPI;\n EF_RENDER_DATA?: Record<string, unknown>;\n onRenderChunk?: (chunk: Uint8Array) => void; // Set by Playwright\n onRenderProgress?: (progress: RenderProgress) => void; // Optional progress callback\n }\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nfunction findRootTimegroup(): EFTimegroup | null {\n // Try to find timegroup from workbench first\n const workbench = document.querySelector(\"ef-workbench\") as EFWorkbench | null;\n if (workbench) {\n const timegroup = workbench.querySelector(\"ef-timegroup\") as EFTimegroup | null;\n if (timegroup) {\n return timegroup;\n }\n }\n\n // Fallback: find first root timegroup\n const rootTimegroup = document.querySelector(\"ef-timegroup\") as EFTimegroup | null;\n return rootTimegroup;\n}\n\nfunction setWorkbenchRendering(rendering: boolean): void {\n const workbench = document.querySelector(\"ef-workbench\") as EFWorkbench | null;\n if (workbench) {\n workbench.rendering = rendering;\n }\n}\n\nasync function waitForTimegroupDimensions(timegroup: EFTimegroup): Promise<void> {\n // Wait for all stylesheets to load first\n console.log('[EFRenderAPI] Waiting for stylesheets to load...');\n console.log(`[EFRenderAPI] Found ${document.styleSheets.length} stylesheets`);\n \n const styleLinks = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"]'));\n console.log(`[EFRenderAPI] Found ${styleLinks.length} stylesheet <link> elements`);\n styleLinks.forEach((link, i) => {\n const href = (link as HTMLLinkElement).href;\n const sheet = (link as HTMLLinkElement).sheet;\n console.log(`[EFRenderAPI] [${i}] ${href}`);\n try {\n const rulesCount = sheet ? sheet.cssRules.length : 0;\n console.log(`[EFRenderAPI] loaded: ${!!sheet}, rules: ${rulesCount}`);\n if (sheet && sheet.cssRules.length > 0) {\n // Log first few rules to see what CSS is loaded\n const firstRules = Array.from(sheet.cssRules).slice(0, 5).map(r => r.cssText.substring(0, 100));\n console.log(`[EFRenderAPI] first rules:`, firstRules);\n \n // Search for the specific Tailwind classes we need\n const hasWidthClass = Array.from(sheet.cssRules).some(r => \n r.cssText.includes('w-\\\\[1080px\\\\]') || r.cssText.includes('width: 1080px')\n );\n console.log(`[EFRenderAPI] has w-[1080px] class: ${hasWidthClass}`);\n }\n } catch (e) {\n console.log(`[EFRenderAPI] Error reading stylesheet rules:`, e);\n }\n });\n \n await Promise.all(\n Array.from(document.styleSheets).map((sheet) => {\n if (sheet.href) {\n // Check if stylesheet is from a <link> tag and wait for it\n const link = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"]')).find(\n (l) => (l as HTMLLinkElement).href === sheet.href\n );\n if (link && !(link as HTMLLinkElement).sheet) {\n console.log(`[EFRenderAPI] Waiting for stylesheet: ${sheet.href}`);\n return new Promise((resolve) => {\n link.addEventListener('load', resolve);\n link.addEventListener('error', resolve);\n });\n }\n }\n return Promise.resolve();\n })\n );\n \n // Force layout immediately after stylesheets load\n void timegroup.offsetHeight;\n \n if (!timegroup.offsetWidth || !timegroup.offsetHeight) {\n const computedWidth = getComputedStyle(timegroup).width;\n const computedHeight = getComputedStyle(timegroup).height;\n \n throw new Error(\n `Timegroup has no dimensions (${timegroup.offsetWidth}x${timegroup.offsetHeight}). ` +\n `Computed styles: width=${computedWidth}, height=${computedHeight}. ` +\n `Classes: \"${timegroup.className}\". ` +\n `\\n\\nTailwind CSS did not generate styles for these classes. ` +\n `Check that:\\n` +\n `1. Your Tailwind config 'content' array includes the HTML file\\n` +\n `2. Tailwind CSS is properly configured in your project\\n` +\n `3. The dev server successfully compiled CSS (check for Tailwind warnings above)`\n );\n }\n \n console.log(`[EFRenderAPI] Timegroup dimensions ready: ${timegroup.offsetWidth}x${timegroup.offsetHeight}`);\n}\n\nconst api: IEFRenderAPI = {\n async renderStreaming(options: RenderToVideoOptions = {}): Promise<void> {\n const timegroup = findRootTimegroup();\n if (!timegroup) {\n throw new Error(\"No ef-timegroup found. Cannot render.\");\n }\n\n // Check if window.onRenderChunk is available\n if (typeof window === \"undefined\" || !window.onRenderChunk) {\n throw new Error(\n \"window.onRenderChunk is not set. \" +\n \"Call page.exposeFunction('onRenderChunk', callback) from Playwright first.\"\n );\n }\n\n // Hide workbench UI during render\n setWorkbenchRendering(true);\n\n try {\n // Wait for timegroup to have dimensions\n await waitForTimegroupDimensions(timegroup);\n \n // Wait for media to be ready\n await timegroup.waitForMediaDurations();\n\n // Create custom writable stream that calls window.onRenderChunk\n const chunkWriter = new WritableStream<Uint8Array>({\n write(chunk: Uint8Array) {\n console.error(\"Writing chunk\", chunk);\n if (window.onRenderChunk) {\n window.onRenderChunk(chunk);\n }\n },\n });\n\n // Merge progress callback if window.onRenderProgress is set\n const onProgress = options.onProgress || window.onRenderProgress;\n\n // Render with custom stream\n await renderTimegroupToVideo(timegroup, {\n ...options,\n customWritableStream: chunkWriter,\n onProgress,\n returnBuffer: false,\n });\n } finally {\n // Restore workbench UI\n setWorkbenchRendering(false);\n }\n },\n\n async render(options: RenderToVideoOptions = {}): Promise<Uint8Array> {\n const timegroup = findRootTimegroup();\n if (!timegroup) {\n throw new Error(\"No ef-timegroup found. Cannot render.\");\n }\n\n // Hide workbench UI during render\n setWorkbenchRendering(true);\n\n try {\n // Wait for timegroup to have dimensions\n await waitForTimegroupDimensions(timegroup);\n \n // Wait for media to be ready\n await timegroup.waitForMediaDurations();\n\n // Merge progress callback if window.onRenderProgress is set\n const onProgress = options.onProgress || window.onRenderProgress;\n\n const buffer = await renderTimegroupToVideo(timegroup, {\n ...options,\n returnBuffer: true,\n onProgress,\n });\n\n if (!buffer) {\n throw new Error(\"Render failed: no buffer returned\");\n }\n\n return buffer;\n } finally {\n // Restore workbench UI\n setWorkbenchRendering(false);\n }\n },\n\n async getRenderInfo(): Promise<RenderInfo> {\n return getRenderInfo();\n },\n\n isReady(): boolean {\n return findRootTimegroup() !== null;\n },\n};\n\n// Export and register on window\nif (typeof window !== \"undefined\") {\n window.EF_RENDER = api;\n}\n\nexport { api as EFRenderAPI };\nexport type { IEFRenderAPI as EFRenderAPIInterface };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EFRenderAPI.js","names":["api: IEFRenderAPI"],"sources":["../../src/render/EFRenderAPI.ts"],"sourcesContent":["/**\n * Window API for programmatic video rendering.\n *\n * Exposes renderTimegroupToVideo for use from Playwright/CLI.\n * Supports streaming output and custom data injection.\n */\n\nimport type { EFTimegroup } from \"../elements/EFTimegroup.js\";\nimport type { EFWorkbench } from \"../gui/EFWorkbench.js\";\nimport { getRenderInfo, type RenderInfo } from \"../getRenderInfo.js\";\n// Import only types - actual function loaded dynamically\nimport type {\n RenderToVideoOptions,\n RenderProgress,\n} from \"../preview/renderTimegroupToVideo.types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface IEFRenderAPI {\n /**\n * Render with streaming output (calls window.onRenderChunk for each chunk).\n * Use this for CLI/Playwright to avoid memory buffering.\n */\n renderStreaming(options?: RenderToVideoOptions): Promise<void>;\n\n /**\n * Render and return buffer (for shorter videos or in-browser use).\n * Returns the video as Uint8Array.\n */\n render(options?: RenderToVideoOptions): Promise<Uint8Array>;\n\n /**\n * Get render info (dimensions, duration, assets).\n * Same as the exported getRenderInfo function.\n */\n getRenderInfo(): Promise<RenderInfo>;\n\n /**\n * Check if SDK is ready for rendering.\n * Returns true if a root timegroup is found.\n */\n isReady(): boolean;\n}\n\ndeclare global {\n interface Window {\n EF_RENDER?: IEFRenderAPI;\n EF_RENDER_DATA?: Record<string, unknown>;\n onRenderChunk?: (chunk: Uint8Array) => void; // Set by Playwright\n onRenderProgress?: (progress: RenderProgress) => void; // Optional progress callback\n }\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nfunction findRootTimegroup(): EFTimegroup | null {\n // Try to find timegroup from workbench first\n const workbench = document.querySelector(\n \"ef-workbench\",\n ) as EFWorkbench | null;\n if (workbench) {\n const timegroup = workbench.querySelector(\n \"ef-timegroup\",\n ) as EFTimegroup | null;\n if (timegroup) {\n return timegroup;\n }\n }\n\n // Fallback: find first root timegroup\n const rootTimegroup = document.querySelector(\n \"ef-timegroup\",\n ) as EFTimegroup | null;\n return rootTimegroup;\n}\n\nfunction setWorkbenchRendering(rendering: boolean): void {\n const workbench = document.querySelector(\n \"ef-workbench\",\n ) as EFWorkbench | null;\n if (workbench) {\n workbench.rendering = rendering;\n }\n}\n\nasync function waitForTimegroupDimensions(\n timegroup: EFTimegroup,\n): Promise<void> {\n await Promise.all(\n Array.from(document.styleSheets).map((sheet) => {\n if (sheet.href) {\n const link = Array.from(\n document.querySelectorAll('link[rel=\"stylesheet\"]'),\n ).find((l) => (l as HTMLLinkElement).href === sheet.href);\n if (link && !(link as HTMLLinkElement).sheet) {\n return new Promise((resolve) => {\n link.addEventListener(\"load\", resolve);\n link.addEventListener(\"error\", resolve);\n });\n }\n }\n return Promise.resolve();\n }),\n );\n\n // Force layout immediately after stylesheets load\n void timegroup.offsetHeight;\n\n const rect = timegroup.getBoundingClientRect();\n const hasOffset = timegroup.offsetWidth > 0 && timegroup.offsetHeight > 0;\n const hasRect = rect.width > 0 && rect.height > 0;\n const computedWidth = getComputedStyle(timegroup).width;\n const computedHeight = getComputedStyle(timegroup).height;\n const hasComputed =\n parseFloat(computedWidth) > 0 && parseFloat(computedHeight) > 0;\n\n if (!hasOffset && !hasRect && !hasComputed) {\n throw new Error(\n `Timegroup has no dimensions (${timegroup.offsetWidth}x${timegroup.offsetHeight}). ` +\n `Computed styles: width=${computedWidth}, height=${computedHeight}. ` +\n `Classes: \"${timegroup.className}\". ` +\n `\\n\\nTailwind CSS did not generate styles for these classes. ` +\n `Check that:\\n` +\n `1. Your Tailwind config 'content' array includes the HTML file\\n` +\n `2. Tailwind CSS is properly configured in your project\\n` +\n `3. The dev server successfully compiled CSS (check for Tailwind warnings above)`,\n );\n }\n\n}\n\nconst api: IEFRenderAPI = {\n async renderStreaming(options: RenderToVideoOptions = {}): Promise<void> {\n const timegroup = findRootTimegroup();\n if (!timegroup) {\n throw new Error(\"No ef-timegroup found. Cannot render.\");\n }\n\n // Check if window.onRenderChunk is available\n if (typeof window === \"undefined\" || !window.onRenderChunk) {\n throw new Error(\n \"window.onRenderChunk is not set. \" +\n \"Call page.exposeFunction('onRenderChunk', callback) from Playwright first.\",\n );\n }\n\n // Hide workbench UI during render\n setWorkbenchRendering(true);\n\n try {\n // Wait for timegroup to have dimensions\n await waitForTimegroupDimensions(timegroup);\n\n // Wait for media to be ready\n await timegroup.waitForMediaDurations();\n\n // Create custom writable stream that calls window.onRenderChunk\n const chunkWriter = new WritableStream<Uint8Array>({\n write(chunk: Uint8Array) {\n if (window.onRenderChunk) {\n window.onRenderChunk(chunk);\n }\n },\n });\n\n // Merge progress callback if window.onRenderProgress is set\n const onProgress = options.onProgress || window.onRenderProgress;\n\n // Render with custom stream\n // Dynamic import to avoid loading render utilities during module initialization\n const { renderTimegroupToVideo } =\n await import(\"../preview/renderTimegroupToVideo.js\");\n await renderTimegroupToVideo(timegroup, {\n ...options,\n customWritableStream: chunkWriter,\n onProgress,\n returnBuffer: false,\n });\n } finally {\n // Restore workbench UI\n setWorkbenchRendering(false);\n }\n },\n\n async render(options: RenderToVideoOptions = {}): Promise<Uint8Array> {\n const timegroup = findRootTimegroup();\n if (!timegroup) {\n throw new Error(\"No ef-timegroup found. Cannot render.\");\n }\n\n // Hide workbench UI during render\n setWorkbenchRendering(true);\n\n try {\n // Wait for timegroup to have dimensions\n await waitForTimegroupDimensions(timegroup);\n\n // Wait for media to be ready\n await timegroup.waitForMediaDurations();\n\n // Merge progress callback if window.onRenderProgress is set\n const onProgress = options.onProgress || window.onRenderProgress;\n\n // Dynamic import to avoid loading render utilities during module initialization\n const { renderTimegroupToVideo } =\n await import(\"../preview/renderTimegroupToVideo.js\");\n const buffer = await renderTimegroupToVideo(timegroup, {\n ...options,\n returnBuffer: true,\n onProgress,\n });\n\n if (!buffer) {\n throw new Error(\"Render failed: no buffer returned\");\n }\n\n return buffer;\n } finally {\n // Restore workbench UI\n setWorkbenchRendering(false);\n }\n },\n\n async getRenderInfo(): Promise<RenderInfo> {\n return getRenderInfo();\n },\n\n isReady(): boolean {\n return findRootTimegroup() !== null;\n },\n};\n\n// Export and register on window\nif (typeof window !== \"undefined\") {\n window.EF_RENDER = api;\n}\n\nexport { api as EFRenderAPI };\nexport type { IEFRenderAPI as EFRenderAPIInterface };\n"],"mappings":";;;AA2DA,SAAS,oBAAwC;CAE/C,MAAM,YAAY,SAAS,cACzB,eACD;AACD,KAAI,WAAW;EACb,MAAM,YAAY,UAAU,cAC1B,eACD;AACD,MAAI,UACF,QAAO;;AAQX,QAHsB,SAAS,cAC7B,eACD;;AAIH,SAAS,sBAAsB,WAA0B;CACvD,MAAM,YAAY,SAAS,cACzB,eACD;AACD,KAAI,UACF,WAAU,YAAY;;AAI1B,eAAe,2BACb,WACe;AACf,OAAM,QAAQ,IACZ,MAAM,KAAK,SAAS,YAAY,CAAC,KAAK,UAAU;AAC9C,MAAI,MAAM,MAAM;GACd,MAAM,OAAO,MAAM,KACjB,SAAS,iBAAiB,2BAAyB,CACpD,CAAC,MAAM,MAAO,EAAsB,SAAS,MAAM,KAAK;AACzD,OAAI,QAAQ,CAAE,KAAyB,MACrC,QAAO,IAAI,SAAS,YAAY;AAC9B,SAAK,iBAAiB,QAAQ,QAAQ;AACtC,SAAK,iBAAiB,SAAS,QAAQ;KACvC;;AAGN,SAAO,QAAQ,SAAS;GACxB,CACH;AAGD,CAAK,UAAU;CAEf,MAAM,OAAO,UAAU,uBAAuB;CAC9C,MAAM,YAAY,UAAU,cAAc,KAAK,UAAU,eAAe;CACxE,MAAM,UAAU,KAAK,QAAQ,KAAK,KAAK,SAAS;CAChD,MAAM,gBAAgB,iBAAiB,UAAU,CAAC;CAClD,MAAM,iBAAiB,iBAAiB,UAAU,CAAC;AAInD,KAAI,CAAC,aAAa,CAAC,WAAW,EAF5B,WAAW,cAAc,GAAG,KAAK,WAAW,eAAe,GAAG,GAG9D,OAAM,IAAI,MACR,gCAAgC,UAAU,YAAY,GAAG,UAAU,aAAa,4BACpD,cAAc,WAAW,eAAe,cACrD,UAAU,UAAU,qRAMpC;;AAKL,MAAMA,MAAoB;CACxB,MAAM,gBAAgB,UAAgC,EAAE,EAAiB;EACvE,MAAM,YAAY,mBAAmB;AACrC,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,wCAAwC;AAI1D,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,cAC3C,OAAM,IAAI,MACR,8GAED;AAIH,wBAAsB,KAAK;AAE3B,MAAI;AAEF,SAAM,2BAA2B,UAAU;AAG3C,SAAM,UAAU,uBAAuB;GAGvC,MAAM,cAAc,IAAI,eAA2B,EACjD,MAAM,OAAmB;AACvB,QAAI,OAAO,cACT,QAAO,cAAc,MAAM;MAGhC,CAAC;GAGF,MAAM,aAAa,QAAQ,cAAc,OAAO;GAIhD,MAAM,EAAE,2BACN,MAAM,OAAO;AACf,SAAM,uBAAuB,WAAW;IACtC,GAAG;IACH,sBAAsB;IACtB;IACA,cAAc;IACf,CAAC;YACM;AAER,yBAAsB,MAAM;;;CAIhC,MAAM,OAAO,UAAgC,EAAE,EAAuB;EACpE,MAAM,YAAY,mBAAmB;AACrC,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,wCAAwC;AAI1D,wBAAsB,KAAK;AAE3B,MAAI;AAEF,SAAM,2BAA2B,UAAU;AAG3C,SAAM,UAAU,uBAAuB;GAGvC,MAAM,aAAa,QAAQ,cAAc,OAAO;GAGhD,MAAM,EAAE,2BACN,MAAM,OAAO;GACf,MAAM,SAAS,MAAM,uBAAuB,WAAW;IACrD,GAAG;IACH,cAAc;IACd;IACD,CAAC;AAEF,OAAI,CAAC,OACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,UAAO;YACC;AAER,yBAAsB,MAAM;;;CAIhC,MAAM,gBAAqC;AACzC,SAAO,eAAe;;CAGxB,UAAmB;AACjB,SAAO,mBAAmB,KAAK;;CAElC;AAGD,IAAI,OAAO,WAAW,YACpB,QAAO,YAAY"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
//#region src/render/getRenderData.ts
|
|
2
2
|
/**
|
|
3
3
|
* Get custom render data that was passed to the render process.
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
5
|
* @returns The render data object, or undefined if no data was provided
|
|
6
|
-
*
|
|
6
|
+
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```typescript
|
|
9
9
|
* import { getRenderData } from "@editframe/elements";
|
|
10
|
-
*
|
|
10
|
+
*
|
|
11
11
|
* interface MyRenderData {
|
|
12
12
|
* userName: string;
|
|
13
13
|
* theme: "light" | "dark";
|
|
14
14
|
* }
|
|
15
|
-
*
|
|
15
|
+
*
|
|
16
16
|
* const data = getRenderData<MyRenderData>();
|
|
17
17
|
* if (data) {
|
|
18
18
|
* console.log(data.userName); // "John"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRenderData.js","names":[],"sources":["../../src/render/getRenderData.ts"],"sourcesContent":["/**\n * Helper function for compositions to read custom render data.\n
|
|
1
|
+
{"version":3,"file":"getRenderData.js","names":[],"sources":["../../src/render/getRenderData.ts"],"sourcesContent":["/**\n * Helper function for compositions to read custom render data.\n *\n * Supports both runtime data (set by Playwright/CLI via window.EF_RENDER_DATA)\n * and build-time data (set by Vite define as RENDER_DATA).\n */\n\n// Declare RENDER_DATA for TypeScript (set via Vite define at build time)\ndeclare const RENDER_DATA: unknown | undefined;\n\n/**\n * Get custom render data that was passed to the render process.\n *\n * @returns The render data object, or undefined if no data was provided\n *\n * @example\n * ```typescript\n * import { getRenderData } from \"@editframe/elements\";\n *\n * interface MyRenderData {\n * userName: string;\n * theme: \"light\" | \"dark\";\n * }\n *\n * const data = getRenderData<MyRenderData>();\n * if (data) {\n * console.log(data.userName); // \"John\"\n * }\n * ```\n */\nexport function getRenderData<T = unknown>(): T | undefined {\n // Runtime data (set by Playwright/CLI)\n if (typeof window !== \"undefined\" && window.EF_RENDER_DATA) {\n return window.EF_RENDER_DATA as T;\n }\n\n // Build-time data (set by Vite define)\n if (typeof RENDER_DATA !== \"undefined\") {\n return RENDER_DATA as T;\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,gBAA4C;AAE1D,KAAI,OAAO,WAAW,eAAe,OAAO,eAC1C,QAAO,OAAO;AAIhB,KAAI,OAAO,gBAAgB,YACzB,QAAO"}
|
package/dist/style.css
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
/* Import theme tokens first so they're available to all components */
|
|
2
|
+
@import "./gui/ef-theme.css";
|
|
3
|
+
|
|
1
4
|
/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
|
|
2
|
-
*, ::before, ::after
|
|
5
|
+
*, ::before, ::after{
|
|
3
6
|
--tw-border-spacing-x: 0;
|
|
4
7
|
--tw-border-spacing-y: 0;
|
|
5
8
|
--tw-translate-x: 0;
|
|
@@ -52,7 +55,7 @@
|
|
|
52
55
|
--tw-contain-paint: ;
|
|
53
56
|
--tw-contain-style: ;
|
|
54
57
|
}
|
|
55
|
-
::backdrop
|
|
58
|
+
::backdrop{
|
|
56
59
|
--tw-border-spacing-x: 0;
|
|
57
60
|
--tw-border-spacing-y: 0;
|
|
58
61
|
--tw-translate-x: 0;
|
|
@@ -433,348 +436,296 @@ video {
|
|
|
433
436
|
display: none;
|
|
434
437
|
}
|
|
435
438
|
/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
|
|
436
|
-
.\!container
|
|
439
|
+
.\!container{
|
|
437
440
|
width: 100% !important;
|
|
438
441
|
}
|
|
439
|
-
.container
|
|
442
|
+
.container{
|
|
440
443
|
width: 100%;
|
|
441
444
|
}
|
|
442
|
-
@media (min-width: 640px)
|
|
443
|
-
.\!container
|
|
445
|
+
@media (min-width: 640px){
|
|
446
|
+
.\!container{
|
|
444
447
|
max-width: 640px !important;
|
|
445
448
|
}
|
|
446
|
-
.container
|
|
449
|
+
.container{
|
|
447
450
|
max-width: 640px;
|
|
448
451
|
}
|
|
449
452
|
}
|
|
450
|
-
@media (min-width: 768px)
|
|
451
|
-
.\!container
|
|
453
|
+
@media (min-width: 768px){
|
|
454
|
+
.\!container{
|
|
452
455
|
max-width: 768px !important;
|
|
453
456
|
}
|
|
454
|
-
.container
|
|
457
|
+
.container{
|
|
455
458
|
max-width: 768px;
|
|
456
459
|
}
|
|
457
460
|
}
|
|
458
|
-
@media (min-width: 1024px)
|
|
459
|
-
.\!container
|
|
461
|
+
@media (min-width: 1024px){
|
|
462
|
+
.\!container{
|
|
460
463
|
max-width: 1024px !important;
|
|
461
464
|
}
|
|
462
|
-
.container
|
|
465
|
+
.container{
|
|
463
466
|
max-width: 1024px;
|
|
464
467
|
}
|
|
465
468
|
}
|
|
466
|
-
@media (min-width: 1280px)
|
|
467
|
-
.\!container
|
|
469
|
+
@media (min-width: 1280px){
|
|
470
|
+
.\!container{
|
|
468
471
|
max-width: 1280px !important;
|
|
469
472
|
}
|
|
470
|
-
.container
|
|
473
|
+
.container{
|
|
471
474
|
max-width: 1280px;
|
|
472
475
|
}
|
|
473
476
|
}
|
|
474
|
-
@media (min-width: 1536px)
|
|
475
|
-
.\!container
|
|
477
|
+
@media (min-width: 1536px){
|
|
478
|
+
.\!container{
|
|
476
479
|
max-width: 1536px !important;
|
|
477
480
|
}
|
|
478
|
-
.container
|
|
481
|
+
.container{
|
|
479
482
|
max-width: 1536px;
|
|
480
483
|
}
|
|
481
484
|
}
|
|
482
485
|
/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
|
|
483
|
-
|
|
484
|
-
visibility: visible !important;
|
|
485
|
-
}
|
|
486
|
-
.visible {
|
|
486
|
+
.visible{
|
|
487
487
|
visibility: visible;
|
|
488
488
|
}
|
|
489
|
-
.invisible
|
|
489
|
+
.invisible{
|
|
490
490
|
visibility: hidden;
|
|
491
491
|
}
|
|
492
|
-
.collapse
|
|
492
|
+
.collapse{
|
|
493
493
|
visibility: collapse;
|
|
494
494
|
}
|
|
495
|
-
.static
|
|
495
|
+
.static{
|
|
496
496
|
position: static;
|
|
497
497
|
}
|
|
498
|
-
.fixed
|
|
498
|
+
.fixed{
|
|
499
499
|
position: fixed;
|
|
500
500
|
}
|
|
501
|
-
.absolute
|
|
501
|
+
.absolute{
|
|
502
502
|
position: absolute;
|
|
503
503
|
}
|
|
504
|
-
.relative
|
|
504
|
+
.relative{
|
|
505
505
|
position: relative;
|
|
506
506
|
}
|
|
507
|
-
.sticky
|
|
507
|
+
.sticky{
|
|
508
508
|
position: sticky;
|
|
509
509
|
}
|
|
510
|
-
.inset-0
|
|
510
|
+
.inset-0{
|
|
511
511
|
inset: 0px;
|
|
512
512
|
}
|
|
513
|
-
.left-0
|
|
513
|
+
.left-0{
|
|
514
514
|
left: 0px;
|
|
515
515
|
}
|
|
516
|
-
.
|
|
516
|
+
.right-0{
|
|
517
|
+
right: 0px;
|
|
518
|
+
}
|
|
519
|
+
.top-0{
|
|
517
520
|
top: 0px;
|
|
518
521
|
}
|
|
519
|
-
.
|
|
522
|
+
.top-8{
|
|
523
|
+
top: 2rem;
|
|
524
|
+
}
|
|
525
|
+
.isolate{
|
|
520
526
|
isolation: isolate;
|
|
521
527
|
}
|
|
522
|
-
.z-\[5\]
|
|
528
|
+
.z-\[5\]{
|
|
523
529
|
z-index: 5;
|
|
524
530
|
}
|
|
525
|
-
.mb-0
|
|
531
|
+
.mb-0{
|
|
526
532
|
margin-bottom: 0px;
|
|
527
533
|
}
|
|
528
|
-
.mb-\[1px\]
|
|
534
|
+
.mb-\[1px\]{
|
|
529
535
|
margin-bottom: 1px;
|
|
530
536
|
}
|
|
531
|
-
.block
|
|
537
|
+
.block{
|
|
532
538
|
display: block;
|
|
533
539
|
}
|
|
534
|
-
.inline-block
|
|
540
|
+
.inline-block{
|
|
535
541
|
display: inline-block;
|
|
536
542
|
}
|
|
537
|
-
.inline
|
|
543
|
+
.inline{
|
|
538
544
|
display: inline;
|
|
539
545
|
}
|
|
540
|
-
.flex
|
|
546
|
+
.flex{
|
|
541
547
|
display: flex;
|
|
542
548
|
}
|
|
543
|
-
.inline-flex
|
|
549
|
+
.inline-flex{
|
|
544
550
|
display: inline-flex;
|
|
545
551
|
}
|
|
546
|
-
.table
|
|
552
|
+
.table{
|
|
547
553
|
display: table;
|
|
548
554
|
}
|
|
549
|
-
.grid
|
|
555
|
+
.grid{
|
|
550
556
|
display: grid;
|
|
551
557
|
}
|
|
552
|
-
.inline-grid
|
|
558
|
+
.inline-grid{
|
|
553
559
|
display: inline-grid;
|
|
554
560
|
}
|
|
555
|
-
.contents
|
|
561
|
+
.contents{
|
|
556
562
|
display: contents;
|
|
557
563
|
}
|
|
558
|
-
.hidden
|
|
564
|
+
.hidden{
|
|
559
565
|
display: none;
|
|
560
566
|
}
|
|
561
|
-
.size-full
|
|
567
|
+
.size-full{
|
|
562
568
|
width: 100%;
|
|
563
569
|
height: 100%;
|
|
564
570
|
}
|
|
565
|
-
.h-\[1\.1rem\]
|
|
571
|
+
.h-\[1\.1rem\]{
|
|
566
572
|
height: 1.1rem;
|
|
567
573
|
}
|
|
568
|
-
.h-\[1080px\]
|
|
574
|
+
.h-\[1080px\]{
|
|
569
575
|
height: 1080px;
|
|
570
576
|
}
|
|
571
|
-
.h-\[
|
|
572
|
-
height: 200px;
|
|
573
|
-
}
|
|
574
|
-
.h-\[270px\] {
|
|
575
|
-
height: 270px;
|
|
576
|
-
}
|
|
577
|
-
.h-\[300px\] {
|
|
578
|
-
height: 300px;
|
|
579
|
-
}
|
|
580
|
-
.h-\[360px\] {
|
|
581
|
-
height: 360px;
|
|
582
|
-
}
|
|
583
|
-
.h-\[400px\] {
|
|
584
|
-
height: 400px;
|
|
585
|
-
}
|
|
586
|
-
.h-\[500px\] {
|
|
577
|
+
.h-\[500px\]{
|
|
587
578
|
height: 500px;
|
|
588
579
|
}
|
|
589
|
-
.h-\[5px\]
|
|
580
|
+
.h-\[5px\]{
|
|
590
581
|
height: 5px;
|
|
591
582
|
}
|
|
592
|
-
.h-
|
|
583
|
+
.h-\[calc\(50vh-4rem\)\]{
|
|
584
|
+
height: calc(50vh - 4rem);
|
|
585
|
+
}
|
|
586
|
+
.h-full{
|
|
593
587
|
height: 100%;
|
|
594
588
|
}
|
|
595
|
-
.w-1
|
|
589
|
+
.w-1{
|
|
596
590
|
width: 0.25rem;
|
|
597
591
|
}
|
|
598
|
-
.w-\[1000px\]
|
|
592
|
+
.w-\[1000px\]{
|
|
599
593
|
width: 1000px;
|
|
600
594
|
}
|
|
601
|
-
.w-\[
|
|
602
|
-
width: 1080px;
|
|
603
|
-
}
|
|
604
|
-
.w-\[1920px\] {
|
|
595
|
+
.w-\[1920px\]{
|
|
605
596
|
width: 1920px;
|
|
606
597
|
}
|
|
607
|
-
.w-\[
|
|
608
|
-
width: 200px;
|
|
609
|
-
}
|
|
610
|
-
.w-\[420px\] {
|
|
598
|
+
.w-\[420px\]{
|
|
611
599
|
width: 420px;
|
|
612
600
|
}
|
|
613
|
-
.w
|
|
614
|
-
width: 480px;
|
|
615
|
-
}
|
|
616
|
-
.w-\[600px\] {
|
|
617
|
-
width: 600px;
|
|
618
|
-
}
|
|
619
|
-
.w-\[640px\] {
|
|
620
|
-
width: 640px;
|
|
621
|
-
}
|
|
622
|
-
.w-full {
|
|
601
|
+
.w-full{
|
|
623
602
|
width: 100%;
|
|
624
603
|
}
|
|
625
|
-
.flex-
|
|
604
|
+
.flex-1{
|
|
605
|
+
flex: 1 1 0%;
|
|
606
|
+
}
|
|
607
|
+
.flex-shrink{
|
|
626
608
|
flex-shrink: 1;
|
|
627
609
|
}
|
|
628
|
-
.shrink
|
|
610
|
+
.shrink{
|
|
629
611
|
flex-shrink: 1;
|
|
630
612
|
}
|
|
631
|
-
.\!transform
|
|
613
|
+
.\!transform{
|
|
632
614
|
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important;
|
|
633
615
|
}
|
|
634
|
-
.transform
|
|
616
|
+
.transform{
|
|
635
617
|
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
|
636
618
|
}
|
|
637
|
-
.
|
|
638
|
-
cursor: grabbing;
|
|
639
|
-
}
|
|
640
|
-
.cursor-pointer {
|
|
641
|
-
cursor: pointer;
|
|
642
|
-
}
|
|
643
|
-
.resize {
|
|
619
|
+
.resize{
|
|
644
620
|
resize: both;
|
|
645
621
|
}
|
|
646
|
-
.flex-
|
|
647
|
-
flex-direction: row;
|
|
648
|
-
}
|
|
649
|
-
.flex-wrap {
|
|
622
|
+
.flex-wrap{
|
|
650
623
|
flex-wrap: wrap;
|
|
651
624
|
}
|
|
652
|
-
.items-center
|
|
625
|
+
.items-center{
|
|
653
626
|
align-items: center;
|
|
654
627
|
}
|
|
655
|
-
.
|
|
656
|
-
gap: 0.5rem;
|
|
657
|
-
}
|
|
658
|
-
.overflow-hidden {
|
|
628
|
+
.overflow-hidden{
|
|
659
629
|
overflow: hidden;
|
|
660
630
|
}
|
|
661
|
-
.overflow-visible
|
|
631
|
+
.overflow-visible{
|
|
662
632
|
overflow: visible;
|
|
663
633
|
}
|
|
664
|
-
.whitespace-nowrap
|
|
634
|
+
.whitespace-nowrap{
|
|
665
635
|
white-space: nowrap;
|
|
666
636
|
}
|
|
667
|
-
.text-nowrap
|
|
637
|
+
.text-nowrap{
|
|
668
638
|
text-wrap: nowrap;
|
|
669
639
|
}
|
|
670
|
-
.rounded
|
|
640
|
+
.rounded{
|
|
671
641
|
border-radius: 0.25rem;
|
|
672
642
|
}
|
|
673
|
-
.border
|
|
643
|
+
.border{
|
|
674
644
|
border-width: 1px;
|
|
675
645
|
}
|
|
676
|
-
.bg-
|
|
677
|
-
--tw-bg-opacity: 1;
|
|
678
|
-
background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
|
|
679
|
-
}
|
|
680
|
-
.bg-lime-400 {
|
|
681
|
-
--tw-bg-opacity: 1;
|
|
682
|
-
background-color: rgb(163 230 53 / var(--tw-bg-opacity, 1));
|
|
683
|
-
}
|
|
684
|
-
.bg-slate-500 {
|
|
646
|
+
.bg-slate-500{
|
|
685
647
|
--tw-bg-opacity: 1;
|
|
686
648
|
background-color: rgb(100 116 139 / var(--tw-bg-opacity, 1));
|
|
687
649
|
}
|
|
688
|
-
.
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
}
|
|
692
|
-
.object-contain {
|
|
693
|
-
-o-object-fit: contain;
|
|
694
|
-
object-fit: contain;
|
|
650
|
+
.object-cover{
|
|
651
|
+
-o-object-fit: cover;
|
|
652
|
+
object-fit: cover;
|
|
695
653
|
}
|
|
696
|
-
.
|
|
697
|
-
padding: 1rem;
|
|
698
|
-
}
|
|
699
|
-
.px-0\.5 {
|
|
654
|
+
.px-0\.5{
|
|
700
655
|
padding-left: 0.125rem;
|
|
701
656
|
padding-right: 0.125rem;
|
|
702
657
|
}
|
|
703
|
-
.text-center
|
|
658
|
+
.text-center{
|
|
704
659
|
text-align: center;
|
|
705
660
|
}
|
|
706
|
-
.text
|
|
661
|
+
.text-3xl{
|
|
662
|
+
font-size: 1.875rem;
|
|
663
|
+
line-height: 2.25rem;
|
|
664
|
+
}
|
|
665
|
+
.text-\[8px\]{
|
|
707
666
|
font-size: 8px;
|
|
708
667
|
}
|
|
709
|
-
.text-sm
|
|
668
|
+
.text-sm{
|
|
710
669
|
font-size: 0.875rem;
|
|
711
670
|
line-height: 1.25rem;
|
|
712
671
|
}
|
|
713
|
-
.text-xs
|
|
672
|
+
.text-xs{
|
|
714
673
|
font-size: 0.75rem;
|
|
715
674
|
line-height: 1rem;
|
|
716
675
|
}
|
|
717
|
-
.font-bold
|
|
676
|
+
.font-bold{
|
|
718
677
|
font-weight: 700;
|
|
719
678
|
}
|
|
720
|
-
.uppercase
|
|
679
|
+
.uppercase{
|
|
721
680
|
text-transform: uppercase;
|
|
722
681
|
}
|
|
723
|
-
.capitalize
|
|
682
|
+
.capitalize{
|
|
724
683
|
text-transform: capitalize;
|
|
725
684
|
}
|
|
726
|
-
.italic
|
|
685
|
+
.italic{
|
|
727
686
|
font-style: italic;
|
|
728
687
|
}
|
|
729
|
-
.text-
|
|
730
|
-
--tw-text-opacity: 1;
|
|
731
|
-
color: rgb(0 0 0 / var(--tw-text-opacity, 1));
|
|
732
|
-
}
|
|
733
|
-
.text-green-200 {
|
|
734
|
-
--tw-text-opacity: 1;
|
|
735
|
-
color: rgb(187 247 208 / var(--tw-text-opacity, 1));
|
|
736
|
-
}
|
|
737
|
-
.text-green-900 {
|
|
688
|
+
.text-white{
|
|
738
689
|
--tw-text-opacity: 1;
|
|
739
|
-
color: rgb(
|
|
690
|
+
color: rgb(255 255 255 / var(--tw-text-opacity, 1));
|
|
740
691
|
}
|
|
741
|
-
.opacity-50
|
|
692
|
+
.opacity-50{
|
|
742
693
|
opacity: 0.5;
|
|
743
694
|
}
|
|
744
|
-
.shadow
|
|
695
|
+
.shadow{
|
|
745
696
|
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
|
746
697
|
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
|
|
747
698
|
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
|
748
699
|
}
|
|
749
|
-
.outline
|
|
700
|
+
.outline{
|
|
750
701
|
outline-style: solid;
|
|
751
702
|
}
|
|
752
|
-
.blur
|
|
703
|
+
.blur{
|
|
753
704
|
--tw-blur: blur(8px);
|
|
754
705
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
|
755
706
|
}
|
|
756
|
-
.
|
|
757
|
-
--tw-
|
|
707
|
+
.grayscale{
|
|
708
|
+
--tw-grayscale: grayscale(100%);
|
|
758
709
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
|
759
710
|
}
|
|
760
|
-
.filter
|
|
711
|
+
.filter{
|
|
761
712
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
|
762
713
|
}
|
|
763
|
-
.backdrop-filter
|
|
714
|
+
.backdrop-filter{
|
|
764
715
|
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
|
|
765
716
|
}
|
|
766
|
-
.transition
|
|
717
|
+
.transition{
|
|
767
718
|
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
|
|
768
719
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
769
720
|
transition-duration: 150ms;
|
|
770
721
|
}
|
|
771
|
-
.ease-in
|
|
722
|
+
.ease-in{
|
|
772
723
|
transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
|
|
773
724
|
}
|
|
774
|
-
.ease-in-out
|
|
725
|
+
.ease-in-out{
|
|
775
726
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
776
727
|
}
|
|
777
|
-
.ease-out
|
|
728
|
+
.ease-out{
|
|
778
729
|
transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
|
779
730
|
}
|
|
780
731
|
|
|
@@ -17,6 +17,7 @@ var RequestDeduplicator = class {
|
|
|
17
17
|
if (existingRequest) return existingRequest;
|
|
18
18
|
const requestPromise = requestFactory();
|
|
19
19
|
this.pendingRequests.set(key, requestPromise);
|
|
20
|
+
requestPromise.catch(() => {});
|
|
20
21
|
try {
|
|
21
22
|
const result = await requestPromise;
|
|
22
23
|
this.pendingRequests.delete(key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestDeduplicator.js","names":[],"sources":["../../../src/transcoding/cache/RequestDeduplicator.ts"],"sourcesContent":["/**\n * Request deduplication utility\n * Manages pending requests to prevent concurrent duplicate requests\n */\n\nexport class RequestDeduplicator {\n private pendingRequests = new Map<string, Promise<any>>();\n\n /**\n * Execute a request with deduplication\n * If a request with the same key is already pending, return the existing promise\n * Otherwise, execute the request factory and track the promise\n */\n async executeRequest<T>(\n key: string,\n requestFactory: () => Promise<T>,\n ): Promise<T> {\n // Check if there's already a pending request for this key\n const existingRequest = this.pendingRequests.get(key);\n if (existingRequest) {\n return existingRequest;\n }\n\n // Create and track the new request\n const requestPromise = requestFactory();\n this.pendingRequests.set(key, requestPromise);\n\n try {\n const result = await requestPromise;\n this.pendingRequests.delete(key);\n return result;\n } catch (error) {\n this.pendingRequests.delete(key);\n throw error;\n }\n }\n\n /**\n * Clear all pending requests (used in cache clearing)\n */\n clear(): void {\n this.pendingRequests.clear();\n }\n\n /**\n * Get number of pending requests\n */\n getPendingCount(): number {\n return this.pendingRequests.size;\n }\n\n /**\n * Check if a request is pending\n */\n isPending(key: string): boolean {\n return this.pendingRequests.has(key);\n }\n\n /**\n * Get all pending request keys\n */\n getPendingKeys(): string[] {\n return Array.from(this.pendingRequests.keys());\n }\n}\n"],"mappings":";;;;;AAKA,IAAa,sBAAb,MAAiC;;yCACL,IAAI,KAA2B;;;;;;;CAOzD,MAAM,eACJ,KACA,gBACY;EAEZ,MAAM,kBAAkB,KAAK,gBAAgB,IAAI,IAAI;AACrD,MAAI,gBACF,QAAO;EAIT,MAAM,iBAAiB,gBAAgB;AACvC,OAAK,gBAAgB,IAAI,KAAK,eAAe;
|
|
1
|
+
{"version":3,"file":"RequestDeduplicator.js","names":[],"sources":["../../../src/transcoding/cache/RequestDeduplicator.ts"],"sourcesContent":["/**\n * Request deduplication utility\n * Manages pending requests to prevent concurrent duplicate requests\n */\n\nexport class RequestDeduplicator {\n private pendingRequests = new Map<string, Promise<any>>();\n\n /**\n * Execute a request with deduplication\n * If a request with the same key is already pending, return the existing promise\n * Otherwise, execute the request factory and track the promise\n */\n async executeRequest<T>(\n key: string,\n requestFactory: () => Promise<T>,\n ): Promise<T> {\n // Check if there's already a pending request for this key\n const existingRequest = this.pendingRequests.get(key);\n if (existingRequest) {\n return existingRequest;\n }\n\n // Create and track the new request\n const requestPromise = requestFactory();\n this.pendingRequests.set(key, requestPromise);\n\n // Prevent unhandled rejection on the raw factory promise. Chrome's V8\n // may detect a rejection as unhandled if no synchronous .catch() is\n // attached before any microtask boundary, even when the promise is\n // currently being await-ed. The error still propagates via the try/catch.\n requestPromise.catch(() => {});\n\n try {\n const result = await requestPromise;\n this.pendingRequests.delete(key);\n return result;\n } catch (error) {\n this.pendingRequests.delete(key);\n throw error;\n }\n }\n\n /**\n * Clear all pending requests (used in cache clearing)\n */\n clear(): void {\n this.pendingRequests.clear();\n }\n\n /**\n * Get number of pending requests\n */\n getPendingCount(): number {\n return this.pendingRequests.size;\n }\n\n /**\n * Check if a request is pending\n */\n isPending(key: string): boolean {\n return this.pendingRequests.has(key);\n }\n\n /**\n * Get all pending request keys\n */\n getPendingKeys(): string[] {\n return Array.from(this.pendingRequests.keys());\n }\n}\n"],"mappings":";;;;;AAKA,IAAa,sBAAb,MAAiC;;yCACL,IAAI,KAA2B;;;;;;;CAOzD,MAAM,eACJ,KACA,gBACY;EAEZ,MAAM,kBAAkB,KAAK,gBAAgB,IAAI,IAAI;AACrD,MAAI,gBACF,QAAO;EAIT,MAAM,iBAAiB,gBAAgB;AACvC,OAAK,gBAAgB,IAAI,KAAK,eAAe;AAM7C,iBAAe,YAAY,GAAG;AAE9B,MAAI;GACF,MAAM,SAAS,MAAM;AACrB,QAAK,gBAAgB,OAAO,IAAI;AAChC,UAAO;WACA,OAAO;AACd,QAAK,gBAAgB,OAAO,IAAI;AAChC,SAAM;;;;;;CAOV,QAAc;AACZ,OAAK,gBAAgB,OAAO;;;;;CAM9B,kBAA0B;AACxB,SAAO,KAAK,gBAAgB;;;;;CAM9B,UAAU,KAAsB;AAC9B,SAAO,KAAK,gBAAgB,IAAI,IAAI;;;;;CAMtC,iBAA2B;AACzB,SAAO,MAAM,KAAK,KAAK,gBAAgB,MAAM,CAAC"}
|