@remotion/renderer 4.0.225 → 4.0.227

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.
@@ -125,12 +125,10 @@ const downloadAsset = async ({ src, downloadMap, indent, logLevel, shouldAnalyze
125
125
  if (node_fs_1.default.existsSync(claimedDownloadLocation)) {
126
126
  return claimedDownloadLocation;
127
127
  }
128
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
129
128
  downloadMap.hasBeenDownloadedMap[src][downloadDir] = null;
130
129
  if (!downloadMap.isDownloadingMap[src]) {
131
130
  downloadMap.isDownloadingMap[src] = {};
132
131
  }
133
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
134
132
  downloadMap.isDownloadingMap[src][downloadDir] = false;
135
133
  }
136
134
  if ((_c = downloadMap.isDownloadingMap[src]) === null || _c === void 0 ? void 0 : _c[downloadDir]) {
@@ -7,7 +7,7 @@ const killAllBrowsers = async () => {
7
7
  try {
8
8
  await browser.close(true, 'info', false);
9
9
  }
10
- catch (err) { }
10
+ catch (_a) { }
11
11
  }
12
12
  };
13
13
  exports.killAllBrowsers = killAllBrowsers;
@@ -145,7 +145,7 @@ const combineAudioSeamlessly = async ({ files, filelistDir, indent, logLevel, ou
145
145
  }
146
146
  catch (e) {
147
147
  (0, fs_1.rmSync)(fileListTxt, { recursive: true });
148
- console.log(e);
148
+ logger_1.Log.error({ indent, logLevel }, e);
149
149
  throw e;
150
150
  }
151
151
  };
@@ -78,7 +78,7 @@ const callCompositor = (payload, indent, logLevel, binariesDirectory) => {
78
78
  const err = new Error(`${msg}\n${parsed.backtrace}`);
79
79
  reject(err);
80
80
  }
81
- catch (err) {
81
+ catch (_a) {
82
82
  reject(new Error(`Compositor panicked with code ${code}: ${message}`));
83
83
  }
84
84
  }
@@ -62,7 +62,7 @@ const startCompositor = ({ type, payload, logLevel, indent, binariesDirectory =
62
62
  const parsed = JSON.parse(new TextDecoder('utf8').decode(data));
63
63
  waiters.get(nonce).reject(new Error(`Compositor error: ${parsed.error}\n${parsed.backtrace}`));
64
64
  }
65
- catch (err) {
65
+ catch (_a) {
66
66
  waiters.get(nonce).reject(new Error(new TextDecoder('utf8').decode(data)));
67
67
  }
68
68
  }
@@ -48,7 +48,7 @@ const deleteDirectory = (directory) => {
48
48
  retryDelay: 100,
49
49
  });
50
50
  }
51
- catch (err) {
51
+ catch (_a) {
52
52
  retries--;
53
53
  continue;
54
54
  }
@@ -53,6 +53,7 @@ const handleJavascriptException = ({ page, onError, frame, }) => {
53
53
  const rawErrorMessage = (_a = exception.exceptionDetails.exception) === null || _a === void 0 ? void 0 : _a.description;
54
54
  const cleanErrorMessage = cleanUpErrorMessage(exception);
55
55
  if (!cleanErrorMessage) {
56
+ // eslint-disable-next-line no-console
56
57
  console.error(exception);
57
58
  const err = new Error(rawErrorMessage);
58
59
  err.stack = rawErrorMessage;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getPageAndCleanupFn = void 0;
4
4
  const browser_1 = require("./browser");
5
+ const logger_1 = require("./logger");
5
6
  const open_browser_1 = require("./open-browser");
6
7
  const getPageAndCleanupFn = async ({ passedInInstance, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, logLevel, onBrowserDownload, }) => {
7
8
  if (passedInInstance) {
@@ -13,7 +14,7 @@ const getPageAndCleanupFn = async ({ passedInInstance, browserExecutable, chromi
13
14
  // Keep browser open.
14
15
  page.close().catch((err) => {
15
16
  if (!err.message.includes('Target closed')) {
16
- console.error('Was not able to close puppeteer page', err);
17
+ logger_1.Log.error({ indent, logLevel }, 'Was not able to close puppeteer page', err);
17
18
  }
18
19
  });
19
20
  return Promise.resolve();
@@ -37,7 +38,7 @@ const getPageAndCleanupFn = async ({ passedInInstance, browserExecutable, chromi
37
38
  // Close whole browser that was just created and don't wait for it to finish.
38
39
  browserInstance.close(true, logLevel, indent).catch((err) => {
39
40
  if (!err.message.includes('Target closed')) {
40
- console.error('Was not able to close puppeteer page', err);
41
+ logger_1.Log.error({ indent, logLevel }, 'Was not able to close puppeteer page', err);
41
42
  }
42
43
  });
43
44
  return Promise.resolve();
@@ -11,7 +11,7 @@ const getConcurrencyFromNProc = () => {
11
11
  try {
12
12
  return parseInt((0, node_child_process_1.execSync)('nproc', { stdio: 'pipe' }).toString().trim(), 10);
13
13
  }
14
- catch (error) {
14
+ catch (_a) {
15
15
  return null;
16
16
  }
17
17
  };
@@ -1,2 +1,7 @@
1
1
  import type { BrowserExecutable } from './browser-executable';
2
- export declare const getLocalBrowserExecutable: (preferredBrowserExecutable: BrowserExecutable) => string;
2
+ import type { LogLevel } from './log-level';
3
+ export declare const getLocalBrowserExecutable: ({ preferredBrowserExecutable, logLevel, indent, }: {
4
+ preferredBrowserExecutable: BrowserExecutable;
5
+ logLevel: LogLevel;
6
+ indent: boolean;
7
+ }) => string;
@@ -7,10 +7,11 @@ exports.getLocalBrowserExecutable = void 0;
7
7
  const node_fs_1 = __importDefault(require("node:fs"));
8
8
  const BrowserFetcher_1 = require("./browser/BrowserFetcher");
9
9
  const get_local_browser_1 = require("./get-local-browser");
10
- const getBrowserStatus = (browserExecutablePath) => {
10
+ const logger_1 = require("./logger");
11
+ const getBrowserStatus = ({ browserExecutablePath, indent, logLevel, }) => {
11
12
  if (browserExecutablePath) {
12
13
  if (!node_fs_1.default.existsSync(browserExecutablePath)) {
13
- console.warn(`Browser executable was specified as '${browserExecutablePath}' but the path doesn't exist.`);
14
+ logger_1.Log.warn({ indent, logLevel }, `Browser executable was specified as '${browserExecutablePath}' but the path doesn't exist.`);
14
15
  }
15
16
  return { path: browserExecutablePath, type: 'user-defined-path' };
16
17
  }
@@ -24,8 +25,12 @@ const getBrowserStatus = (browserExecutablePath) => {
24
25
  }
25
26
  return { type: 'no-browser' };
26
27
  };
27
- const getLocalBrowserExecutable = (preferredBrowserExecutable) => {
28
- const status = getBrowserStatus(preferredBrowserExecutable);
28
+ const getLocalBrowserExecutable = ({ preferredBrowserExecutable, logLevel, indent, }) => {
29
+ const status = getBrowserStatus({
30
+ browserExecutablePath: preferredBrowserExecutable,
31
+ indent,
32
+ logLevel,
33
+ });
29
34
  if (status.type === 'no-browser') {
30
35
  throw new TypeError('No browser found for rendering frames! Please open a GitHub issue and describe ' +
31
36
  'how you reached this error: https://remotion.dev/issue');
package/dist/get-port.js CHANGED
@@ -61,6 +61,7 @@ const getDesiredPort = async ({ desiredPort, from, hostsToTry, to, }) => {
61
61
  const actualPort = await getPort({ from, to, hostsToTest: hostsToTry });
62
62
  // If did specify a port but did not get that one, fail hard.
63
63
  if (desiredPort && desiredPort !== actualPort) {
64
+ unlockPort();
64
65
  throw new Error(`You specified port ${desiredPort} to be used for the HTTP server, but it is not available. Choose a different port or remove the setting to let Remotion automatically select a free port.`);
65
66
  }
66
67
  return { port: actualPort, unlockPort };
package/dist/logger.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Log = exports.secondverboseTag = exports.verboseTag = exports.INDENT_TOKEN = void 0;
4
+ /* eslint-disable no-console */
4
5
  const chalk_1 = require("./chalk");
5
6
  const is_color_supported_1 = require("./chalk/is-color-supported");
6
7
  const log_level_1 = require("./log-level");
@@ -60,7 +60,11 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
60
60
  indent,
61
61
  onBrowserDownload,
62
62
  });
63
- const executablePath = (0, get_local_browser_executable_1.getLocalBrowserExecutable)(browserExecutable);
63
+ const executablePath = (0, get_local_browser_executable_1.getLocalBrowserExecutable)({
64
+ preferredBrowserExecutable: browserExecutable,
65
+ logLevel,
66
+ indent,
67
+ });
64
68
  const customGlRenderer = getOpenGlRenderer((_a = chromiumOptions.gl) !== null && _a !== void 0 ? _a : null);
65
69
  const enableMultiProcessOnLinux = (_b = chromiumOptions.enableMultiProcessOnLinux) !== null && _b !== void 0 ? _b : true;
66
70
  logger_1.Log.verbose({ indent, logLevel, tag: 'openBrowser()' }, `Opening browser: gl = ${chromiumOptions.gl}, executable = ${executablePath}, enableMultiProcessOnLinux = ${enableMultiProcessOnLinux}`);
@@ -20,7 +20,7 @@ type FfmpegAudioCodecName = (typeof audioCodecNames)[number];
20
20
  export declare const mapAudioCodecToFfmpegAudioCodecName: (audioCodec: AudioCodec) => FfmpegAudioCodecName;
21
21
  export declare const defaultAudioCodecs: {
22
22
  [key in Codec]: {
23
- [k in 'compressed' | 'lossless']: (typeof supportedAudioCodecs)[key][number] | null;
23
+ [_ in 'compressed' | 'lossless']: (typeof supportedAudioCodecs)[key][number] | null;
24
24
  };
25
25
  };
26
26
  export declare const getExtensionFromAudioCodec: (audioCodec: AudioCodec) => "mp3" | "aac" | "wav" | "opus";
@@ -21,6 +21,7 @@ const _satisfies = exports.supportedAudioCodecs;
21
21
  if (_satisfies) {
22
22
  // Just for type checking
23
23
  }
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
25
  const audioCodecNames = [
25
26
  'pcm_s16le',
26
27
  'libfdk_aac',
@@ -11,7 +11,7 @@ The above copyright notice and this permission notice shall be included in all c
11
11
 
12
12
  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
13
13
  */
14
- /* eslint-disable max-depth, max-statements, complexity, max-lines-per-function */
14
+ /* eslint-disable max-depth */
15
15
  const SLASH = 47;
16
16
  const DOT = 46;
17
17
  const assertPath = (path) => {
@@ -63,7 +63,7 @@ async function puppeteerEvaluateWithCatch({ page, pageFunction, frame, args, })
63
63
  // eslint-disable-next-line no-new-func
64
64
  new Function('(' + functionText + ')');
65
65
  }
66
- catch (error) {
66
+ catch (_g) {
67
67
  // This means we might have a function shorthand. Try another
68
68
  // time prefixing 'function '.
69
69
  if (functionText.startsWith('async '))
@@ -75,7 +75,7 @@ async function puppeteerEvaluateWithCatch({ page, pageFunction, frame, args, })
75
75
  // eslint-disable-next-line no-new-func
76
76
  new Function('(' + functionText + ')');
77
77
  }
78
- catch (err) {
78
+ catch (_h) {
79
79
  // We tried hard to serialize, but there's a weird beast here.
80
80
  throw new Error('Passed function is not well-serializable!');
81
81
  }
@@ -137,7 +137,6 @@ function convertArgument(arg) {
137
137
  return { value: arg };
138
138
  }
139
139
  if (typeof arg === 'bigint')
140
- // eslint-disable-line valid-typeof
141
140
  return { unserializableValue: `${arg.toString()}n` };
142
141
  if (Object.is(arg, -0))
143
142
  return { unserializableValue: '-0' };
@@ -240,7 +240,7 @@ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition, s
240
240
  try {
241
241
  await stitcherFfmpeg;
242
242
  }
243
- catch (err) {
243
+ catch (_b) {
244
244
  throw new Error(preStitcher === null || preStitcher === void 0 ? void 0 : preStitcher.getLogs());
245
245
  }
246
246
  }
@@ -466,7 +466,7 @@ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition, s
466
466
  try {
467
467
  stitcherFfmpeg.kill();
468
468
  }
469
- catch (e) {
469
+ catch (_a) {
470
470
  // Ignore
471
471
  }
472
472
  return promise.then(() => {
@@ -487,7 +487,7 @@ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition, s
487
487
  cleanupServerFn === null || cleanupServerFn === void 0 ? void 0 : cleanupServerFn(false).catch((err) => {
488
488
  // Must prevent unhandled exception in cleanup function.
489
489
  // Might crash whole runtime.
490
- console.log('Could not cleanup: ', err);
490
+ logger_1.Log.error({ indent, logLevel }, 'Could not cleanup: ', err);
491
491
  });
492
492
  });
493
493
  });
@@ -507,11 +507,11 @@ exports.internalRenderMedia = (0, wrap_with_error_handling_1.wrapWithErrorHandli
507
507
  */
508
508
  const renderMedia = ({ proResProfile, x264Preset, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, encodingMaxRate, encodingBufferSize, audioCodec, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, everyNthFrame, imageFormat, numberOfGifLoops, dumpBrowserLogs, preferLossless, verbose, quality, logLevel: passedLogLevel, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, onBrowserDownload, onArtifact, metadata, }) => {
509
509
  var _a, _b;
510
- if (quality !== undefined) {
511
- console.warn(`The "quality" option has been renamed. Please use "jpegQuality" instead.`);
512
- }
513
510
  const indent = false;
514
511
  const logLevel = verbose || dumpBrowserLogs ? 'verbose' : (passedLogLevel !== null && passedLogLevel !== void 0 ? passedLogLevel : 'info');
512
+ if (quality !== undefined) {
513
+ logger_1.Log.warn({ indent, logLevel }, `The "quality" option has been renamed. Please use "jpegQuality" instead.`);
514
+ }
515
515
  return (0, exports.internalRenderMedia)({
516
516
  proResProfile: proResProfile !== null && proResProfile !== void 0 ? proResProfile : undefined,
517
517
  x264Preset: x264Preset !== null && x264Preset !== void 0 ? x264Preset : null,
@@ -40,6 +40,7 @@ const filter_asset_types_1 = require("./filter-asset-types");
40
40
  const find_closest_package_json_1 = require("./find-closest-package-json");
41
41
  const image_format_1 = require("./image-format");
42
42
  const jpeg_quality_1 = require("./jpeg-quality");
43
+ const logger_1 = require("./logger");
43
44
  const make_cancel_signal_1 = require("./make-cancel-signal");
44
45
  const open_browser_1 = require("./open-browser");
45
46
  const overwrite_1 = require("./overwrite");
@@ -127,7 +128,7 @@ const innerRenderStill = async ({ composition, imageFormat = image_format_1.DEFA
127
128
  }
128
129
  else {
129
130
  browserInstance.close(true, logLevel, indent).catch((err) => {
130
- console.log('Unable to close browser', err);
131
+ logger_1.Log.error({ indent, logLevel }, 'Unable to close browser', err);
131
132
  });
132
133
  }
133
134
  };
@@ -251,7 +252,7 @@ const internalRenderStillRaw = (options) => {
251
252
  .finally(() => {
252
253
  cleanup.forEach((c) => {
253
254
  c().catch((err) => {
254
- console.log('Cleanup error:', err);
255
+ logger_1.Log.error(options, 'Cleanup error:', err);
255
256
  });
256
257
  });
257
258
  });
@@ -279,11 +280,11 @@ const renderStill = (options) => {
279
280
  if (typeof jpegQuality !== 'undefined' && imageFormat !== 'jpeg') {
280
281
  throw new Error("You can only pass the `quality` option if `imageFormat` is 'jpeg'.");
281
282
  }
283
+ const indent = false;
284
+ const logLevel = passedLogLevel !== null && passedLogLevel !== void 0 ? passedLogLevel : (verbose || dumpBrowserLogs ? 'verbose' : 'info');
282
285
  if (quality) {
283
- console.warn('Passing `quality()` to `renderStill` is deprecated. Use `jpegQuality` instead.');
286
+ logger_1.Log.warn({ indent, logLevel }, 'Passing `quality()` to `renderStill` is deprecated. Use `jpegQuality` instead.');
284
287
  }
285
- const logLevel = passedLogLevel !== null && passedLogLevel !== void 0 ? passedLogLevel : (verbose || dumpBrowserLogs ? 'verbose' : 'info');
286
- const indent = false;
287
288
  return (0, exports.internalRenderStill)({
288
289
  composition,
289
290
  browserExecutable: browserExecutable !== null && browserExecutable !== void 0 ? browserExecutable : null,
@@ -80,7 +80,7 @@ const serveHandler = async (request, response, config) => {
80
80
  try {
81
81
  relativePath = decodeURIComponent(node_url_1.default.parse(request.url).pathname);
82
82
  }
83
- catch (err) {
83
+ catch (_a) {
84
84
  return sendError('/', response, {
85
85
  statusCode: 400,
86
86
  code: 'bad_request',
@@ -192,7 +192,7 @@ const serveHandler = async (request, response, config) => {
192
192
  try {
193
193
  stream = (0, node_fs_1.createReadStream)(absolutePath, streamOpts !== null && streamOpts !== void 0 ? streamOpts : {});
194
194
  }
195
- catch (err) {
195
+ catch (_b) {
196
196
  return internalError(absolutePath, response);
197
197
  }
198
198
  const headers = getHeaders(absolutePath, stats);
@@ -2887,6 +2887,7 @@ var downloadFileWithoutRetries = ({ onProgress, url, to: toFn }) => {
2887
2887
  }, 20000);
2888
2888
  };
2889
2889
  refreshTimeout();
2890
+ let finishEventSent = false;
2890
2891
  readFile(url).then((res) => {
2891
2892
  const contentDisposition = res.headers["content-disposition"] ?? null;
2892
2893
  const contentType = res.headers["content-type"] ?? null;
@@ -2900,11 +2901,13 @@ var downloadFileWithoutRetries = ({ onProgress, url, to: toFn }) => {
2900
2901
  if (rejected) {
2901
2902
  return;
2902
2903
  }
2903
- onProgress?.({
2904
- downloaded,
2905
- percent: 1,
2906
- totalSize: downloaded
2907
- });
2904
+ if (!finishEventSent) {
2905
+ onProgress?.({
2906
+ downloaded,
2907
+ percent: 1,
2908
+ totalSize: downloaded
2909
+ });
2910
+ }
2908
2911
  refreshTimeout();
2909
2912
  return resolveAndFlag({ sizeInBytes: downloaded, to });
2910
2913
  });
@@ -2915,11 +2918,15 @@ var downloadFileWithoutRetries = ({ onProgress, url, to: toFn }) => {
2915
2918
  refreshTimeout();
2916
2919
  downloaded += d.length;
2917
2920
  refreshTimeout();
2921
+ const percent = totalSize === null ? null : downloaded / totalSize;
2918
2922
  onProgress?.({
2919
2923
  downloaded,
2920
- percent: totalSize === null ? null : downloaded / totalSize,
2924
+ percent,
2921
2925
  totalSize
2922
2926
  });
2927
+ if (percent === 1) {
2928
+ finishEventSent = true;
2929
+ }
2923
2930
  });
2924
2931
  res.on("close", () => {
2925
2932
  if (totalSize !== null && downloaded !== totalSize) {
@@ -3164,7 +3171,7 @@ var defaultBrowserDownloadProgress = ({
3164
3171
  let lastProgress = 0;
3165
3172
  return {
3166
3173
  onProgress: (progress) => {
3167
- if (progress.downloadedBytes > lastProgress + 1e7) {
3174
+ if (progress.downloadedBytes > lastProgress + 1e7 || progress.percent === 1) {
3168
3175
  lastProgress = progress.downloadedBytes;
3169
3176
  Log.info({ indent, logLevel }, `Downloading Chrome Headless Shell - ${toMegabytes(progress.downloadedBytes)}/${toMegabytes(progress.totalSizeInBytes)}`);
3170
3177
  }
@@ -0,0 +1,34 @@
1
+ import {remotionFlatConfig} from '@remotion/eslint-config-internal';
2
+
3
+ const config = remotionFlatConfig({react: false});
4
+
5
+ export default [
6
+ {
7
+ ...config,
8
+ rules: {
9
+ ...config.rules,
10
+ '@typescript-eslint/no-use-before-define': 'off',
11
+ 'no-restricted-imports': [
12
+ 'error',
13
+ {
14
+ patterns: ['@remotion/*/src/*', 'remotion/src/*'],
15
+ paths: ['remotion', 'react', 'react-dom'],
16
+ },
17
+ ],
18
+ },
19
+ ignores: ['src/browser/**'],
20
+ },
21
+ {
22
+ ...config,
23
+ files: ['src/test/**'],
24
+ rules: {
25
+ ...config.rules,
26
+ 'no-restricted-imports': [
27
+ 'error',
28
+ {
29
+ patterns: ['@remotion/*/src/*', 'remotion/src/*'],
30
+ },
31
+ ],
32
+ },
33
+ },
34
+ ];
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/renderer"
4
4
  },
5
5
  "name": "@remotion/renderer",
6
- "version": "4.0.225",
6
+ "version": "4.0.227",
7
7
  "description": "Render Remotion videos using Node.js or Bun",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
@@ -18,8 +18,8 @@
18
18
  "extract-zip": "2.0.1",
19
19
  "source-map": "^0.8.0-beta.0",
20
20
  "ws": "8.17.1",
21
- "remotion": "4.0.225",
22
- "@remotion/streaming": "4.0.225"
21
+ "remotion": "4.0.227",
22
+ "@remotion/streaming": "4.0.227"
23
23
  },
24
24
  "peerDependencies": {
25
25
  "react": ">=16.8.0",
@@ -31,16 +31,18 @@
31
31
  "@happy-dom/global-registrator": "14.5.1",
32
32
  "react": "18.3.1",
33
33
  "react-dom": "18.3.1",
34
- "@types/ws": "8.5.10"
34
+ "@types/ws": "8.5.10",
35
+ "eslint": "9.14.0",
36
+ "@remotion/eslint-config-internal": "4.0.227"
35
37
  },
36
38
  "optionalDependencies": {
37
- "@remotion/compositor-darwin-arm64": "4.0.225",
38
- "@remotion/compositor-darwin-x64": "4.0.225",
39
- "@remotion/compositor-linux-arm64-gnu": "4.0.225",
40
- "@remotion/compositor-linux-x64-musl": "4.0.225",
41
- "@remotion/compositor-win32-x64-msvc": "4.0.225",
42
- "@remotion/compositor-linux-x64-gnu": "4.0.225",
43
- "@remotion/compositor-linux-arm64-musl": "4.0.225"
39
+ "@remotion/compositor-darwin-x64": "4.0.227",
40
+ "@remotion/compositor-darwin-arm64": "4.0.227",
41
+ "@remotion/compositor-linux-arm64-gnu": "4.0.227",
42
+ "@remotion/compositor-linux-x64-gnu": "4.0.227",
43
+ "@remotion/compositor-win32-x64-msvc": "4.0.227",
44
+ "@remotion/compositor-linux-arm64-musl": "4.0.227",
45
+ "@remotion/compositor-linux-x64-musl": "4.0.227"
44
46
  },
45
47
  "keywords": [
46
48
  "remotion",
@@ -55,9 +57,8 @@
55
57
  "homepage": "https://www.remotion.dev/docs/renderer",
56
58
  "scripts": {
57
59
  "formatting": "prettier src --check",
58
- "lint": "eslint src --ext ts,tsx",
60
+ "lint": "eslint src",
59
61
  "test": "bun test src",
60
- "make": "bun build.ts --debug",
61
- "build-all": "bun build.ts --all"
62
+ "make": "tsc -d"
62
63
  }
63
64
  }