@remotion/renderer 4.0.58 → 4.0.60

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.
@@ -28,6 +28,7 @@ exports.CDPSession = exports.CDPSessionEmittedEvents = exports.Connection = void
28
28
  * See the License for the specific language governing permissions and
29
29
  * limitations under the License.
30
30
  */
31
+ const logger_1 = require("../logger");
31
32
  const assert_1 = require("./assert");
32
33
  const Errors_1 = require("./Errors");
33
34
  const EventEmitter_1 = require("./EventEmitter");
@@ -62,11 +63,14 @@ class Connection extends EventEmitter_1.EventEmitter {
62
63
  const params = paramArgs.length ? paramArgs[0] : undefined;
63
64
  const id = this._rawSend({ method, params });
64
65
  return new Promise((resolve, reject) => {
66
+ var _a;
65
67
  __classPrivateFieldGet(this, _Connection_callbacks, "f").set(id, {
66
68
  resolve,
67
69
  reject,
68
70
  method,
69
71
  returnSize: true,
72
+ stack: (_a = new Error().stack) !== null && _a !== void 0 ? _a : '',
73
+ fn: method + JSON.stringify(params),
70
74
  });
71
75
  });
72
76
  }
@@ -192,11 +196,20 @@ class CDPSession extends EventEmitter_1.EventEmitter {
192
196
  params,
193
197
  });
194
198
  return new Promise((resolve, reject) => {
199
+ var _a;
200
+ if (__classPrivateFieldGet(this, _CDPSession_callbacks, "f").size > 100) {
201
+ for (const callback of __classPrivateFieldGet(this, _CDPSession_callbacks, "f").values()) {
202
+ logger_1.Log.info(callback.fn);
203
+ }
204
+ throw new Error('Leak detected: Too many callbacks');
205
+ }
195
206
  __classPrivateFieldGet(this, _CDPSession_callbacks, "f").set(id, {
196
207
  resolve,
197
208
  reject,
198
209
  method,
199
210
  returnSize: true,
211
+ stack: (_a = new Error().stack) !== null && _a !== void 0 ? _a : '',
212
+ fn: method + JSON.stringify(params),
200
213
  });
201
214
  });
202
215
  }
@@ -34,8 +34,7 @@ export declare class DOMWorld {
34
34
  timeout: number | null;
35
35
  pageFunction: Function | string;
36
36
  title: string;
37
- }): Promise<JSHandle>;
38
- title(): Promise<string>;
37
+ }): WaitTask;
39
38
  }
40
39
  interface WaitTaskOptions {
41
40
  domWorld: DOMWorld;
@@ -99,11 +99,6 @@ class DOMWorld {
99
99
  timeout,
100
100
  args: [],
101
101
  browser,
102
- }).promise;
103
- }
104
- title() {
105
- return this.evaluate(() => {
106
- return document.title;
107
102
  });
108
103
  }
109
104
  }
@@ -244,6 +239,9 @@ _WaitTask_domWorld = new WeakMap(), _WaitTask_timeout = new WeakMap(), _WaitTask
244
239
  }
245
240
  __classPrivateFieldGet(this, _WaitTask_browser, "f").off("closed" /* BrowserEmittedEvents.Closed */, this.onBrowserClose);
246
241
  __classPrivateFieldGet(this, _WaitTask_browser, "f").off("closed-silent" /* BrowserEmittedEvents.ClosedSilent */, this.onBrowserCloseSilent);
242
+ if (__classPrivateFieldGet(this, _WaitTask_domWorld, "f")._waitTasks.size > 100) {
243
+ throw new Error('Leak detected: Too many WaitTasks');
244
+ }
247
245
  __classPrivateFieldGet(this, _WaitTask_domWorld, "f")._waitTasks.delete(this);
248
246
  };
249
247
  function waitForPredicatePageFunction(predicateBody, timeout, ...args) {
@@ -77,7 +77,7 @@ class JSHandle {
77
77
  const type = __classPrivateFieldGet(this, _JSHandle_remoteObject, "f").subtype || __classPrivateFieldGet(this, _JSHandle_remoteObject, "f").type;
78
78
  return 'JSHandle@' + type;
79
79
  }
80
- return 'JSHandle:' + (0, util_1.valueFromRemoteObject)(__classPrivateFieldGet(this, _JSHandle_remoteObject, "f"));
80
+ return (0, util_1.valueFromRemoteObject)(__classPrivateFieldGet(this, _JSHandle_remoteObject, "f"));
81
81
  }
82
82
  }
83
83
  exports.JSHandle = JSHandle;
package/dist/client.d.ts CHANGED
@@ -311,7 +311,7 @@ export declare const BrowserSafeApis: {
311
311
  cliFlag: string;
312
312
  docLink: string;
313
313
  name: string;
314
- type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
314
+ type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
315
315
  ssrName: string;
316
316
  description: () => JSX.Element;
317
317
  };
@@ -3,6 +3,10 @@ export declare const testPortAvailableOnMultipleHosts: ({ hosts, port, }: {
3
3
  port: number;
4
4
  hosts: string[];
5
5
  }) => Promise<PortStatus>;
6
+ export declare const getPortConfig: () => {
7
+ host: string;
8
+ hostsToTry: string[];
9
+ };
6
10
  export declare const getDesiredPort: ({ desiredPort, from, hostsToTry, to, }: {
7
11
  desiredPort: number | undefined;
8
12
  from: number;
package/dist/get-port.js CHANGED
@@ -3,8 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getDesiredPort = exports.testPortAvailableOnMultipleHosts = void 0;
6
+ exports.getDesiredPort = exports.getPortConfig = exports.testPortAvailableOnMultipleHosts = void 0;
7
7
  const net_1 = __importDefault(require("net"));
8
+ const is_ipv6_supported_1 = require("./is-ipv6-supported");
8
9
  const locks_1 = require("./locks");
9
10
  const isPortAvailableOnHost = ({ portToTry, host, }) => {
10
11
  return new Promise((resolve) => {
@@ -47,6 +48,14 @@ const getPort = async ({ from, to, hostsToTest, }) => {
47
48
  throw new Error('No available ports found');
48
49
  };
49
50
  const portLocks = (0, locks_1.createLock)({ timeout: 10000 });
51
+ const getPortConfig = () => {
52
+ const host = (0, is_ipv6_supported_1.isIpV6Supported)() ? '::' : '0.0.0.0';
53
+ const hostsToTry = (0, is_ipv6_supported_1.isIpV6Supported)()
54
+ ? ['::', '::1', '0.0.0.0', '127.0.0.1']
55
+ : ['0.0.0.0', '127.0.0.1'];
56
+ return { host, hostsToTry };
57
+ };
58
+ exports.getPortConfig = getPortConfig;
50
59
  const getDesiredPort = async ({ desiredPort, from, hostsToTry, to, }) => {
51
60
  await portLocks.waitForAllToBeDone();
52
61
  const lockPortSelection = portLocks.lock();
@@ -54,7 +63,7 @@ const getDesiredPort = async ({ desiredPort, from, hostsToTry, to, }) => {
54
63
  if (typeof desiredPort !== 'undefined' &&
55
64
  (await (0, exports.testPortAvailableOnMultipleHosts)({
56
65
  port: desiredPort,
57
- hosts: ['::', '::1'],
66
+ hosts: hostsToTry,
58
67
  })) === 'available') {
59
68
  return { port: desiredPort, didUsePort };
60
69
  }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="react" />
1
3
  import execa from 'execa';
2
4
  import { HeadlessBrowser } from './browser/Browser';
3
5
  import { SymbolicateableError } from './error-handling/symbolicateable-error';
@@ -135,8 +137,8 @@ export declare const RenderInternals: {
135
137
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
136
138
  DEFAULT_BROWSER: "chrome";
137
139
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
138
- DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
139
- validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
140
+ DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
141
+ validateOpenGlRenderer: (option: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
140
142
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
141
143
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
142
144
  validateJpegQuality: (q: number | undefined) => void;
@@ -327,8 +329,8 @@ export declare const RenderInternals: {
327
329
  };
328
330
  validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
329
331
  validVideoImageFormats: readonly ["png", "jpeg", "none"];
330
- DEFAULT_STILL_IMAGE_FORMAT: "png" | "jpeg" | "pdf" | "webp";
331
- DEFAULT_VIDEO_IMAGE_FORMAT: "png" | "jpeg" | "none";
332
+ DEFAULT_STILL_IMAGE_FORMAT: "jpeg" | "png" | "webp" | "pdf";
333
+ DEFAULT_VIDEO_IMAGE_FORMAT: "jpeg" | "png" | "none";
332
334
  DEFAULT_JPEG_QUALITY: number;
333
335
  chalk: {
334
336
  enabled: () => boolean;
@@ -427,7 +429,7 @@ export declare const RenderInternals: {
427
429
  frame: number;
428
430
  serializedInputPropsWithCustomSchema: string;
429
431
  serializedResolvedPropsWithCustomSchema: string;
430
- imageFormat: "png" | "jpeg" | "pdf" | "webp";
432
+ imageFormat: "jpeg" | "png" | "webp" | "pdf";
431
433
  jpegQuality: number;
432
434
  puppeteerInstance: HeadlessBrowser | null;
433
435
  envVariables: Record<string, string>;
@@ -527,4 +529,8 @@ export declare const RenderInternals: {
527
529
  feature: string;
528
530
  status: string;
529
531
  }[]>;
532
+ getPortConfig: () => {
533
+ host: string;
534
+ hostsToTry: string[];
535
+ };
530
536
  };
package/dist/index.js CHANGED
@@ -195,6 +195,7 @@ exports.RenderInternals = {
195
195
  copyImageToClipboard: copy_to_clipboard_1.copyImageToClipboard,
196
196
  isIpV6Supported: is_ipv6_supported_1.isIpV6Supported,
197
197
  getChromiumGpuInformation: test_gpu_1.getChromiumGpuInformation,
198
+ getPortConfig: get_port_1.getPortConfig,
198
199
  };
199
200
  // Warn of potential performance issues with Apple Silicon (M1 chip under Rosetta)
200
201
  (0, check_apple_silicon_1.checkNodeVersionAndWarnAboutRosetta)();
@@ -4,7 +4,7 @@ export declare const glOption: {
4
4
  cliFlag: string;
5
5
  docLink: string;
6
6
  name: string;
7
- type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
7
+ type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
8
8
  ssrName: string;
9
9
  description: () => JSX.Element;
10
10
  };
@@ -116,7 +116,7 @@ export declare const allOptions: {
116
116
  cliFlag: string;
117
117
  docLink: string;
118
118
  name: string;
119
- type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
119
+ type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
120
120
  ssrName: string;
121
121
  description: () => JSX.Element;
122
122
  };
@@ -0,0 +1,8 @@
1
+ export declare const deleteAfterOption: {
2
+ name: string;
3
+ cliFlag: "delete-after";
4
+ description: () => JSX.Element;
5
+ ssrName: "deleteAfter";
6
+ docLink: string;
7
+ type: number | null;
8
+ };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteAfterOption = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ exports.deleteAfterOption = {
6
+ name: 'Render expiry days',
7
+ cliFlag: 'delete-after',
8
+ description: () => {
9
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Automatically delete the render after a certain period. Accepted values are ", (0, jsx_runtime_1.jsx)("code", { children: "1-day" }), ", ", (0, jsx_runtime_1.jsx)("code", { children: "3-days" }), ", ", (0, jsx_runtime_1.jsx)("code", { children: "7-days" }), " and", ' ', (0, jsx_runtime_1.jsx)("code", { children: "30-days" }), ".", (0, jsx_runtime_1.jsx)("br", {}), " For this to work, your bucket needs to have", ' ', (0, jsx_runtime_1.jsx)("a", { href: "/docs/lambda/autodelete", children: "lifecycles enabled" }), "."] }));
10
+ },
11
+ ssrName: 'deleteAfter',
12
+ docLink: 'https://www.remotion.dev/docs/autodelete',
13
+ type: 0,
14
+ };
@@ -0,0 +1,7 @@
1
+ import type { Codec } from './codec';
2
+ export declare const x264PresetOptions: readonly ["ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo"];
3
+ export type x264Preset = typeof x264PresetOptions[number];
4
+ export declare const validateSelectedCodecAndPresetCombination: ({ codec, x264Preset, }: {
5
+ codec: Codec;
6
+ x264Preset: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | undefined;
7
+ }) => void;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSelectedCodecAndPresetCombination = exports.x264PresetOptions = void 0;
4
+ exports.x264PresetOptions = [
5
+ 'ultrafast',
6
+ 'superfast',
7
+ 'veryfast',
8
+ 'faster',
9
+ 'fast',
10
+ 'medium',
11
+ 'slow',
12
+ 'slower',
13
+ 'veryslow',
14
+ 'placebo',
15
+ ];
16
+ const validateSelectedCodecAndPresetCombination = ({ codec, x264Preset, }) => {
17
+ if (typeof x264Preset !== 'undefined' && codec !== 'h264') {
18
+ throw new TypeError(`You have set a Preset profile but the codec is "${codec}". Set the codec to "h264" or remove the Preset profile.`);
19
+ }
20
+ if (x264Preset !== undefined &&
21
+ !exports.x264PresetOptions.includes(x264Preset)) {
22
+ throw new TypeError(`The Preset profile "${x264Preset}" is not valid. Valid options are ${exports.x264PresetOptions
23
+ .map((p) => `"${p}"`)
24
+ .join(', ')}`);
25
+ }
26
+ };
27
+ exports.validateSelectedCodecAndPresetCombination = validateSelectedCodecAndPresetCombination;
@@ -5,21 +5,55 @@ const symbolicateable_error_1 = require("./error-handling/symbolicateable-error"
5
5
  const logger_1 = require("./logger");
6
6
  const parse_browser_error_stack_1 = require("./parse-browser-error-stack");
7
7
  const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
8
+ const cancelledToken = 'cancelled';
9
+ const readyToken = 'ready';
8
10
  const waitForReady = ({ page, timeoutInMilliseconds, frame, indent, logLevel, }) => {
11
+ const cleanups = [];
12
+ const retrieveErrorAndReject = () => {
13
+ return new Promise((_, reject) => {
14
+ (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
15
+ pageFunction: () => window.remotion_cancelledError,
16
+ args: [],
17
+ frame: null,
18
+ page,
19
+ }).then(({ value: val }) => {
20
+ if (typeof val !== 'string') {
21
+ reject(val);
22
+ return;
23
+ }
24
+ reject(new symbolicateable_error_1.SymbolicateableError({
25
+ frame: null,
26
+ stack: val,
27
+ name: 'CancelledError',
28
+ message: val.split('\n')[0],
29
+ stackFrame: (0, parse_browser_error_stack_1.parseStack)(val.split('\n')),
30
+ }));
31
+ });
32
+ });
33
+ };
9
34
  const waitForReadyProm = new Promise((resolve, reject) => {
10
- page
11
- .mainFrame()
12
- ._mainWorld.waitForFunction({
35
+ const waitTask = page.mainFrame()._mainWorld.waitForFunction({
13
36
  browser: page.browser,
14
37
  // Increase timeout so the delayRender() timeout fires earlier
15
38
  timeout: timeoutInMilliseconds + 3000,
16
- pageFunction: 'window.remotion_renderReady === true',
39
+ pageFunction: `window.remotion_renderReady === true ? "${readyToken}" : window.remotion_cancelledError !== undefined ? "${cancelledToken}" : false`,
17
40
  title: frame === null
18
41
  ? 'the page to render the React component'
19
42
  : `the page to render the React component at frame ${frame}`,
20
- })
43
+ });
44
+ cleanups.push(() => {
45
+ waitTask.terminate(new Error('cleanup'));
46
+ });
47
+ waitTask.promise
21
48
  .then((a) => {
22
- return resolve(a);
49
+ const token = a.toString();
50
+ if (token === cancelledToken) {
51
+ return retrieveErrorAndReject();
52
+ }
53
+ if (token === readyToken) {
54
+ return resolve(a);
55
+ }
56
+ reject(new Error('Unexpected token ' + token));
23
57
  })
24
58
  .catch((err) => {
25
59
  if (err.message.includes('timeout') &&
@@ -54,46 +88,6 @@ const waitForReady = ({ page, timeoutInMilliseconds, frame, indent, logLevel, })
54
88
  }
55
89
  });
56
90
  });
57
- const waitForErrorProm = new Promise((_shouldNeverResolve, reject) => {
58
- page
59
- .mainFrame()
60
- ._mainWorld.waitForFunction({
61
- browser: page.browser,
62
- timeout: null,
63
- pageFunction: 'window.remotion_cancelledError !== undefined',
64
- title: 'remotion_cancelledError variable to appear on the page',
65
- })
66
- .then(() => {
67
- return (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
68
- pageFunction: () => window.remotion_cancelledError,
69
- args: [],
70
- frame: null,
71
- page,
72
- });
73
- })
74
- .then(({ value: val }) => {
75
- if (typeof val !== 'string') {
76
- reject(val);
77
- return;
78
- }
79
- reject(new symbolicateable_error_1.SymbolicateableError({
80
- frame: null,
81
- stack: val,
82
- name: 'CancelledError',
83
- message: val.split('\n')[0],
84
- stackFrame: (0, parse_browser_error_stack_1.parseStack)(val.split('\n')),
85
- }));
86
- })
87
- .catch((err) => {
88
- if (err.message.includes('timeout') &&
89
- err.message.includes('exceeded')) {
90
- // Don't care if a error never appeared
91
- }
92
- else {
93
- reject(err);
94
- }
95
- });
96
- });
97
91
  return Promise.race([
98
92
  new Promise((_, reject) => {
99
93
  page.on("disposed" /* PageEmittedEvents.Disposed */, () => {
@@ -106,8 +100,11 @@ const waitForReady = ({ page, timeoutInMilliseconds, frame, indent, logLevel, })
106
100
  });
107
101
  }),
108
102
  waitForReadyProm,
109
- waitForErrorProm,
110
- ]);
103
+ ]).finally(() => {
104
+ cleanups.forEach((cleanup) => {
105
+ cleanup();
106
+ });
107
+ });
111
108
  };
112
109
  exports.waitForReady = waitForReady;
113
110
  const seekToFrame = async ({ frame, page, composition, timeoutInMilliseconds, logLevel, indent, }) => {
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.serveStatic = void 0;
7
7
  const node_http_1 = __importDefault(require("node:http"));
8
8
  const get_port_1 = require("./get-port");
9
- const is_ipv6_supported_1 = require("./is-ipv6-supported");
10
9
  const offthread_video_server_1 = require("./offthread-video-server");
11
10
  const serve_handler_1 = require("./serve-handler");
12
11
  const serveStatic = async (path, options) => {
@@ -46,10 +45,7 @@ const serveStatic = async (path, options) => {
46
45
  });
47
46
  let selectedPort = null;
48
47
  const maxTries = 5;
49
- const host = (0, is_ipv6_supported_1.isIpV6Supported)() ? '::' : '0.0.0.0';
50
- const hostsToTry = (0, is_ipv6_supported_1.isIpV6Supported)()
51
- ? ['::', '::1']
52
- : ['0.0.0.0', '127.0.0.1'];
48
+ const portConfig = (0, get_port_1.getPortConfig)();
53
49
  for (let i = 0; i < maxTries; i++) {
54
50
  try {
55
51
  selectedPort = await new Promise((resolve, reject) => {
@@ -58,10 +54,10 @@ const serveStatic = async (path, options) => {
58
54
  desiredPort: (_a = options === null || options === void 0 ? void 0 : options.port) !== null && _a !== void 0 ? _a : undefined,
59
55
  from: 3000,
60
56
  to: 3100,
61
- hostsToTry,
57
+ hostsToTry: portConfig.hostsToTry,
62
58
  })
63
59
  .then(({ port, didUsePort }) => {
64
- server.listen({ port, host });
60
+ server.listen({ port, host: portConfig.host });
65
61
  server.on('listening', () => {
66
62
  resolve(port);
67
63
  return didUsePort();
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
2
3
  import type { RenderAssetInfo } from './assets/download-map';
3
4
  import type { AudioCodec } from './audio-codec';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/renderer",
3
- "version": "4.0.58",
3
+ "version": "4.0.60",
4
4
  "description": "Renderer for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "extract-zip": "2.0.1",
19
19
  "source-map": "^0.8.0-beta.0",
20
20
  "ws": "8.7.0",
21
- "remotion": "4.0.58"
21
+ "remotion": "4.0.60"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "react": ">=16.8.0",
@@ -40,13 +40,13 @@
40
40
  "vitest": "0.31.1"
41
41
  },
42
42
  "optionalDependencies": {
43
- "@remotion/compositor-darwin-arm64": "4.0.58",
44
- "@remotion/compositor-darwin-x64": "4.0.58",
45
- "@remotion/compositor-linux-arm64-musl": "4.0.58",
46
- "@remotion/compositor-linux-x64-musl": "4.0.58",
47
- "@remotion/compositor-win32-x64-msvc": "4.0.58",
48
- "@remotion/compositor-linux-arm64-gnu": "4.0.58",
49
- "@remotion/compositor-linux-x64-gnu": "4.0.58"
43
+ "@remotion/compositor-darwin-x64": "4.0.60",
44
+ "@remotion/compositor-linux-arm64-gnu": "4.0.60",
45
+ "@remotion/compositor-linux-x64-gnu": "4.0.60",
46
+ "@remotion/compositor-darwin-arm64": "4.0.60",
47
+ "@remotion/compositor-linux-arm64-musl": "4.0.60",
48
+ "@remotion/compositor-linux-x64-musl": "4.0.60",
49
+ "@remotion/compositor-win32-x64-msvc": "4.0.60"
50
50
  },
51
51
  "keywords": [
52
52
  "remotion",