@remotion/browser-bundler 4.0.527
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/README.md +18 -0
- package/dist/browser-bundler-worker.d.ts +1 -0
- package/dist/browser-bundler-worker.js +1420 -0
- package/dist/browser-module-scope.d.ts +7 -0
- package/dist/compiler.d.ts +7 -0
- package/dist/compiler.js +1604 -0
- package/dist/create-browser-bundle-runtime.d.ts +7 -0
- package/dist/create-browser-bundler.d.ts +2 -0
- package/dist/create-browser-compiler.d.ts +27 -0
- package/dist/create-browser-composition-observer.d.ts +15 -0
- package/dist/dependency-resolution.d.ts +9 -0
- package/dist/errors.d.ts +6 -0
- package/dist/fast-refresh-bridge.d.ts +8 -0
- package/dist/get-browser-composition.d.ts +17 -0
- package/dist/hmr-assets.d.ts +16 -0
- package/dist/hmr-plugins.d.ts +10 -0
- package/dist/http-client.d.ts +9 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +115 -0
- package/dist/index.js.LICENSE.txt +19 -0
- package/dist/load-browser-bundle.d.ts +10 -0
- package/dist/load-rspack.d.ts +3 -0
- package/dist/refresh-virtual-files.d.ts +5 -0
- package/dist/rspack.wasm32-wasi.wasm +0 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.js +689 -0
- package/dist/types.d.ts +60 -0
- package/dist/virtual-project.d.ts +12 -0
- package/dist/wasi-worker-browser.mjs +28176 -0
- package/dist/wasi-worker-browser.mjs.LICENSE.txt +12 -0
- package/package.json +76 -0
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
7
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
8
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
9
|
+
for (let key of __getOwnPropNames(mod))
|
|
10
|
+
if (!__hasOwnProp.call(to, key))
|
|
11
|
+
__defProp(to, key, {
|
|
12
|
+
get: () => mod[key],
|
|
13
|
+
enumerable: true
|
|
14
|
+
});
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
18
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
19
|
+
}) : x)(function(x) {
|
|
20
|
+
if (typeof require !== "undefined")
|
|
21
|
+
return require.apply(this, arguments);
|
|
22
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// src/create-browser-bundle-runtime.ts
|
|
26
|
+
import { Internals } from "remotion";
|
|
27
|
+
|
|
28
|
+
// src/browser-module-scope.ts
|
|
29
|
+
import * as React from "react";
|
|
30
|
+
import * as ReactDOM from "react-dom";
|
|
31
|
+
import * as ReactDOMClient from "react-dom/client";
|
|
32
|
+
import * as JSXDevRuntime from "react/jsx-dev-runtime";
|
|
33
|
+
import * as JSXRuntime from "react/jsx-runtime";
|
|
34
|
+
import * as Remotion from "remotion";
|
|
35
|
+
import * as RemotionNoReact from "remotion/no-react";
|
|
36
|
+
import * as RemotionVersion from "remotion/version";
|
|
37
|
+
var createBrowserModuleScope = (additionalModules) => {
|
|
38
|
+
let root = null;
|
|
39
|
+
let registrations = 0;
|
|
40
|
+
const registerRoot = (component) => {
|
|
41
|
+
if (!component || React.isValidElement(component) || typeof component !== "function" && (typeof component !== "object" || !("$$typeof" in component))) {
|
|
42
|
+
throw new Error("registerRoot() must receive a React component.");
|
|
43
|
+
}
|
|
44
|
+
if (registrations > 0) {
|
|
45
|
+
throw new Error("registerRoot() was called more than once.");
|
|
46
|
+
}
|
|
47
|
+
registrations++;
|
|
48
|
+
root = component;
|
|
49
|
+
};
|
|
50
|
+
const sharedModules = new Map([
|
|
51
|
+
["react", React],
|
|
52
|
+
["react-dom", ReactDOM],
|
|
53
|
+
["react-dom/client", ReactDOMClient],
|
|
54
|
+
["react/jsx-runtime", JSXRuntime],
|
|
55
|
+
["react/jsx-dev-runtime", JSXDevRuntime],
|
|
56
|
+
["remotion", { ...Remotion, registerRoot }],
|
|
57
|
+
["remotion/no-react", RemotionNoReact],
|
|
58
|
+
["remotion/version", RemotionVersion],
|
|
59
|
+
...additionalModules ?? []
|
|
60
|
+
]);
|
|
61
|
+
const resolveModule = (id) => {
|
|
62
|
+
if (!sharedModules.has(id)) {
|
|
63
|
+
throw new Error(`The browser bundle requested an unavailable shared module: "${id}".`);
|
|
64
|
+
}
|
|
65
|
+
return sharedModules.get(id);
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
resolveModule,
|
|
69
|
+
beginUpdate: () => {
|
|
70
|
+
registrations = 0;
|
|
71
|
+
},
|
|
72
|
+
getRoot: () => {
|
|
73
|
+
if (root === null) {
|
|
74
|
+
throw new Error("The browser bundle did not call registerRoot(). Use a normal Remotion project entry point.");
|
|
75
|
+
}
|
|
76
|
+
return root;
|
|
77
|
+
},
|
|
78
|
+
evaluate: (code) => {
|
|
79
|
+
registrations = 0;
|
|
80
|
+
try {
|
|
81
|
+
const evaluate = new Function("require", `${code}
|
|
82
|
+
//# sourceURL=remotion-browser-bundle.js`);
|
|
83
|
+
evaluate(resolveModule);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
throw new Error(`Could not evaluate the browser bundle: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/fast-refresh-bridge.ts
|
|
92
|
+
var browserBundleHmrBridgeName = "remotion_browserBundlerHmr";
|
|
93
|
+
var browserBundleHotUpdateName = "remotion_browserBundlerHotUpdate";
|
|
94
|
+
|
|
95
|
+
// src/hmr-assets.ts
|
|
96
|
+
var getAssetName = (nameOrUrl) => {
|
|
97
|
+
const url = new URL(nameOrUrl, "https://remotion.invalid");
|
|
98
|
+
return url.pathname.split("/").at(-1) ?? "";
|
|
99
|
+
};
|
|
100
|
+
var createBrowserHmrAssetManager = ({
|
|
101
|
+
createObjectUrl,
|
|
102
|
+
revokeObjectUrl
|
|
103
|
+
}) => {
|
|
104
|
+
const assets = new Map;
|
|
105
|
+
const updateAssets = (newAssets) => {
|
|
106
|
+
const nextAssetNames = new Set(newAssets.map((asset) => getAssetName(asset.name)));
|
|
107
|
+
for (const [name, asset] of assets) {
|
|
108
|
+
if (nextAssetNames.has(name)) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (asset.objectUrl) {
|
|
112
|
+
revokeObjectUrl(asset.objectUrl);
|
|
113
|
+
}
|
|
114
|
+
assets.delete(name);
|
|
115
|
+
}
|
|
116
|
+
for (const asset of newAssets) {
|
|
117
|
+
const name = getAssetName(asset.name);
|
|
118
|
+
const previous = assets.get(name);
|
|
119
|
+
if (previous?.objectUrl) {
|
|
120
|
+
revokeObjectUrl(previous.objectUrl);
|
|
121
|
+
}
|
|
122
|
+
assets.set(name, { content: asset.content, objectUrl: null });
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const bridge = {
|
|
126
|
+
getManifest: (name) => {
|
|
127
|
+
const asset = assets.get(getAssetName(name));
|
|
128
|
+
if (!asset) {
|
|
129
|
+
return Promise.resolve(undefined);
|
|
130
|
+
}
|
|
131
|
+
return Promise.resolve(JSON.parse(asset.content));
|
|
132
|
+
},
|
|
133
|
+
resolveScriptUrl: (name) => {
|
|
134
|
+
const assetName = getAssetName(name);
|
|
135
|
+
const asset = assets.get(assetName);
|
|
136
|
+
if (!asset) {
|
|
137
|
+
throw new Error(`Missing browser HMR asset: ${assetName}`);
|
|
138
|
+
}
|
|
139
|
+
asset.objectUrl ??= createObjectUrl(new Blob([asset.content], { type: "text/javascript" }));
|
|
140
|
+
return asset.objectUrl;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
return {
|
|
144
|
+
bridge,
|
|
145
|
+
dispose: () => {
|
|
146
|
+
for (const asset of assets.values()) {
|
|
147
|
+
if (asset.objectUrl) {
|
|
148
|
+
revokeObjectUrl(asset.objectUrl);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
assets.clear();
|
|
152
|
+
},
|
|
153
|
+
updateAssets
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// src/create-browser-bundle-runtime.ts
|
|
158
|
+
var createBrowserBundleRuntime = () => {
|
|
159
|
+
if (typeof document === "undefined" || !document.body) {
|
|
160
|
+
throw new Error("createBrowserBundleRuntime() must be called in a browser.");
|
|
161
|
+
}
|
|
162
|
+
if (Object.hasOwn(globalThis, browserBundleHmrBridgeName)) {
|
|
163
|
+
throw new Error("Only one Fast Refresh runtime can use a preview document.");
|
|
164
|
+
}
|
|
165
|
+
const assets = createBrowserHmrAssetManager({
|
|
166
|
+
createObjectUrl: (blob) => URL.createObjectURL(blob),
|
|
167
|
+
revokeObjectUrl: (url) => URL.revokeObjectURL(url)
|
|
168
|
+
});
|
|
169
|
+
let hotRuntime = null;
|
|
170
|
+
let scope = null;
|
|
171
|
+
let sessionId = null;
|
|
172
|
+
let disposed = false;
|
|
173
|
+
let ownsComponentIdentityResolver = false;
|
|
174
|
+
let queue = Promise.resolve();
|
|
175
|
+
const previousRequire = Object.getOwnPropertyDescriptor(globalThis, "require");
|
|
176
|
+
const previousHotUpdate = Object.getOwnPropertyDescriptor(globalThis, browserBundleHotUpdateName);
|
|
177
|
+
const bridge = {
|
|
178
|
+
...assets.bridge,
|
|
179
|
+
setHotRuntime: (runtime) => {
|
|
180
|
+
hotRuntime = runtime;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
Object.defineProperty(globalThis, browserBundleHmrBridgeName, {
|
|
184
|
+
configurable: true,
|
|
185
|
+
value: bridge
|
|
186
|
+
});
|
|
187
|
+
const getHotRuntime = () => {
|
|
188
|
+
if (hotRuntime === null) {
|
|
189
|
+
throw new Error("The browser bundle did not initialize its HMR runtime.");
|
|
190
|
+
}
|
|
191
|
+
return hotRuntime;
|
|
192
|
+
};
|
|
193
|
+
return {
|
|
194
|
+
applyBundle: (bundle) => {
|
|
195
|
+
const run = queue.then(async () => {
|
|
196
|
+
if (disposed) {
|
|
197
|
+
throw new Error("The browser bundle runtime was disposed.");
|
|
198
|
+
}
|
|
199
|
+
const update = bundle.fastRefresh;
|
|
200
|
+
if (!update) {
|
|
201
|
+
throw new Error("Create the bundler with enableFastRefresh: true before applying bundles.");
|
|
202
|
+
}
|
|
203
|
+
if (sessionId !== null && sessionId !== update.sessionId) {
|
|
204
|
+
throw new Error("The compiler session changed. Create a new preview runtime for the new project.");
|
|
205
|
+
}
|
|
206
|
+
const { default: refresh } = await import("react-refresh/runtime");
|
|
207
|
+
if (disposed) {
|
|
208
|
+
throw new Error("The browser bundle runtime was disposed.");
|
|
209
|
+
}
|
|
210
|
+
if (typeof refresh.performReactRefresh !== "function") {
|
|
211
|
+
throw new Error("Fast Refresh requires a development React renderer in the preview document.");
|
|
212
|
+
}
|
|
213
|
+
if (scope === null) {
|
|
214
|
+
const hook = Reflect.get(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__");
|
|
215
|
+
if (hook === null || typeof hook !== "object" || !("renderers" in hook) || !(hook.renderers instanceof Map) || "isDisabled" in hook && hook.isDisabled) {
|
|
216
|
+
throw new Error("Inject the React Refresh hook before importing the development preview renderer.");
|
|
217
|
+
}
|
|
218
|
+
const renderers = [...hook.renderers.values()];
|
|
219
|
+
if (renderers.length > 0 && !renderers.some((renderer) => renderer !== null && typeof renderer === "object" && ("scheduleRefresh" in renderer) && typeof renderer.scheduleRefresh === "function" && ("setRefreshHandler" in renderer) && typeof renderer.setRefreshHandler === "function")) {
|
|
220
|
+
throw new Error("Fast Refresh requires development React DOM. Inject the React Refresh hook before importing the preview renderer.");
|
|
221
|
+
}
|
|
222
|
+
const initialScope = createBrowserModuleScope(new Map([["react-refresh/runtime", refresh]]));
|
|
223
|
+
Internals.setComponentIdentityResolver((component) => refresh.getFamilyByType(component) ?? component);
|
|
224
|
+
ownsComponentIdentityResolver = true;
|
|
225
|
+
Object.defineProperty(globalThis, "require", {
|
|
226
|
+
configurable: true,
|
|
227
|
+
value: initialScope.resolveModule
|
|
228
|
+
});
|
|
229
|
+
initialScope.evaluate(bundle.code);
|
|
230
|
+
initialScope.getRoot();
|
|
231
|
+
scope = initialScope;
|
|
232
|
+
sessionId = update.sessionId;
|
|
233
|
+
} else {
|
|
234
|
+
const hot = getHotRuntime();
|
|
235
|
+
if (hot.getHash() === update.hash) {
|
|
236
|
+
return scope.getRoot();
|
|
237
|
+
}
|
|
238
|
+
if (hot.getHash() !== update.previousHash) {
|
|
239
|
+
throw new Error("Fast Refresh bundles must be applied in compilation order. A compiled update was skipped.");
|
|
240
|
+
}
|
|
241
|
+
if (hot.status() !== "idle") {
|
|
242
|
+
throw new Error(`Cannot apply a Fast Refresh update while HMR is "${hot.status()}".`);
|
|
243
|
+
}
|
|
244
|
+
assets.updateAssets(update.assets);
|
|
245
|
+
scope.beginUpdate();
|
|
246
|
+
const changedModules = await hot.check();
|
|
247
|
+
if (disposed) {
|
|
248
|
+
throw new Error("The browser bundle runtime was disposed.");
|
|
249
|
+
}
|
|
250
|
+
if (changedModules === null) {
|
|
251
|
+
throw new Error("Rspack could not find the Fast Refresh update.");
|
|
252
|
+
}
|
|
253
|
+
await hot.apply();
|
|
254
|
+
if (disposed) {
|
|
255
|
+
throw new Error("The browser bundle runtime was disposed.");
|
|
256
|
+
}
|
|
257
|
+
refresh.performReactRefresh();
|
|
258
|
+
}
|
|
259
|
+
if (disposed) {
|
|
260
|
+
throw new Error("The browser bundle runtime was disposed.");
|
|
261
|
+
}
|
|
262
|
+
if (getHotRuntime().getHash() !== update.hash) {
|
|
263
|
+
throw new Error("Rspack did not apply the expected Fast Refresh update.");
|
|
264
|
+
}
|
|
265
|
+
return scope.getRoot();
|
|
266
|
+
});
|
|
267
|
+
queue = run.then(() => {
|
|
268
|
+
return;
|
|
269
|
+
}, () => {
|
|
270
|
+
return;
|
|
271
|
+
});
|
|
272
|
+
return run;
|
|
273
|
+
},
|
|
274
|
+
dispose: () => {
|
|
275
|
+
if (disposed) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
disposed = true;
|
|
279
|
+
if (ownsComponentIdentityResolver) {
|
|
280
|
+
Internals.setComponentIdentityResolver(null);
|
|
281
|
+
}
|
|
282
|
+
assets.dispose();
|
|
283
|
+
Reflect.deleteProperty(globalThis, browserBundleHmrBridgeName);
|
|
284
|
+
if (previousRequire) {
|
|
285
|
+
Object.defineProperty(globalThis, "require", previousRequire);
|
|
286
|
+
} else {
|
|
287
|
+
Reflect.deleteProperty(globalThis, "require");
|
|
288
|
+
}
|
|
289
|
+
if (previousHotUpdate) {
|
|
290
|
+
Object.defineProperty(globalThis, browserBundleHotUpdateName, previousHotUpdate);
|
|
291
|
+
} else {
|
|
292
|
+
Reflect.deleteProperty(globalThis, browserBundleHotUpdateName);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
};
|
|
297
|
+
// src/create-browser-composition-observer.tsx
|
|
298
|
+
import React2, { Suspense, useEffect, useMemo, useState } from "react";
|
|
299
|
+
import { createRoot } from "react-dom/client";
|
|
300
|
+
import { Internals as Internals2 } from "remotion";
|
|
301
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
302
|
+
var environment = {
|
|
303
|
+
isClientSideRendering: false,
|
|
304
|
+
isPlayer: false,
|
|
305
|
+
isReadOnlyStudio: false,
|
|
306
|
+
isRendering: false,
|
|
307
|
+
isStudio: false
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
class RegistrationErrorBoundary extends React2.Component {
|
|
311
|
+
state = { failed: false, revision: this.props.revision };
|
|
312
|
+
static getDerivedStateFromProps(props, state) {
|
|
313
|
+
return props.revision === state.revision ? null : { failed: false, revision: props.revision };
|
|
314
|
+
}
|
|
315
|
+
static getDerivedStateFromError() {
|
|
316
|
+
return { failed: true };
|
|
317
|
+
}
|
|
318
|
+
componentDidCatch(error) {
|
|
319
|
+
this.props.onError(error, this.props.revision);
|
|
320
|
+
}
|
|
321
|
+
render() {
|
|
322
|
+
return this.state.failed ? null : this.props.children;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
var RegistrationCommitted = ({ revision, onCommit }) => {
|
|
326
|
+
useEffect(() => onCommit(revision), [onCommit, revision]);
|
|
327
|
+
return null;
|
|
328
|
+
};
|
|
329
|
+
var ObserveMetadata = ({
|
|
330
|
+
composition,
|
|
331
|
+
compositionId,
|
|
332
|
+
inputProps,
|
|
333
|
+
revision,
|
|
334
|
+
registeredRevision,
|
|
335
|
+
onChange,
|
|
336
|
+
onError
|
|
337
|
+
}) => {
|
|
338
|
+
useEffect(() => {
|
|
339
|
+
if (registeredRevision !== revision) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (!composition) {
|
|
343
|
+
onError(new Error(`No composition with ID "${compositionId}" is registered.`), revision);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const controller = new AbortController;
|
|
347
|
+
const defaultProps = composition.defaultProps ?? {};
|
|
348
|
+
try {
|
|
349
|
+
const config = Internals2.resolveVideoConfig({
|
|
350
|
+
compositionId,
|
|
351
|
+
compositionWidth: composition.width ?? null,
|
|
352
|
+
compositionHeight: composition.height ?? null,
|
|
353
|
+
compositionFps: composition.fps ?? null,
|
|
354
|
+
compositionDurationInFrames: composition.durationInFrames ?? null,
|
|
355
|
+
calculateMetadata: composition.calculateMetadata,
|
|
356
|
+
defaultProps,
|
|
357
|
+
inputProps: { ...defaultProps, ...inputProps },
|
|
358
|
+
signal: controller.signal
|
|
359
|
+
});
|
|
360
|
+
Promise.resolve(config).then((videoConfig) => {
|
|
361
|
+
if (!controller.signal.aborted) {
|
|
362
|
+
onChange({ ...videoConfig, component: composition.component }, revision);
|
|
363
|
+
}
|
|
364
|
+
}, (error) => {
|
|
365
|
+
if (!controller.signal.aborted) {
|
|
366
|
+
onError(error, revision);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
} catch (error) {
|
|
370
|
+
onError(error, revision);
|
|
371
|
+
}
|
|
372
|
+
return () => controller.abort();
|
|
373
|
+
}, [
|
|
374
|
+
composition,
|
|
375
|
+
compositionId,
|
|
376
|
+
inputProps,
|
|
377
|
+
onChange,
|
|
378
|
+
onError,
|
|
379
|
+
registeredRevision,
|
|
380
|
+
revision
|
|
381
|
+
]);
|
|
382
|
+
return null;
|
|
383
|
+
};
|
|
384
|
+
var ObserveComposition = ({
|
|
385
|
+
root: RegisteredRoot,
|
|
386
|
+
compositionId,
|
|
387
|
+
inputProps,
|
|
388
|
+
revision,
|
|
389
|
+
onChange,
|
|
390
|
+
onError
|
|
391
|
+
}) => {
|
|
392
|
+
const [registeredRevision, setRegisteredRevision] = useState(null);
|
|
393
|
+
const [compositions, setCompositions] = useState([]);
|
|
394
|
+
const setters = useMemo(() => ({
|
|
395
|
+
registerComposition: (composition) => {
|
|
396
|
+
setCompositions((current) => {
|
|
397
|
+
if (current.some(({ id }) => id === composition.id)) {
|
|
398
|
+
throw new Error(`A composition with ID "${composition.id}" was registered more than once.`);
|
|
399
|
+
}
|
|
400
|
+
return [...current, composition];
|
|
401
|
+
});
|
|
402
|
+
},
|
|
403
|
+
unregisterComposition: (id) => {
|
|
404
|
+
setCompositions((current) => current.filter((composition) => composition.id !== id));
|
|
405
|
+
},
|
|
406
|
+
registerFolder: () => {
|
|
407
|
+
return;
|
|
408
|
+
},
|
|
409
|
+
unregisterFolder: () => {
|
|
410
|
+
return;
|
|
411
|
+
},
|
|
412
|
+
setCanvasContent: () => {
|
|
413
|
+
return;
|
|
414
|
+
},
|
|
415
|
+
setCurrentAssetMetadata: () => {
|
|
416
|
+
return;
|
|
417
|
+
},
|
|
418
|
+
onlyRenderComposition: null
|
|
419
|
+
}), []);
|
|
420
|
+
const registration = useMemo(() => /* @__PURE__ */ jsxs(Suspense, {
|
|
421
|
+
fallback: null,
|
|
422
|
+
children: [
|
|
423
|
+
/* @__PURE__ */ jsx(RegisteredRoot, {}),
|
|
424
|
+
/* @__PURE__ */ jsx(RegistrationCommitted, {
|
|
425
|
+
revision,
|
|
426
|
+
onCommit: setRegisteredRevision
|
|
427
|
+
})
|
|
428
|
+
]
|
|
429
|
+
}), [RegisteredRoot, revision]);
|
|
430
|
+
return /* @__PURE__ */ jsx(Internals2.RemotionEnvironmentContext.Provider, {
|
|
431
|
+
value: environment,
|
|
432
|
+
children: /* @__PURE__ */ jsxs(Internals2.CompositionSetters.Provider, {
|
|
433
|
+
value: setters,
|
|
434
|
+
children: [
|
|
435
|
+
registration,
|
|
436
|
+
/* @__PURE__ */ jsx(ObserveMetadata, {
|
|
437
|
+
composition: compositions.find(({ id }) => id === compositionId) ?? null,
|
|
438
|
+
compositionId,
|
|
439
|
+
inputProps,
|
|
440
|
+
revision,
|
|
441
|
+
registeredRevision,
|
|
442
|
+
onChange,
|
|
443
|
+
onError
|
|
444
|
+
})
|
|
445
|
+
]
|
|
446
|
+
})
|
|
447
|
+
});
|
|
448
|
+
};
|
|
449
|
+
var createBrowserCompositionObserver = ({
|
|
450
|
+
onChange,
|
|
451
|
+
onError
|
|
452
|
+
}) => {
|
|
453
|
+
if (typeof document === "undefined" || !document.body) {
|
|
454
|
+
throw new Error("Composition observation requires a browser document.");
|
|
455
|
+
}
|
|
456
|
+
const container = document.createElement("div");
|
|
457
|
+
container.hidden = true;
|
|
458
|
+
document.body.appendChild(container);
|
|
459
|
+
let disposed = false;
|
|
460
|
+
let revision = 0;
|
|
461
|
+
let lastError = null;
|
|
462
|
+
const reportError = (error, errorRevision) => {
|
|
463
|
+
if (!disposed && errorRevision === revision) {
|
|
464
|
+
if (lastError !== null && lastError.error === error && lastError.revision === errorRevision) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
lastError = { error, revision: errorRevision };
|
|
468
|
+
onError(error instanceof Error ? error : new Error(String(error)));
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
const onComposition = (composition, resolvedRevision) => {
|
|
472
|
+
if (disposed || resolvedRevision !== revision) {
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
try {
|
|
476
|
+
onChange(composition);
|
|
477
|
+
} catch (error) {
|
|
478
|
+
reportError(error, resolvedRevision);
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
const root = createRoot(container, {
|
|
482
|
+
onCaughtError: (error) => reportError(error, revision),
|
|
483
|
+
onUncaughtError: (error) => reportError(error, revision)
|
|
484
|
+
});
|
|
485
|
+
return {
|
|
486
|
+
update: (selection) => {
|
|
487
|
+
if (disposed) {
|
|
488
|
+
throw new Error("The composition observer was disposed.");
|
|
489
|
+
}
|
|
490
|
+
revision++;
|
|
491
|
+
root.render(/* @__PURE__ */ jsx(RegistrationErrorBoundary, {
|
|
492
|
+
revision,
|
|
493
|
+
onError: reportError,
|
|
494
|
+
children: /* @__PURE__ */ jsx(ObserveComposition, {
|
|
495
|
+
...selection,
|
|
496
|
+
revision,
|
|
497
|
+
onChange: onComposition,
|
|
498
|
+
onError: reportError
|
|
499
|
+
})
|
|
500
|
+
}));
|
|
501
|
+
},
|
|
502
|
+
dispose: () => {
|
|
503
|
+
if (disposed) {
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
disposed = true;
|
|
507
|
+
try {
|
|
508
|
+
root.unmount();
|
|
509
|
+
} finally {
|
|
510
|
+
container.remove();
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
};
|
|
515
|
+
// src/get-browser-composition.tsx
|
|
516
|
+
import React3, { Suspense as Suspense2, useEffect as useEffect2 } from "react";
|
|
517
|
+
import { createRoot as createRoot2 } from "react-dom/client";
|
|
518
|
+
import { Internals as Internals3 } from "remotion";
|
|
519
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
520
|
+
|
|
521
|
+
class RegistrationErrorBoundary2 extends React3.Component {
|
|
522
|
+
state = { failed: false };
|
|
523
|
+
static getDerivedStateFromError() {
|
|
524
|
+
return { failed: true };
|
|
525
|
+
}
|
|
526
|
+
componentDidCatch(error) {
|
|
527
|
+
this.props.onError(error);
|
|
528
|
+
}
|
|
529
|
+
render() {
|
|
530
|
+
return this.state.failed ? null : this.props.children;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
var RegistrationComplete = ({ onComplete }) => {
|
|
534
|
+
useEffect2(onComplete, [onComplete]);
|
|
535
|
+
return null;
|
|
536
|
+
};
|
|
537
|
+
var getBrowserComposition = async ({
|
|
538
|
+
root: RegisteredRoot,
|
|
539
|
+
compositionId,
|
|
540
|
+
inputProps,
|
|
541
|
+
signal
|
|
542
|
+
}) => {
|
|
543
|
+
if (signal?.aborted) {
|
|
544
|
+
throw signal.reason;
|
|
545
|
+
}
|
|
546
|
+
if (typeof document === "undefined" || !document.body) {
|
|
547
|
+
throw new Error("getBrowserComposition() must be called in a browser.");
|
|
548
|
+
}
|
|
549
|
+
const container = document.createElement("div");
|
|
550
|
+
container.hidden = true;
|
|
551
|
+
document.body.appendChild(container);
|
|
552
|
+
const controller = new AbortController;
|
|
553
|
+
const abort = () => controller.abort(signal?.reason);
|
|
554
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
555
|
+
const compositions = new Map;
|
|
556
|
+
let reactRoot = null;
|
|
557
|
+
let finished = false;
|
|
558
|
+
let resolving = false;
|
|
559
|
+
try {
|
|
560
|
+
return await new Promise((resolve, reject) => {
|
|
561
|
+
const onError = (error) => {
|
|
562
|
+
if (finished) {
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
finished = true;
|
|
566
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
567
|
+
};
|
|
568
|
+
controller.signal.addEventListener("abort", () => {
|
|
569
|
+
if (finished) {
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
finished = true;
|
|
573
|
+
reject(controller.signal.reason);
|
|
574
|
+
}, { once: true });
|
|
575
|
+
const onComplete = () => {
|
|
576
|
+
queueMicrotask(() => {
|
|
577
|
+
if (finished || resolving) {
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
resolving = true;
|
|
581
|
+
try {
|
|
582
|
+
const composition = compositions.get(compositionId);
|
|
583
|
+
if (!composition) {
|
|
584
|
+
throw new Error(`No composition with ID "${compositionId}" was registered. Available IDs: ${[...compositions.keys()].join(", ") || "(none)"}.`);
|
|
585
|
+
}
|
|
586
|
+
const defaultProps = composition.defaultProps ?? {};
|
|
587
|
+
const config = Internals3.resolveVideoConfig({
|
|
588
|
+
compositionId,
|
|
589
|
+
compositionWidth: composition.width ?? null,
|
|
590
|
+
compositionHeight: composition.height ?? null,
|
|
591
|
+
compositionFps: composition.fps ?? null,
|
|
592
|
+
compositionDurationInFrames: composition.durationInFrames ?? null,
|
|
593
|
+
calculateMetadata: composition.calculateMetadata,
|
|
594
|
+
defaultProps,
|
|
595
|
+
inputProps: { ...defaultProps, ...inputProps },
|
|
596
|
+
signal: controller.signal
|
|
597
|
+
});
|
|
598
|
+
Promise.resolve(config).then((videoConfig) => {
|
|
599
|
+
if (finished) {
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
finished = true;
|
|
603
|
+
resolve({ ...videoConfig, component: composition.component });
|
|
604
|
+
}, onError);
|
|
605
|
+
} catch (error) {
|
|
606
|
+
onError(error);
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
};
|
|
610
|
+
const setters = {
|
|
611
|
+
registerComposition: (composition) => {
|
|
612
|
+
if (compositions.has(composition.id)) {
|
|
613
|
+
throw new Error(`A composition with ID "${composition.id}" was registered more than once.`);
|
|
614
|
+
}
|
|
615
|
+
compositions.set(composition.id, composition);
|
|
616
|
+
},
|
|
617
|
+
unregisterComposition: (id) => {
|
|
618
|
+
compositions.delete(id);
|
|
619
|
+
},
|
|
620
|
+
registerFolder: () => {
|
|
621
|
+
return;
|
|
622
|
+
},
|
|
623
|
+
unregisterFolder: () => {
|
|
624
|
+
return;
|
|
625
|
+
},
|
|
626
|
+
setCanvasContent: () => {
|
|
627
|
+
return;
|
|
628
|
+
},
|
|
629
|
+
setCurrentAssetMetadata: () => {
|
|
630
|
+
return;
|
|
631
|
+
},
|
|
632
|
+
onlyRenderComposition: null
|
|
633
|
+
};
|
|
634
|
+
reactRoot = createRoot2(container, {
|
|
635
|
+
onCaughtError: onError,
|
|
636
|
+
onUncaughtError: onError
|
|
637
|
+
});
|
|
638
|
+
reactRoot.render(/* @__PURE__ */ jsx2(RegistrationErrorBoundary2, {
|
|
639
|
+
onError,
|
|
640
|
+
children: /* @__PURE__ */ jsx2(Internals3.RemotionEnvironmentContext.Provider, {
|
|
641
|
+
value: {
|
|
642
|
+
isClientSideRendering: false,
|
|
643
|
+
isPlayer: false,
|
|
644
|
+
isReadOnlyStudio: false,
|
|
645
|
+
isRendering: false,
|
|
646
|
+
isStudio: false
|
|
647
|
+
},
|
|
648
|
+
children: /* @__PURE__ */ jsx2(Internals3.CompositionSetters.Provider, {
|
|
649
|
+
value: setters,
|
|
650
|
+
children: /* @__PURE__ */ jsxs2(Suspense2, {
|
|
651
|
+
fallback: null,
|
|
652
|
+
children: [
|
|
653
|
+
/* @__PURE__ */ jsx2(RegisteredRoot, {}),
|
|
654
|
+
/* @__PURE__ */ jsx2(RegistrationComplete, {
|
|
655
|
+
onComplete
|
|
656
|
+
})
|
|
657
|
+
]
|
|
658
|
+
})
|
|
659
|
+
})
|
|
660
|
+
})
|
|
661
|
+
}));
|
|
662
|
+
});
|
|
663
|
+
} finally {
|
|
664
|
+
finished = true;
|
|
665
|
+
signal?.removeEventListener("abort", abort);
|
|
666
|
+
controller.abort();
|
|
667
|
+
try {
|
|
668
|
+
reactRoot?.unmount();
|
|
669
|
+
} finally {
|
|
670
|
+
compositions.clear();
|
|
671
|
+
container.remove();
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
};
|
|
675
|
+
// src/load-browser-bundle.ts
|
|
676
|
+
var loadBrowserBundle = ({ bundle }) => {
|
|
677
|
+
if (bundle.fastRefresh) {
|
|
678
|
+
throw new Error("Use createBrowserBundleRuntime() to load a Fast Refresh bundle.");
|
|
679
|
+
}
|
|
680
|
+
const scope = createBrowserModuleScope(null);
|
|
681
|
+
scope.evaluate(bundle.code);
|
|
682
|
+
return scope.getRoot();
|
|
683
|
+
};
|
|
684
|
+
export {
|
|
685
|
+
loadBrowserBundle,
|
|
686
|
+
getBrowserComposition,
|
|
687
|
+
createBrowserCompositionObserver,
|
|
688
|
+
createBrowserBundleRuntime
|
|
689
|
+
};
|