@remotion/cli 3.2.27 → 3.2.29

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.
Files changed (49) hide show
  1. package/dist/benchmark.d.ts +1 -0
  2. package/dist/benchmark.js +180 -0
  3. package/dist/bundle.d.ts +1 -0
  4. package/dist/bundle.js +32 -0
  5. package/dist/compositions.js +1 -0
  6. package/dist/config/bundle-out-dir.d.ts +2 -0
  7. package/dist/config/bundle-out-dir.js +12 -0
  8. package/dist/config/get-public-path.d.ts +2 -0
  9. package/dist/config/get-public-path.js +12 -0
  10. package/dist/config/image-format.js +8 -1
  11. package/dist/config/log.d.ts +1 -1
  12. package/dist/determine-image-format.d.ts +11 -0
  13. package/dist/determine-image-format.js +48 -0
  14. package/dist/editor/components/Button.d.ts +4 -0
  15. package/dist/editor/components/Button.js +24 -0
  16. package/dist/editor/components/PlayPause.d.ts +0 -5
  17. package/dist/editor/components/PreviewZoomControls.d.ts +2 -0
  18. package/dist/editor/components/PreviewZoomControls.js +49 -0
  19. package/dist/editor/helpers/normalize-wheel.d.ts +5 -0
  20. package/dist/editor/helpers/normalize-wheel.js +20 -0
  21. package/dist/event-source-events.d.ts +3 -0
  22. package/dist/event-source.js +1 -1
  23. package/dist/get-cli-options.d.ts +11 -3
  24. package/dist/get-cli-options.js +22 -28
  25. package/dist/get-env.d.ts +1 -1
  26. package/dist/get-env.js +58 -6
  27. package/dist/get-final-output-codec.d.ts +9 -5
  28. package/dist/get-final-output-codec.js +56 -56
  29. package/dist/get-render-media-options.d.ts +7 -0
  30. package/dist/get-render-media-options.js +44 -0
  31. package/dist/index.d.ts +19 -2
  32. package/dist/index.js +10 -1
  33. package/dist/parse-command-line.js +0 -3
  34. package/dist/prepare-entry-point.d.ts +12 -0
  35. package/dist/prepare-entry-point.js +37 -0
  36. package/dist/preview-server/routes.d.ts +2 -1
  37. package/dist/preview-server/routes.js +4 -2
  38. package/dist/preview-server/start-server.d.ts +1 -1
  39. package/dist/preview-server/start-server.js +2 -1
  40. package/dist/preview.js +10 -2
  41. package/dist/print-help.js +6 -3
  42. package/dist/progress-bar.js +3 -1
  43. package/dist/render.js +18 -30
  44. package/dist/still.js +12 -24
  45. package/dist/validate-image-format.d.ts +2 -0
  46. package/dist/validate-image-format.js +15 -0
  47. package/dist/webpack-cache.d.ts +12 -0
  48. package/dist/webpack-cache.js +66 -0
  49. package/package.json +7 -7
package/dist/get-env.js CHANGED
@@ -7,6 +7,7 @@ exports.getEnvironmentVariables = void 0;
7
7
  const dotenv_1 = __importDefault(require("dotenv"));
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const path_1 = __importDefault(require("path"));
10
+ const chalk_1 = require("./chalk");
10
11
  const config_1 = require("./config");
11
12
  const find_closest_package_json_1 = require("./find-closest-package-json");
12
13
  const log_1 = require("./log");
@@ -19,9 +20,54 @@ function getProcessEnv() {
19
20
  }
20
21
  return env;
21
22
  }
22
- const getEnvForEnvFile = async (processEnv, envFile) => {
23
+ const watchEnvFile = ({ processEnv, envFile, onUpdate, existedBefore, }) => {
24
+ const listener = async () => {
25
+ try {
26
+ const file = await fs_1.default.promises.readFile(envFile, 'utf-8');
27
+ onUpdate({
28
+ ...processEnv,
29
+ ...dotenv_1.default.parse(file),
30
+ });
31
+ if (existedBefore) {
32
+ log_1.Log.info(chalk_1.chalk.blueBright(`Updated env file ${envFile}`));
33
+ }
34
+ else {
35
+ log_1.Log.info(chalk_1.chalk.blueBright(`Added env file ${envFile}`));
36
+ }
37
+ fs_1.default.unwatchFile(envFile, listener);
38
+ watchEnvFile({
39
+ envFile,
40
+ existedBefore: true,
41
+ onUpdate,
42
+ processEnv,
43
+ });
44
+ }
45
+ catch (err) {
46
+ // No error message if user did not have a .env file from the beginning
47
+ if (!existedBefore && !fs_1.default.existsSync(envFile)) {
48
+ return;
49
+ }
50
+ if (fs_1.default.existsSync(envFile) && existedBefore) {
51
+ log_1.Log.error(`${envFile} update failed with error ${err}`);
52
+ }
53
+ else {
54
+ log_1.Log.warn(`${envFile} was deleted.`);
55
+ fs_1.default.unwatchFile(envFile, listener);
56
+ watchEnvFile({
57
+ envFile,
58
+ existedBefore: false,
59
+ onUpdate,
60
+ processEnv,
61
+ });
62
+ }
63
+ }
64
+ };
65
+ fs_1.default.watchFile(envFile, { interval: 100 }, listener);
66
+ };
67
+ const getEnvForEnvFile = async (processEnv, envFile, onUpdate) => {
23
68
  try {
24
69
  const envFileData = await fs_1.default.promises.readFile(envFile);
70
+ watchEnvFile({ processEnv, envFile, onUpdate, existedBefore: true });
25
71
  return {
26
72
  ...processEnv,
27
73
  ...dotenv_1.default.parse(envFileData),
@@ -33,7 +79,7 @@ const getEnvForEnvFile = async (processEnv, envFile) => {
33
79
  process.exit(1);
34
80
  }
35
81
  };
36
- const getEnvironmentVariables = () => {
82
+ const getEnvironmentVariables = (onUpdate) => {
37
83
  const processEnv = getProcessEnv();
38
84
  if (parse_command_line_1.parsedCli['env-file']) {
39
85
  const envFile = path_1.default.resolve(process.cwd(), parse_command_line_1.parsedCli['env-file']);
@@ -43,24 +89,30 @@ const getEnvironmentVariables = () => {
43
89
  log_1.Log.error('Check that your path is correct and try again.');
44
90
  process.exit(1);
45
91
  }
46
- return getEnvForEnvFile(processEnv, envFile);
92
+ return getEnvForEnvFile(processEnv, envFile, onUpdate);
47
93
  }
48
94
  const remotionRoot = (0, find_closest_package_json_1.findRemotionRoot)();
49
95
  const configFileSetting = config_1.ConfigInternals.getDotEnvLocation();
50
96
  if (configFileSetting) {
51
97
  const envFile = path_1.default.resolve(remotionRoot, configFileSetting);
52
98
  if (!fs_1.default.existsSync(envFile)) {
53
- log_1.Log.error('You specifed a custom .env file using `Config.Rendering.setDotEnvLocation()` in the config file but it could not be found');
99
+ log_1.Log.error('You specified a custom .env file using `Config.Rendering.setDotEnvLocation()` in the config file but it could not be found');
54
100
  log_1.Log.error('We looked for the file at:', envFile);
55
101
  log_1.Log.error('Check that your path is correct and try again.');
56
102
  process.exit(1);
57
103
  }
58
- return getEnvForEnvFile(processEnv, envFile);
104
+ return getEnvForEnvFile(processEnv, envFile, onUpdate);
59
105
  }
60
106
  const defaultEnvFile = path_1.default.resolve(remotionRoot, '.env');
61
107
  if (!fs_1.default.existsSync(defaultEnvFile)) {
108
+ watchEnvFile({
109
+ processEnv,
110
+ envFile: defaultEnvFile,
111
+ onUpdate,
112
+ existedBefore: false,
113
+ });
62
114
  return Promise.resolve(processEnv);
63
115
  }
64
- return getEnvForEnvFile(processEnv, defaultEnvFile);
116
+ return getEnvForEnvFile(processEnv, defaultEnvFile, onUpdate);
65
117
  };
66
118
  exports.getEnvironmentVariables = getEnvironmentVariables;
@@ -1,6 +1,10 @@
1
1
  import type { Codec, CodecOrUndefined } from '@remotion/renderer';
2
- export declare const getFinalOutputCodec: ({ codec: inputCodec, fileExtension, emitWarning, }: {
3
- codec: CodecOrUndefined;
4
- fileExtension: string | null;
5
- emitWarning: boolean;
6
- }) => Codec;
2
+ export declare const getFinalOutputCodec: ({ cliFlag, configFile, downloadName, outName, }: {
3
+ cliFlag: CodecOrUndefined;
4
+ outName: string | null;
5
+ downloadName: string | null;
6
+ configFile: Codec | null;
7
+ }) => {
8
+ codec: Codec;
9
+ reason: string;
10
+ };
@@ -2,62 +2,62 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getFinalOutputCodec = void 0;
4
4
  const renderer_1 = require("@remotion/renderer");
5
- const log_1 = require("./log");
6
- const getFinalOutputCodec = ({ codec: inputCodec, fileExtension, emitWarning, }) => {
7
- if (inputCodec === undefined && fileExtension === 'webm') {
8
- if (emitWarning) {
9
- log_1.Log.info('You have specified a .webm extension, using the VP8 encoder. Use --codec=vp9 to use the Vp9 encoder.');
10
- }
11
- return 'vp8';
12
- }
13
- if (inputCodec === undefined && fileExtension === 'hevc') {
14
- if (emitWarning) {
15
- log_1.Log.info('You have specified a .hevc extension, using the H265 encoder.');
16
- }
17
- return 'h265';
18
- }
19
- if (inputCodec === undefined && fileExtension === 'mp3') {
20
- if (emitWarning) {
21
- log_1.Log.info('You have specified a .mp3 extension, using the MP3 encoder.');
22
- }
23
- return 'mp3';
24
- }
25
- if (inputCodec === undefined && fileExtension === 'mov') {
26
- if (emitWarning) {
27
- log_1.Log.info('You have specified a .mov extension, using the Apple ProRes encoder.');
28
- }
29
- return 'prores';
30
- }
31
- if (inputCodec === undefined && fileExtension === 'wav') {
32
- if (emitWarning) {
33
- log_1.Log.info('You have specified a .wav extension, using the WAV encoder.');
34
- }
35
- return 'wav';
36
- }
37
- if (inputCodec === undefined && fileExtension === 'aac') {
38
- if (emitWarning) {
39
- log_1.Log.info('You have specified a .aac extension, using the AAC encoder.');
40
- }
41
- return 'aac';
42
- }
43
- if (inputCodec === undefined && fileExtension === 'm4a') {
44
- if (emitWarning) {
45
- log_1.Log.info('You have specified a .m4a extension, using the AAC encoder.');
46
- }
47
- return 'aac';
48
- }
49
- if (inputCodec === undefined && fileExtension === 'mkv') {
50
- if (emitWarning) {
51
- log_1.Log.info('You have specified a .mkv extension, using the H264 encoder and WAV audio format.');
52
- }
53
- return 'h264-mkv';
54
- }
55
- if (inputCodec === undefined && fileExtension === 'gif') {
56
- if (emitWarning) {
57
- log_1.Log.info('You have specified a .gif extension, rendering a GIF');
58
- }
59
- return 'gif';
5
+ const fileExtensions = {
6
+ webm: 'vp8',
7
+ hevc: 'h265',
8
+ mp3: 'mp3',
9
+ mov: 'prores',
10
+ wav: 'wav',
11
+ aac: 'aac',
12
+ mkv: 'h264-mkv',
13
+ gif: 'gif',
14
+ mp4: 'h264',
15
+ m4a: 'aac',
16
+ };
17
+ const deriveExtensionFromFilename = (extension) => {
18
+ var _a;
19
+ if (extension === null) {
20
+ return null;
60
21
  }
61
- return inputCodec !== null && inputCodec !== void 0 ? inputCodec : renderer_1.RenderInternals.DEFAULT_CODEC;
22
+ return (_a = fileExtensions[extension]) !== null && _a !== void 0 ? _a : null;
23
+ };
24
+ const getFinalOutputCodec = ({ cliFlag, configFile, downloadName, outName, }) => {
25
+ const downloadNameExtension = renderer_1.RenderInternals.getExtensionOfFilename(downloadName);
26
+ const outNameExtension = renderer_1.RenderInternals.getExtensionOfFilename(outName);
27
+ const derivedDownloadCodec = deriveExtensionFromFilename(downloadNameExtension);
28
+ const derivedOutNameCodec = deriveExtensionFromFilename(outNameExtension);
29
+ if (derivedDownloadCodec &&
30
+ derivedOutNameCodec &&
31
+ derivedDownloadCodec !== derivedOutNameCodec) {
32
+ throw new TypeError(`The download name is ${downloadName} but the output name is ${outName}. The file extensions must match`);
33
+ }
34
+ if (derivedDownloadCodec) {
35
+ if (cliFlag && derivedDownloadCodec !== cliFlag) {
36
+ throw new TypeError(`The download name is ${downloadName} but --codec=${cliFlag} was passed. The download name implies a codec of ${derivedDownloadCodec} which does not align with the --codec flag.`);
37
+ }
38
+ return {
39
+ codec: derivedDownloadCodec,
40
+ reason: 'derived from download name',
41
+ };
42
+ }
43
+ if (derivedOutNameCodec) {
44
+ if (cliFlag && derivedOutNameCodec !== cliFlag) {
45
+ throw new TypeError(`The out name is ${outName} but --codec=${cliFlag} was passed. The out name implies a codec of ${derivedOutNameCodec} which does not align with the --codec flag.`);
46
+ }
47
+ return {
48
+ codec: derivedOutNameCodec,
49
+ reason: 'derived from out name',
50
+ };
51
+ }
52
+ if (cliFlag) {
53
+ return { codec: cliFlag, reason: 'from --codec flag' };
54
+ }
55
+ if (configFile) {
56
+ return {
57
+ codec: configFile,
58
+ reason: 'Config file',
59
+ };
60
+ }
61
+ return { codec: renderer_1.RenderInternals.DEFAULT_CODEC, reason: 'default' };
62
62
  };
63
63
  exports.getFinalOutputCodec = getFinalOutputCodec;
@@ -0,0 +1,7 @@
1
+ import type { Codec, RenderMediaOptions } from '@remotion/renderer';
2
+ export declare const getRenderMediaOptions: ({ outputLocation, config, serveUrl, codec, }: {
3
+ outputLocation: RenderMediaOptions['outputLocation'];
4
+ config: RenderMediaOptions['composition'];
5
+ serveUrl: string;
6
+ codec: Codec;
7
+ }) => Promise<RenderMediaOptions>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRenderMediaOptions = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const config_1 = require("./config");
6
+ const get_cli_options_1 = require("./get-cli-options");
7
+ const getRenderMediaOptions = async ({ outputLocation, config, serveUrl, codec, }) => {
8
+ const { proResProfile, concurrency, frameRange, overwrite, inputProps, envVariables, quality, crf, pixelFormat, imageFormat, browserExecutable, ffmpegExecutable, ffprobeExecutable, scale, chromiumOptions, port, numberOfGifLoops, everyNthFrame, muted, enforceAudioTrack, ffmpegOverride, } = await (0, get_cli_options_1.getCliOptions)({
9
+ isLambda: false,
10
+ type: 'series',
11
+ codec,
12
+ });
13
+ return {
14
+ outputLocation,
15
+ composition: config,
16
+ crf,
17
+ envVariables,
18
+ ffmpegExecutable,
19
+ ffprobeExecutable,
20
+ frameRange,
21
+ imageFormat,
22
+ inputProps,
23
+ overwrite,
24
+ pixelFormat,
25
+ proResProfile,
26
+ quality,
27
+ dumpBrowserLogs: renderer_1.RenderInternals.isEqualOrBelowLogLevel(config_1.ConfigInternals.Logging.getLogLevel(), 'verbose'),
28
+ chromiumOptions,
29
+ timeoutInMilliseconds: config_1.ConfigInternals.getCurrentPuppeteerTimeout(),
30
+ scale,
31
+ port,
32
+ numberOfGifLoops,
33
+ everyNthFrame,
34
+ verbose: renderer_1.RenderInternals.isEqualOrBelowLogLevel(config_1.ConfigInternals.Logging.getLogLevel(), 'verbose'),
35
+ muted,
36
+ enforceAudioTrack,
37
+ browserExecutable,
38
+ ffmpegOverride,
39
+ concurrency,
40
+ serveUrl,
41
+ codec,
42
+ };
43
+ };
44
+ exports.getRenderMediaOptions = getRenderMediaOptions;
package/dist/index.d.ts CHANGED
@@ -70,12 +70,12 @@ export declare const CliInternals: {
70
70
  getCliOptions: (options: {
71
71
  isLambda: boolean;
72
72
  type: "still" | "series" | "get-compositions";
73
+ codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
73
74
  }) => Promise<{
74
75
  puppeteerTimeout: number;
75
76
  concurrency: number | null;
76
77
  frameRange: import("@remotion/renderer").FrameRange | null;
77
78
  shouldOutputImageSequence: boolean;
78
- codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
79
79
  inputProps: object;
80
80
  envVariables: Record<string, string>;
81
81
  quality: number | undefined;
@@ -90,7 +90,7 @@ export declare const CliInternals: {
90
90
  browserExecutable: import("@remotion/renderer").BrowserExecutable;
91
91
  ffmpegExecutable: import("@remotion/renderer").FfmpegExecutable;
92
92
  ffprobeExecutable: import("@remotion/renderer").FfmpegExecutable;
93
- logLevel: "verbose" | "info" | "warn" | "error";
93
+ logLevel: "verbose" | "error" | "info" | "warn";
94
94
  scale: number;
95
95
  chromiumOptions: import("@remotion/renderer").ChromiumOptions;
96
96
  overwrite: boolean;
@@ -115,4 +115,21 @@ export declare const CliInternals: {
115
115
  }) => string;
116
116
  getFileSizeDownloadBar: (downloaded: number) => string;
117
117
  findRemotionRoot: () => string;
118
+ getFinalCodec: (options: {
119
+ downloadName: string | null;
120
+ outName: string | null;
121
+ }) => {
122
+ codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
123
+ reason: string;
124
+ };
125
+ determineFinalImageFormat: ({ downloadName, outName, configImageFormat, cliFlag, isLambda, }: {
126
+ downloadName: string | null;
127
+ outName: string | null;
128
+ configImageFormat: "png" | "jpeg" | "none" | null;
129
+ cliFlag: "png" | "jpeg" | "none" | null;
130
+ isLambda: boolean;
131
+ }) => {
132
+ format: import("@remotion/renderer").StillImageFormat;
133
+ source: string;
134
+ };
118
135
  };
package/dist/index.js CHANGED
@@ -16,10 +16,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.CliInternals = exports.overrideRemotion = exports.ConfigInternals = exports.cli = void 0;
18
18
  const renderer_1 = require("@remotion/renderer");
19
+ const benchmark_1 = require("./benchmark");
19
20
  const chalk_1 = require("./chalk");
20
21
  const check_version_1 = require("./check-version");
21
22
  const compositions_1 = require("./compositions");
22
23
  const index_1 = require("./config/index");
24
+ const determine_image_format_1 = require("./determine-image-format");
23
25
  const download_progress_1 = require("./download-progress");
24
26
  const find_closest_package_json_1 = require("./find-closest-package-json");
25
27
  const format_bytes_1 = require("./format-bytes");
@@ -77,12 +79,17 @@ const cli = async () => {
77
79
  else if (command === versions_1.VERSIONS_COMMAND) {
78
80
  await (0, versions_1.versionsCommand)(remotionRoot);
79
81
  }
82
+ else if (command === 'benchmark') {
83
+ await (0, benchmark_1.benchmarkCommand)(remotionRoot, parse_command_line_1.parsedCli._.slice(1));
84
+ }
80
85
  else if (command === 'help') {
81
86
  (0, print_help_1.printHelp)();
82
87
  process.exit(0);
83
88
  }
84
89
  else {
85
- log_1.Log.error(`Command ${command} not found.`);
90
+ if (command) {
91
+ log_1.Log.error(`Command ${command} not found.`);
92
+ }
86
93
  (0, print_help_1.printHelp)();
87
94
  process.exit(1);
88
95
  }
@@ -118,4 +125,6 @@ exports.CliInternals = {
118
125
  formatBytes: format_bytes_1.formatBytes,
119
126
  getFileSizeDownloadBar: download_progress_1.getFileSizeDownloadBar,
120
127
  findRemotionRoot: find_closest_package_json_1.findRemotionRoot,
128
+ getFinalCodec: get_cli_options_1.getFinalCodec,
129
+ determineFinalImageFormat: determine_image_format_1.determineFinalImageFormat,
121
130
  };
@@ -97,9 +97,6 @@ const parseCommandLine = () => {
97
97
  if (typeof exports.parsedCli.crf !== 'undefined') {
98
98
  config_1.Config.Output.setCrf(exports.parsedCli.crf);
99
99
  }
100
- if (exports.parsedCli.codec) {
101
- config_1.Config.Output.setCodec(exports.parsedCli.codec);
102
- }
103
100
  if (exports.parsedCli['every-nth-frame']) {
104
101
  config_1.Config.Rendering.setEveryNthFrame(exports.parsedCli['every-nth-frame']);
105
102
  }
@@ -0,0 +1,12 @@
1
+ import type { RenderStep } from './step';
2
+ export declare const prepareEntryPoint: ({ file, otherSteps, publicPath, outDir, remotionRoot, }: {
3
+ file: string;
4
+ otherSteps: RenderStep[];
5
+ outDir: string | null;
6
+ publicPath: string | null;
7
+ remotionRoot: string;
8
+ }) => Promise<{
9
+ urlOrBundle: string;
10
+ steps: RenderStep[];
11
+ shouldDelete: boolean;
12
+ }>;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.prepareEntryPoint = void 0;
7
+ const renderer_1 = require("@remotion/renderer");
8
+ const promises_1 = require("fs/promises");
9
+ const path_1 = __importDefault(require("path"));
10
+ const process_1 = require("process");
11
+ const log_1 = require("./log");
12
+ const setup_cache_1 = require("./setup-cache");
13
+ const prepareEntryPoint = async ({ file, otherSteps, publicPath, outDir, remotionRoot, }) => {
14
+ if (renderer_1.RenderInternals.isServeUrl(file)) {
15
+ return { urlOrBundle: file, steps: otherSteps, shouldDelete: false };
16
+ }
17
+ const joined = path_1.default.resolve(process.cwd(), file);
18
+ try {
19
+ const stats = await (0, promises_1.stat)(joined);
20
+ if (stats.isDirectory()) {
21
+ return { urlOrBundle: joined, steps: otherSteps, shouldDelete: false };
22
+ }
23
+ }
24
+ catch (err) {
25
+ log_1.Log.error(`No file or directory exists at ${joined}.`);
26
+ (0, process_1.exit)(1);
27
+ }
28
+ const urlOrBundle = await (0, setup_cache_1.bundleOnCliOrTakeServeUrl)({
29
+ fullPath: joined,
30
+ steps: ['bundling', ...otherSteps],
31
+ outDir,
32
+ publicPath,
33
+ remotionRoot,
34
+ });
35
+ return { urlOrBundle, steps: ['bundling', ...otherSteps], shouldDelete: true };
36
+ };
37
+ exports.prepareEntryPoint = prepareEntryPoint;
@@ -1,12 +1,13 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'http';
2
2
  import type { LiveEventsServer } from './live-events';
3
- export declare const handleRoutes: ({ hash, hashPrefix, request, response, liveEventsServer, getCurrentInputProps, remotionRoot, userPassedPublicDir, }: {
3
+ export declare const handleRoutes: ({ hash, hashPrefix, request, response, liveEventsServer, getCurrentInputProps, getEnvVariables, remotionRoot, userPassedPublicDir, }: {
4
4
  hash: string;
5
5
  hashPrefix: string;
6
6
  request: IncomingMessage;
7
7
  response: ServerResponse;
8
8
  liveEventsServer: LiveEventsServer;
9
9
  getCurrentInputProps: () => object;
10
+ getEnvVariables: () => Record<string, string>;
10
11
  remotionRoot: string;
11
12
  userPassedPublicDir: string | null;
12
13
  }) => void | Promise<void>;
@@ -25,7 +25,7 @@ const static404 = (response) => {
25
25
  response.writeHead(404);
26
26
  response.end('The static/ prefix has been changed, this URL is no longer valid.');
27
27
  };
28
- const handleFallback = async ({ remotionRoot, hash, response, getCurrentInputProps, }) => {
28
+ const handleFallback = async ({ remotionRoot, hash, response, getCurrentInputProps, getEnvVariables, }) => {
29
29
  const [edit] = await editorGuess;
30
30
  const displayName = (0, open_in_editor_1.getDisplayNameForEditor)(edit ? edit.command : null);
31
31
  response.setHeader('content-type', 'text/html');
@@ -35,6 +35,7 @@ const handleFallback = async ({ remotionRoot, hash, response, getCurrentInputPro
35
35
  staticHash: hash,
36
36
  baseDir: '/',
37
37
  editorName: displayName,
38
+ envVariables: getEnvVariables(),
38
39
  inputProps: getCurrentInputProps(),
39
40
  remotionRoot,
40
41
  previewServerCommand: packageManager === 'unknown' ? null : packageManager.startCommand,
@@ -117,7 +118,7 @@ const handleFavicon = (_, response) => {
117
118
  const readStream = (0, fs_1.createReadStream)(filePath);
118
119
  readStream.pipe(response);
119
120
  };
120
- const handleRoutes = ({ hash, hashPrefix, request, response, liveEventsServer, getCurrentInputProps, remotionRoot, userPassedPublicDir, }) => {
121
+ const handleRoutes = ({ hash, hashPrefix, request, response, liveEventsServer, getCurrentInputProps, getEnvVariables, remotionRoot, userPassedPublicDir, }) => {
121
122
  const url = new URL(request.url, 'http://localhost');
122
123
  if (url.pathname === '/api/update') {
123
124
  return handleUpdate(remotionRoot, request, response);
@@ -156,6 +157,7 @@ const handleRoutes = ({ hash, hashPrefix, request, response, liveEventsServer, g
156
157
  hash,
157
158
  response,
158
159
  getCurrentInputProps,
160
+ getEnvVariables,
159
161
  });
160
162
  };
161
163
  exports.handleRoutes = handleRoutes;
@@ -3,7 +3,7 @@ import type { LiveEventsServer } from './live-events';
3
3
  export declare const startServer: (entry: string, userDefinedComponent: string, options: {
4
4
  webpackOverride: WebpackOverrideFn;
5
5
  getCurrentInputProps: () => object;
6
- envVariables?: Record<string, string>;
6
+ getEnvVariables: () => Record<string, string>;
7
7
  port: number | null;
8
8
  maxTimelineTracks?: number;
9
9
  remotionRoot: string;
@@ -26,7 +26,7 @@ const startServer = async (entry, userDefinedComponent, options) => {
26
26
  outDir: tmpDir,
27
27
  environment: 'development',
28
28
  webpackOverride: (_a = options === null || options === void 0 ? void 0 : options.webpackOverride) !== null && _a !== void 0 ? _a : config_1.ConfigInternals.getWebpackOverrideFn(),
29
- envVariables: (_b = options === null || options === void 0 ? void 0 : options.envVariables) !== null && _b !== void 0 ? _b : {},
29
+ envVariables: (_b = options === null || options === void 0 ? void 0 : options.getEnvVariables()) !== null && _b !== void 0 ? _b : {},
30
30
  maxTimelineTracks: (_c = options === null || options === void 0 ? void 0 : options.maxTimelineTracks) !== null && _c !== void 0 ? _c : 15,
31
31
  entryPoints: [
32
32
  require.resolve('./hot-middleware/client'),
@@ -62,6 +62,7 @@ const startServer = async (entry, userDefinedComponent, options) => {
62
62
  response,
63
63
  liveEventsServer,
64
64
  getCurrentInputProps: options.getCurrentInputProps,
65
+ getEnvVariables: options.getEnvVariables,
65
66
  remotionRoot: options.remotionRoot,
66
67
  userPassedPublicDir: options.userPassedPublicDir,
67
68
  });
package/dist/preview.js CHANGED
@@ -48,10 +48,18 @@ const previewCommand = async (remotionRoot) => {
48
48
  });
49
49
  });
50
50
  });
51
- const envVariables = await (0, get_env_1.getEnvironmentVariables)();
51
+ let envVariables = await (0, get_env_1.getEnvironmentVariables)((newEnvVariables) => {
52
+ waitForLiveEventsListener().then((listener) => {
53
+ envVariables = newEnvVariables;
54
+ listener.sendEventToClient({
55
+ type: 'new-env-variables',
56
+ newEnvVariables,
57
+ });
58
+ });
59
+ });
52
60
  const { port, liveEventsServer } = await (0, start_server_1.startServer)(path_1.default.resolve(__dirname, 'previewEntry.js'), fullPath, {
53
61
  getCurrentInputProps: () => inputProps,
54
- envVariables,
62
+ getEnvVariables: () => envVariables,
55
63
  port: desiredPort,
56
64
  maxTimelineTracks: config_1.ConfigInternals.getMaxTimelineTracks(),
57
65
  remotionRoot,
@@ -11,7 +11,7 @@ const printFlags = (flags) => {
11
11
  });
12
12
  };
13
13
  const printHelp = () => {
14
- log_1.Log.info(`@remotion/cli ${packagejson.version} © ${new Date().getFullYear()} Jonny Burger`);
14
+ log_1.Log.info(`@remotion/cli ${packagejson.version} © ${new Date().getFullYear()} The Remotion developers`);
15
15
  log_1.Log.info();
16
16
  log_1.Log.info('Available commands:');
17
17
  log_1.Log.info('');
@@ -19,7 +19,7 @@ const printHelp = () => {
19
19
  log_1.Log.info(chalk_1.chalk.gray('Start the preview server.'));
20
20
  printFlags([['--props', 'Pass input props as filename or as JSON']]);
21
21
  log_1.Log.info();
22
- log_1.Log.info('remotion render <entry-point.ts> <comp-name> <output-file.mp4>');
22
+ log_1.Log.info('remotion render <entry-point.ts> <comp-id> <output-file.mp4>');
23
23
  log_1.Log.info(chalk_1.chalk.gray('Render video, audio or an image sequence.'));
24
24
  printFlags([
25
25
  ['--props', 'Pass input props as filename or as JSON'],
@@ -40,7 +40,7 @@ const printHelp = () => {
40
40
  ['--env-file', 'Specify a location for a dotenv file'],
41
41
  ]);
42
42
  log_1.Log.info();
43
- log_1.Log.info('remotion still <entry-point.ts> <comp-name> <still.png>');
43
+ log_1.Log.info('remotion still <entry-point.ts> <comp-id> <still.png>');
44
44
  log_1.Log.info(chalk_1.chalk.gray('Render a still frame and save it as an image.'));
45
45
  printFlags([
46
46
  ['--frame', 'Which frame to render (default 0)'],
@@ -59,6 +59,9 @@ const printHelp = () => {
59
59
  log_1.Log.info('remotion compositions <index-file.ts>');
60
60
  log_1.Log.info(chalk_1.chalk.gray('Prints the available compositions.'));
61
61
  log_1.Log.info();
62
+ log_1.Log.info('remotion benchmark <index-file.ts> <list-of-compositions>');
63
+ log_1.Log.info(chalk_1.chalk.gray('Benchmarks rendering a composition. Same options as for render.'));
64
+ log_1.Log.info();
62
65
  log_1.Log.info('remotion ' + versions_1.VERSIONS_COMMAND);
63
66
  log_1.Log.info(chalk_1.chalk.gray('Prints and validates versions of all Remotion packages.'));
64
67
  log_1.Log.info();
@@ -34,7 +34,9 @@ const makeBundlingProgress = ({ progress, steps, doneIn, }) => [
34
34
  doneIn === null
35
35
  ? (progress * 100).toFixed(0) + '%'
36
36
  : chalk_1.chalk.gray(`${doneIn}ms`),
37
- ].join(' ');
37
+ ]
38
+ .filter(truthy_1.truthy)
39
+ .join(' ');
38
40
  exports.makeBundlingProgress = makeBundlingProgress;
39
41
  const makeRenderingProgress = ({ frames, totalFrames, steps, concurrency, doneIn, }) => {
40
42
  const progress = frames / totalFrames;