@remotion/renderer 4.0.87 → 4.0.88

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/client.d.ts CHANGED
@@ -317,7 +317,7 @@ export declare const BrowserSafeApis: {
317
317
  cliFlag: "gl";
318
318
  docLink: string;
319
319
  name: string;
320
- type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
320
+ type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
321
321
  ssrName: string;
322
322
  description: () => JSX.Element;
323
323
  };
@@ -361,6 +361,14 @@ export declare const BrowserSafeApis: {
361
361
  docLink: string;
362
362
  type: number | null;
363
363
  };
364
+ reproOption: {
365
+ name: string;
366
+ cliFlag: string;
367
+ description: () => JSX.Element;
368
+ ssrName: string;
369
+ docLink: string;
370
+ type: boolean;
371
+ };
364
372
  };
365
373
  validColorSpaces: readonly ["default", "bt709", "bt2020-ncl"];
366
374
  optionsMap: {
@@ -389,6 +397,14 @@ export declare const BrowserSafeApis: {
389
397
  docLink: string;
390
398
  type: number | null;
391
399
  };
400
+ readonly repro: {
401
+ name: string;
402
+ cliFlag: string;
403
+ description: () => JSX.Element;
404
+ ssrName: string;
405
+ docLink: string;
406
+ type: boolean;
407
+ };
392
408
  };
393
409
  readonly renderStill: {
394
410
  readonly offthreadVideoCacheSizeInBytes: {
package/dist/index.d.ts CHANGED
@@ -138,8 +138,8 @@ export declare const RenderInternals: {
138
138
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
139
139
  DEFAULT_BROWSER: "chrome";
140
140
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
141
- DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
142
- validateOpenGlRenderer: (option: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
141
+ DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
142
+ validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
143
143
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
144
144
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuv422p" | "yuv444p" | "yuva420p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
145
145
  validateJpegQuality: (q: number | undefined) => void;
package/dist/logger.js CHANGED
@@ -4,6 +4,7 @@ exports.setLogLevel = exports.getLogLevel = exports.Log = exports.secondverboseT
4
4
  const chalk_1 = require("./chalk");
5
5
  const is_color_supported_1 = require("./chalk/is-color-supported");
6
6
  const log_level_1 = require("./log-level");
7
+ const repro_1 = require("./repro");
7
8
  const truthy_1 = require("./truthy");
8
9
  exports.INDENT_TOKEN = chalk_1.chalk.gray('│');
9
10
  const verboseTag = (str) => {
@@ -16,6 +17,7 @@ const secondverboseTag = (str) => {
16
17
  exports.secondverboseTag = secondverboseTag;
17
18
  exports.Log = {
18
19
  verbose: (options, ...args) => {
20
+ (0, repro_1.writeInRepro)('verbose', ...args);
19
21
  if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'verbose')) {
20
22
  return console.log(...[
21
23
  options.indent ? exports.INDENT_TOKEN : null,
@@ -29,9 +31,11 @@ exports.Log = {
29
31
  exports.Log.infoAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
30
32
  },
31
33
  infoAdvanced: (options, ...args) => {
34
+ (0, repro_1.writeInRepro)('info', ...args);
32
35
  return console.log(...[options.indent ? exports.INDENT_TOKEN : null].filter(truthy_1.truthy).concat(args));
33
36
  },
34
37
  warn: (options, ...args) => {
38
+ (0, repro_1.writeInRepro)('warn', ...args);
35
39
  if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'warn')) {
36
40
  return console.warn(...[options.indent ? chalk_1.chalk.yellow(exports.INDENT_TOKEN) : null]
37
41
  .filter(truthy_1.truthy)
@@ -39,11 +43,13 @@ exports.Log = {
39
43
  }
40
44
  },
41
45
  error: (...args) => {
46
+ (0, repro_1.writeInRepro)('error', ...args);
42
47
  if ((0, log_level_1.isEqualOrBelowLogLevel)((0, exports.getLogLevel)(), 'error')) {
43
48
  return console.error(...args.map((a) => chalk_1.chalk.red(a)));
44
49
  }
45
50
  },
46
51
  errorAdvanced: (options, ...args) => {
52
+ (0, repro_1.writeInRepro)('error', ...args);
47
53
  if ((0, log_level_1.isEqualOrBelowLogLevel)((0, exports.getLogLevel)(), 'error')) {
48
54
  return console.log(...[
49
55
  options.indent ? exports.INDENT_TOKEN : null,
@@ -4,7 +4,7 @@ export declare const glOption: {
4
4
  cliFlag: "gl";
5
5
  docLink: string;
6
6
  name: string;
7
- type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
7
+ type: "swangle" | "angle" | "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: "gl";
117
117
  docLink: string;
118
118
  name: string;
119
- type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
119
+ type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
120
120
  ssrName: string;
121
121
  description: () => JSX.Element;
122
122
  };
@@ -160,5 +160,13 @@ export declare const allOptions: {
160
160
  docLink: string;
161
161
  type: number | null;
162
162
  };
163
+ reproOption: {
164
+ name: string;
165
+ cliFlag: string;
166
+ description: () => JSX.Element;
167
+ ssrName: string;
168
+ docLink: string;
169
+ type: boolean;
170
+ };
163
171
  };
164
172
  export type AvailableOptions = keyof typeof allOptions;
@@ -17,6 +17,7 @@ const jpeg_quality_1 = require("./jpeg-quality");
17
17
  const mute_1 = require("./mute");
18
18
  const number_of_gif_loops_1 = require("./number-of-gif-loops");
19
19
  const offthreadvideo_cache_size_1 = require("./offthreadvideo-cache-size");
20
+ const repro_1 = require("./repro");
20
21
  const scale_1 = require("./scale");
21
22
  const video_bitrate_1 = require("./video-bitrate");
22
23
  const video_codec_1 = require("./video-codec");
@@ -42,4 +43,5 @@ exports.allOptions = {
42
43
  encodingBufferSizeOption: encoding_buffer_size_1.encodingBufferSizeOption,
43
44
  beepOnFinishOption: beep_on_finish_1.beepOnFinishOption,
44
45
  numberOfGifLoopsOption: number_of_gif_loops_1.numberOfGifLoopsOption,
46
+ reproOption: repro_1.reproOption,
45
47
  };
@@ -25,6 +25,14 @@ export declare const optionsMap: {
25
25
  docLink: string;
26
26
  type: number | null;
27
27
  };
28
+ readonly repro: {
29
+ name: string;
30
+ cliFlag: string;
31
+ description: () => JSX.Element;
32
+ ssrName: string;
33
+ docLink: string;
34
+ type: boolean;
35
+ };
28
36
  };
29
37
  readonly renderStill: {
30
38
  readonly offthreadVideoCacheSizeInBytes: {
@@ -3,12 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.optionsMap = void 0;
4
4
  const number_of_gif_loops_1 = require("./number-of-gif-loops");
5
5
  const offthreadvideo_cache_size_1 = require("./offthreadvideo-cache-size");
6
+ const repro_1 = require("./repro");
6
7
  const video_bitrate_1 = require("./video-bitrate");
7
8
  exports.optionsMap = {
8
9
  renderMedia: {
9
10
  offthreadVideoCacheSizeInBytes: offthreadvideo_cache_size_1.offthreadVideoCacheSizeInBytes,
10
11
  videoBitrate: video_bitrate_1.videoBitrate,
11
12
  numberOfGifLoops: number_of_gif_loops_1.numberOfGifLoopsOption,
13
+ repro: repro_1.reproOption,
12
14
  },
13
15
  renderStill: {
14
16
  offthreadVideoCacheSizeInBytes: offthreadvideo_cache_size_1.offthreadVideoCacheSizeInBytes,
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ export declare const reproOption: {
3
+ name: string;
4
+ cliFlag: string;
5
+ description: () => JSX.Element;
6
+ ssrName: string;
7
+ docLink: string;
8
+ type: boolean;
9
+ };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reproOption = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ exports.reproOption = {
6
+ name: 'Create reproduction',
7
+ cliFlag: 'repro',
8
+ description: () => ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "Create a ZIP that you can submit to Remotion if asked for a reproduction." })),
9
+ ssrName: 'repro',
10
+ docLink: 'https://www.remotion.dev/docs/render-media#repro',
11
+ type: false,
12
+ };
@@ -78,6 +78,7 @@ export type InternalRenderMediaOptions = {
78
78
  serveUrl: string;
79
79
  concurrency: number | string | null;
80
80
  colorSpace: ColorSpace;
81
+ finishRenderProgress: () => void;
81
82
  } & MoreRenderMediaOptions;
82
83
  type Prettify<T> = {
83
84
  [K in keyof T]: T[K];
@@ -133,6 +134,7 @@ export type RenderMediaOptions = Prettify<{
133
134
  concurrency?: number | string | null;
134
135
  logLevel?: LogLevel;
135
136
  colorSpace?: ColorSpace;
137
+ repro?: boolean;
136
138
  }> & Partial<MoreRenderMediaOptions>;
137
139
  type RenderMediaResult = {
138
140
  buffer: Buffer | null;
@@ -144,5 +146,5 @@ export declare const internalRenderMedia: (args_0: InternalRenderMediaOptions) =
144
146
  * @description Render a video from a composition
145
147
  * @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
146
148
  */
147
- export declare 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, offthreadVideoCacheSizeInBytes, colorSpace, }: RenderMediaOptions) => Promise<RenderMediaResult>;
149
+ export declare 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, offthreadVideoCacheSizeInBytes, colorSpace, repro, }: RenderMediaOptions) => Promise<RenderMediaResult>;
148
150
  export {};
@@ -34,6 +34,7 @@ const prespawn_ffmpeg_1 = require("./prespawn-ffmpeg");
34
34
  const prestitcher_memory_usage_1 = require("./prestitcher-memory-usage");
35
35
  const prores_profile_1 = require("./prores-profile");
36
36
  const render_frames_1 = require("./render-frames");
37
+ const repro_1 = require("./repro");
37
38
  const stitch_frames_to_video_1 = require("./stitch-frames-to-video");
38
39
  const validate_1 = require("./validate");
39
40
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
@@ -46,7 +47,18 @@ const validate_videobitrate_1 = require("./validate-videobitrate");
46
47
  const wrap_with_error_handling_1 = require("./wrap-with-error-handling");
47
48
  const x264_preset_1 = require("./x264-preset");
48
49
  const SLOWEST_FRAME_COUNT = 10;
49
- const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition, serializedInputPropsWithCustomSchema, 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, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, logLevel, serializedResolvedPropsWithCustomSchema, offthreadVideoCacheSizeInBytes, colorSpace, }) => {
50
+ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition, serializedInputPropsWithCustomSchema, 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, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, logLevel, serializedResolvedPropsWithCustomSchema, offthreadVideoCacheSizeInBytes, colorSpace, repro, finishRenderProgress, }) => {
51
+ if (repro) {
52
+ (0, repro_1.enableRepro)({
53
+ serveUrl,
54
+ compositionName: composition.id,
55
+ serializedInputPropsWithCustomSchema,
56
+ serializedResolvedPropsWithCustomSchema,
57
+ });
58
+ }
59
+ else {
60
+ (0, repro_1.disableRepro)();
61
+ }
50
62
  (0, jpeg_quality_1.validateJpegQuality)(jpegQuality);
51
63
  (0, crf_1.validateQualitySettings)({
52
64
  crf,
@@ -395,7 +407,20 @@ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition, s
395
407
  buffer,
396
408
  slowestFrames,
397
409
  };
398
- resolve(result);
410
+ finishRenderProgress();
411
+ if ((0, repro_1.isReproEnabled)()) {
412
+ (0, repro_1.getReproWriter)()
413
+ .onRenderSucceed({ indent, logLevel, output: absoluteOutputLocation })
414
+ .then(() => {
415
+ resolve(result);
416
+ })
417
+ .catch((err) => {
418
+ logger_1.Log.errorAdvanced({ indent, logLevel }, 'Could not create reproduction', err);
419
+ });
420
+ }
421
+ else {
422
+ resolve(result);
423
+ }
399
424
  })
400
425
  .catch((err) => {
401
426
  /**
@@ -447,7 +472,7 @@ exports.internalRenderMedia = (0, wrap_with_error_handling_1.wrapWithErrorHandli
447
472
  * @description Render a video from a composition
448
473
  * @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
449
474
  */
450
- 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, offthreadVideoCacheSizeInBytes, colorSpace, }) => {
475
+ 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, offthreadVideoCacheSizeInBytes, colorSpace, repro, }) => {
451
476
  var _a, _b;
452
477
  if (quality !== undefined) {
453
478
  console.warn(`The "quality" option has been renamed. Please use "jpegQuality" instead.`);
@@ -506,6 +531,8 @@ const renderMedia = ({ proResProfile, x264Preset, crf, composition, inputProps,
506
531
  }).serializedString,
507
532
  offthreadVideoCacheSizeInBytes: offthreadVideoCacheSizeInBytes !== null && offthreadVideoCacheSizeInBytes !== void 0 ? offthreadVideoCacheSizeInBytes : null,
508
533
  colorSpace: colorSpace !== null && colorSpace !== void 0 ? colorSpace : 'default',
534
+ repro: repro !== null && repro !== void 0 ? repro : false,
535
+ finishRenderProgress: () => undefined,
509
536
  });
510
537
  };
511
538
  exports.renderMedia = renderMedia;
@@ -0,0 +1,25 @@
1
+ import type { LogLevel } from './log-level';
2
+ type ReproWriter = {
3
+ start: (options: {
4
+ serveUrl: string;
5
+ serializedInputPropsWithCustomSchema: string;
6
+ serializedResolvedPropsWithCustomSchema: string;
7
+ }) => void;
8
+ writeLine: (level: string, ...args: Parameters<typeof console.log>[]) => void;
9
+ onRenderSucceed: (options: {
10
+ output: string | null;
11
+ logLevel: LogLevel;
12
+ indent: boolean;
13
+ }) => Promise<void>;
14
+ };
15
+ export declare const getReproWriter: () => ReproWriter;
16
+ export declare const writeInRepro: (level: string, message?: any, ...optionalParams: any[]) => void;
17
+ export declare const enableRepro: ({ serveUrl, compositionName, serializedInputPropsWithCustomSchema, serializedResolvedPropsWithCustomSchema, }: {
18
+ serveUrl: string;
19
+ compositionName: string;
20
+ serializedInputPropsWithCustomSchema: string;
21
+ serializedResolvedPropsWithCustomSchema: string;
22
+ }) => void;
23
+ export declare const disableRepro: () => void;
24
+ export declare const isReproEnabled: () => boolean;
25
+ export {};
package/dist/repro.js ADDED
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.isReproEnabled = exports.disableRepro = exports.enableRepro = exports.writeInRepro = exports.getReproWriter = void 0;
30
+ const node_child_process_1 = require("node:child_process");
31
+ const node_fs_1 = __importStar(require("node:fs"));
32
+ const node_os_1 = __importDefault(require("node:os"));
33
+ const node_path_1 = __importDefault(require("node:path"));
34
+ const version_1 = require("remotion/version");
35
+ const chalk_1 = require("./chalk");
36
+ const find_closest_package_json_1 = require("./find-closest-package-json");
37
+ const is_serve_url_1 = require("./is-serve-url");
38
+ const logger_1 = require("./logger");
39
+ const REPRO_DIR = '.remotionrepro';
40
+ const LOG_FILE_NAME = 'logs.txt';
41
+ const INPUT_DIR = 'bundle';
42
+ const OUTPUT_DIR = 'output';
43
+ const LINE_SPLIT = '\n';
44
+ const getZipFileName = (name) => `remotion-repro-${name}-${Date.now()}.zip`;
45
+ const readyDirSync = (dir) => {
46
+ let items;
47
+ try {
48
+ items = node_fs_1.default.readdirSync(dir);
49
+ }
50
+ catch (_a) {
51
+ return node_fs_1.default.mkdirSync(dir, { recursive: true });
52
+ }
53
+ items.forEach((item) => {
54
+ item = node_path_1.default.join(dir, item);
55
+ node_fs_1.default.rmSync(item, { recursive: true, force: true });
56
+ });
57
+ };
58
+ const zipFolder = ({ sourceFolder, targetZip, indent, logLevel, }) => {
59
+ const platform = node_os_1.default.platform();
60
+ try {
61
+ logger_1.Log.infoAdvanced({ indent, logLevel }, '+ Creating reproduction ZIP');
62
+ if (platform === 'win32') {
63
+ (0, node_child_process_1.execSync)(`powershell.exe Compress-Archive -Path "${sourceFolder}" -DestinationPath "${targetZip}"`);
64
+ }
65
+ else {
66
+ (0, node_child_process_1.execSync)(`zip -r "${targetZip}" "${sourceFolder}"`);
67
+ }
68
+ (0, node_fs_1.rmSync)(sourceFolder, { recursive: true });
69
+ logger_1.Log.infoAdvanced({ indent, logLevel }, `${chalk_1.chalk.blue(`+ Repro: ${targetZip}`)}`);
70
+ }
71
+ catch (error) {
72
+ logger_1.Log.errorAdvanced({ indent, logLevel }, `Failed to zip repro folder, The repro folder is ${sourceFolder}. You can try manually zip it.`);
73
+ logger_1.Log.errorAdvanced({ indent, logLevel }, error);
74
+ }
75
+ };
76
+ const reproWriter = (name) => {
77
+ const root = (0, find_closest_package_json_1.findRemotionRoot)();
78
+ const reproFolder = node_path_1.default.join(root, REPRO_DIR);
79
+ const logPath = node_path_1.default.join(reproFolder, LOG_FILE_NAME);
80
+ const zipFile = node_path_1.default.join(root, getZipFileName(name));
81
+ readyDirSync(reproFolder);
82
+ const reproLogWriteStream = node_fs_1.default.createWriteStream(logPath, { flags: 'a' });
83
+ const serializeArgs = (args) => JSON.stringify(args);
84
+ const writeLine = (level, ...args) => {
85
+ if (!args.length)
86
+ return;
87
+ const startTime = new Date().toISOString();
88
+ const line = `[${startTime}] ${level} ${serializeArgs(args)}`;
89
+ reproLogWriteStream.write(line + LINE_SPLIT);
90
+ };
91
+ const start = ({ serveUrl, serializedInputPropsWithCustomSchema, serializedResolvedPropsWithCustomSchema, }) => {
92
+ const isServe = (0, is_serve_url_1.isServeUrl)(serveUrl);
93
+ if (!isServe) {
94
+ const inputDir = node_path_1.default.resolve(reproFolder, INPUT_DIR);
95
+ readyDirSync(inputDir);
96
+ node_fs_1.default.cpSync(serveUrl, inputDir, { recursive: true });
97
+ }
98
+ const serializedProps = node_path_1.default.resolve(reproFolder, 'input-props.json');
99
+ node_fs_1.default.writeFileSync(serializedProps, serializedInputPropsWithCustomSchema);
100
+ const serializedResolvedProps = node_path_1.default.resolve(reproFolder, 'resolved-props.json');
101
+ node_fs_1.default.writeFileSync(serializedResolvedProps, serializedResolvedPropsWithCustomSchema);
102
+ writeLine('info', [`Args: ${JSON.stringify(process.argv)}`]);
103
+ writeLine('info', [`Node/Bun version: ${process.version}`]);
104
+ writeLine('info', [`OS: ${process.platform}-${process.arch}`]);
105
+ writeLine('info', [`Serve URL: ${serveUrl}`]);
106
+ writeLine('info', [`Remotion version: ${version_1.VERSION}`]);
107
+ };
108
+ const onRenderSucceed = ({ indent, logLevel, output, }) => {
109
+ return new Promise((resolve, reject) => {
110
+ try {
111
+ if (output) {
112
+ const outputDir = node_path_1.default.resolve(reproFolder, OUTPUT_DIR);
113
+ readyDirSync(outputDir);
114
+ const fileName = node_path_1.default.basename(output);
115
+ const targetPath = node_path_1.default.join(outputDir, fileName);
116
+ node_fs_1.default.copyFileSync(output, targetPath);
117
+ }
118
+ (0, exports.disableRepro)();
119
+ reproLogWriteStream.end(() => {
120
+ reproLogWriteStream.close(() => {
121
+ zipFolder({
122
+ sourceFolder: reproFolder,
123
+ targetZip: zipFile,
124
+ indent,
125
+ logLevel,
126
+ });
127
+ resolve();
128
+ });
129
+ });
130
+ }
131
+ catch (error) {
132
+ logger_1.Log.error(`repro render success error:`);
133
+ logger_1.Log.error(error);
134
+ reject(error);
135
+ }
136
+ });
137
+ };
138
+ return {
139
+ start,
140
+ writeLine,
141
+ onRenderSucceed,
142
+ };
143
+ };
144
+ let reproWriteInstance = null;
145
+ const getReproWriter = () => {
146
+ if (!reproWriteInstance) {
147
+ throw new Error('reproWriteInstance is not initialized');
148
+ }
149
+ return reproWriteInstance;
150
+ };
151
+ exports.getReproWriter = getReproWriter;
152
+ const writeInRepro = (level, ...args) => {
153
+ if ((0, exports.isReproEnabled)()) {
154
+ (0, exports.getReproWriter)().writeLine(level, ...args);
155
+ }
156
+ };
157
+ exports.writeInRepro = writeInRepro;
158
+ let shouldRepro = false;
159
+ const enableRepro = ({ serveUrl, compositionName, serializedInputPropsWithCustomSchema, serializedResolvedPropsWithCustomSchema, }) => {
160
+ shouldRepro = true;
161
+ reproWriteInstance = reproWriter(compositionName);
162
+ (0, exports.getReproWriter)().start({
163
+ serveUrl,
164
+ serializedInputPropsWithCustomSchema,
165
+ serializedResolvedPropsWithCustomSchema,
166
+ });
167
+ };
168
+ exports.enableRepro = enableRepro;
169
+ const disableRepro = () => {
170
+ shouldRepro = false;
171
+ };
172
+ exports.disableRepro = disableRepro;
173
+ const isReproEnabled = () => shouldRepro;
174
+ exports.isReproEnabled = isReproEnabled;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/renderer",
3
- "version": "4.0.87",
3
+ "version": "4.0.88",
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.87"
21
+ "remotion": "4.0.88"
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.87",
44
- "@remotion/compositor-linux-arm64-gnu": "4.0.87",
45
- "@remotion/compositor-linux-x64-gnu": "4.0.87",
46
- "@remotion/compositor-linux-x64-musl": "4.0.87",
47
- "@remotion/compositor-win32-x64-msvc": "4.0.87",
48
- "@remotion/compositor-linux-arm64-musl": "4.0.87",
49
- "@remotion/compositor-darwin-x64": "4.0.87"
43
+ "@remotion/compositor-darwin-arm64": "4.0.88",
44
+ "@remotion/compositor-linux-arm64-musl": "4.0.88",
45
+ "@remotion/compositor-linux-arm64-gnu": "4.0.88",
46
+ "@remotion/compositor-darwin-x64": "4.0.88",
47
+ "@remotion/compositor-linux-x64-gnu": "4.0.88",
48
+ "@remotion/compositor-linux-x64-musl": "4.0.88",
49
+ "@remotion/compositor-win32-x64-msvc": "4.0.88"
50
50
  },
51
51
  "keywords": [
52
52
  "remotion",