@remotion/cli 4.0.409 → 4.0.410

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/add.js CHANGED
@@ -1,17 +1,34 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.addCommand = void 0;
4
7
  const renderer_1 = require("@remotion/renderer");
5
8
  const studio_server_1 = require("@remotion/studio-server");
6
9
  const node_child_process_1 = require("node:child_process");
10
+ const node_fs_1 = __importDefault(require("node:fs"));
7
11
  const chalk_1 = require("./chalk");
12
+ const extra_packages_1 = require("./extra-packages");
8
13
  const list_of_remotion_packages_1 = require("./list-of-remotion-packages");
9
14
  const log_1 = require("./log");
15
+ const resolve_from_1 = require("./resolve-from");
16
+ const getInstalledVersion = (remotionRoot, pkg) => {
17
+ try {
18
+ const pkgJsonPath = (0, resolve_from_1.resolveFrom)(remotionRoot, `${pkg}/package.json`);
19
+ const file = node_fs_1.default.readFileSync(pkgJsonPath, 'utf-8');
20
+ const packageJson = JSON.parse(file);
21
+ return packageJson.version;
22
+ }
23
+ catch (_a) {
24
+ return null;
25
+ }
26
+ };
10
27
  const addCommand = async ({ remotionRoot, packageManager, packageNames, logLevel, args, }) => {
11
28
  // Validate that all package names are Remotion packages
12
- const invalidPackages = packageNames.filter((pkg) => !list_of_remotion_packages_1.listOfRemotionPackages.includes(pkg));
29
+ const invalidPackages = packageNames.filter((pkg) => !list_of_remotion_packages_1.listOfRemotionPackages.includes(pkg) && !extra_packages_1.EXTRA_PACKAGES[pkg]);
13
30
  if (invalidPackages.length > 0) {
14
- throw new Error(`The following packages are not Remotion packages: ${invalidPackages.join(', ')}. Must be one of the Remotion packages.`);
31
+ throw new Error(`The following packages are not Remotion packages: ${invalidPackages.join(', ')}. Must be one of the Remotion packages or one of the supported extra packages: ${Object.keys(extra_packages_1.EXTRA_PACKAGES).join(', ')}.`);
15
32
  }
16
33
  const { dependencies, devDependencies, optionalDependencies, peerDependencies, } = studio_server_1.StudioServerInternals.getInstalledDependencies(remotionRoot);
17
34
  // Check if packages are already installed
@@ -21,34 +38,69 @@ const addCommand = async ({ remotionRoot, packageManager, packageNames, logLevel
21
38
  ...optionalDependencies,
22
39
  ...peerDependencies,
23
40
  ];
24
- const alreadyInstalled = packageNames.filter((pkg) => allDeps.includes(pkg));
25
- const toInstall = packageNames.filter((pkg) => !allDeps.includes(pkg));
41
+ const alreadyInstalled = [];
42
+ const toInstall = [];
43
+ const toUpgrade = [];
44
+ for (const pkg of packageNames) {
45
+ const isInstalled = allDeps.includes(pkg);
46
+ const requiredVersion = extra_packages_1.EXTRA_PACKAGES[pkg];
47
+ if (!isInstalled) {
48
+ toInstall.push(pkg);
49
+ }
50
+ else if (requiredVersion) {
51
+ // For extra packages, check if the version is correct
52
+ const installedVersion = getInstalledVersion(remotionRoot, pkg);
53
+ if (installedVersion !== requiredVersion) {
54
+ toUpgrade.push({
55
+ pkg,
56
+ from: installedVersion !== null && installedVersion !== void 0 ? installedVersion : 'unknown',
57
+ to: requiredVersion,
58
+ });
59
+ toInstall.push(pkg);
60
+ }
61
+ else {
62
+ alreadyInstalled.push(pkg);
63
+ }
64
+ }
65
+ else {
66
+ alreadyInstalled.push(pkg);
67
+ }
68
+ }
26
69
  // Log already installed packages
27
70
  for (const pkg of alreadyInstalled) {
28
71
  log_1.Log.info({ indent: false, logLevel }, `○ ${pkg} ${chalk_1.chalk.gray('(already installed)')}`);
29
72
  }
73
+ // Log packages that will be upgraded
74
+ for (const { pkg, from, to } of toUpgrade) {
75
+ log_1.Log.info({ indent: false, logLevel }, `↑ ${pkg} ${chalk_1.chalk.yellow(`${from} → ${to}`)}`);
76
+ }
30
77
  // If nothing to install, return early
31
78
  if (toInstall.length === 0) {
32
79
  return;
33
80
  }
34
- // Find the version of installed Remotion packages
35
81
  const installedRemotionPackages = list_of_remotion_packages_1.listOfRemotionPackages.filter((pkg) => allDeps.includes(pkg));
36
- if (installedRemotionPackages.length === 0) {
37
- throw new Error('No Remotion packages found in your project. Install Remotion first.');
38
- }
39
82
  // Get the version from the first installed Remotion package
40
83
  const packageJsonPath = `${remotionRoot}/node_modules/${installedRemotionPackages[0]}/package.json`;
41
- let targetVersion;
42
- try {
43
- const packageJson = require(packageJsonPath);
44
- targetVersion = packageJson.version;
45
- const packageList = toInstall.length === 1
46
- ? toInstall[0]
47
- : `${toInstall.length} packages (${toInstall.join(', ')})`;
48
- log_1.Log.info({ indent: false, logLevel }, `Installing ${packageList}@${targetVersion} to match your other Remotion packages`);
84
+ let targetVersion = null;
85
+ if (installedRemotionPackages.length > 0) {
86
+ try {
87
+ const packageJson = require(packageJsonPath);
88
+ targetVersion = packageJson.version;
89
+ const packageList = toInstall.length === 1
90
+ ? toInstall[0]
91
+ : `${toInstall.length} packages (${toInstall.join(', ')})`;
92
+ log_1.Log.info({ indent: false, logLevel }, `Installing ${packageList}`);
93
+ }
94
+ catch (err) {
95
+ throw new Error(`Could not determine version of installed Remotion packages: ${err.message}`);
96
+ }
49
97
  }
50
- catch (err) {
51
- throw new Error(`Could not determine version of installed Remotion packages: ${err.message}`);
98
+ else {
99
+ // If no Remotion packages are installed, we can only install extra packages
100
+ const notExtraPackages = toInstall.filter((pkg) => !extra_packages_1.EXTRA_PACKAGES[pkg]);
101
+ if (notExtraPackages.length > 0) {
102
+ throw new Error('No Remotion packages found in your project. Install Remotion first.');
103
+ }
52
104
  }
53
105
  const manager = studio_server_1.StudioServerInternals.getPackageManager(remotionRoot, packageManager, 0);
54
106
  if (manager === 'unknown') {
@@ -56,10 +108,16 @@ const addCommand = async ({ remotionRoot, packageManager, packageNames, logLevel
56
108
  .map((p) => p.path)
57
109
  .join(', ')}). Install dependencies using your favorite manager!`);
58
110
  }
111
+ const packagesWithVersions = toInstall.map((pkg) => {
112
+ if (extra_packages_1.EXTRA_PACKAGES[pkg]) {
113
+ return `${pkg}@${extra_packages_1.EXTRA_PACKAGES[pkg]}`;
114
+ }
115
+ return `${pkg}@${targetVersion}`;
116
+ });
59
117
  const command = studio_server_1.StudioServerInternals.getInstallCommand({
60
118
  manager: manager.manager,
61
- packages: toInstall,
62
- version: targetVersion,
119
+ packages: packagesWithVersions,
120
+ version: '',
63
121
  additionalArgs: args,
64
122
  });
65
123
  log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.gray(`$ ${manager.manager} ${command.join(' ')}`));
@@ -68,6 +126,7 @@ const addCommand = async ({ remotionRoot, packageManager, packageNames, logLevel
68
126
  ...process.env,
69
127
  ADBLOCK: '1',
70
128
  DISABLE_OPENCOLLECTIVE: '1',
129
+ npm_config_loglevel: 'error',
71
130
  },
72
131
  stdio: renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'info')
73
132
  ? 'inherit'
@@ -86,11 +145,18 @@ const addCommand = async ({ remotionRoot, packageManager, packageNames, logLevel
86
145
  }
87
146
  });
88
147
  });
89
- for (const pkg of alreadyInstalled) {
90
- log_1.Log.info({ indent: false, logLevel }, `○ ${pkg}@${targetVersion} ${chalk_1.chalk.gray('(already installed)')}`);
91
- }
148
+ const upgradedPkgs = new Set(toUpgrade.map((u) => u.pkg));
92
149
  for (const pkg of toInstall) {
93
- log_1.Log.info({ indent: false, logLevel }, `+ ${pkg}@${targetVersion}`);
150
+ if (upgradedPkgs.has(pkg)) {
151
+ // Already logged as upgrade
152
+ continue;
153
+ }
154
+ if (extra_packages_1.EXTRA_PACKAGES[pkg]) {
155
+ log_1.Log.info({ indent: false, logLevel }, `+ ${pkg}@${extra_packages_1.EXTRA_PACKAGES[pkg]}`);
156
+ }
157
+ else {
158
+ log_1.Log.info({ indent: false, logLevel }, `+ ${pkg}@${targetVersion}`);
159
+ }
94
160
  }
95
161
  };
96
162
  exports.addCommand = addCommand;
package/dist/benchmark.js CHANGED
@@ -382,6 +382,7 @@ const benchmarkCommand = async (remotionRoot, args, logLevel) => {
382
382
  }).value,
383
383
  onLog: renderer_1.RenderInternals.defaultOnLog,
384
384
  licenseKey: null,
385
+ isProduction: null,
385
386
  }, (run, progress) => {
386
387
  benchmarkProgress.update(makeBenchmarkProgressBar({
387
388
  totalRuns: runs,
@@ -0,0 +1,2 @@
1
+ export declare const EXTRA_PACKAGES: Record<string, string>;
2
+ export declare const EXTRA_PACKAGES_DOCS: Record<string, string>;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EXTRA_PACKAGES_DOCS = exports.EXTRA_PACKAGES = void 0;
4
+ exports.EXTRA_PACKAGES = {
5
+ zod: '3.22.3',
6
+ mediabunny: '1.29.0',
7
+ };
8
+ exports.EXTRA_PACKAGES_DOCS = {
9
+ zod: 'https://www.remotion.dev/docs/schemas#prerequisites',
10
+ mediabunny: 'https://www.remotion.dev/docs/mediabunny/version',
11
+ };
package/dist/index.js CHANGED
@@ -41,18 +41,15 @@ const print_help_1 = require("./print-help");
41
41
  const progress_bar_1 = require("./progress-bar");
42
42
  const render_1 = require("./render");
43
43
  const should_use_non_overlaying_logger_1 = require("./should-use-non-overlaying-logger");
44
+ const skills_1 = require("./skills");
44
45
  const still_1 = require("./still");
45
46
  const studio_1 = require("./studio");
46
47
  const upgrade_1 = require("./upgrade");
47
48
  const versions_1 = require("./versions");
48
49
  const cli = async () => {
49
50
  const [command, ...args] = parsed_cli_1.parsedCli._;
50
- if (parsed_cli_1.parsedCli.help) {
51
- (0, print_help_1.printHelp)('info');
52
- process.exit(0);
53
- }
54
51
  const remotionRoot = renderer_1.RenderInternals.findRemotionRoot();
55
- if (command !== versions_1.VERSIONS_COMMAND) {
52
+ if (command !== versions_1.VERSIONS_COMMAND && !parsed_cli_1.parsedCli.help) {
56
53
  await (0, versions_1.validateVersionsBeforeCommand)(remotionRoot, 'info');
57
54
  }
58
55
  const logLevel = await (0, initialize_cli_1.initializeCli)(remotionRoot);
@@ -131,6 +128,9 @@ const cli = async () => {
131
128
  args: additionalArgs,
132
129
  });
133
130
  }
131
+ else if (command === 'skills') {
132
+ await (0, skills_1.skillsCommand)(args, logLevel);
133
+ }
134
134
  else if (command === versions_1.VERSIONS_COMMAND) {
135
135
  await (0, versions_1.versionsCommand)(remotionRoot, logLevel);
136
136
  }
@@ -144,6 +144,9 @@ const cli = async () => {
144
144
  (0, print_help_1.printHelp)(logLevel);
145
145
  process.exit(0);
146
146
  }
147
+ else if (parsed_cli_1.parsedCli.help) {
148
+ (0, print_help_1.printHelp)(logLevel);
149
+ }
147
150
  else {
148
151
  if (command) {
149
152
  log_1.Log.error({ indent: false, logLevel }, `Command ${command} not found.`);
@@ -39,6 +39,7 @@ exports.BooleanFlags = [
39
39
  'compatible-only',
40
40
  'force-path-style',
41
41
  'onlyAllocateCpuDuringRequestProcessing',
42
+ client_1.BrowserSafeApis.options.isProductionOption.cliFlag,
42
43
  ];
43
44
  exports.parsedCli = (0, minimist_1.default)(process.argv.slice(2), {
44
45
  boolean: exports.BooleanFlags,
@@ -56,6 +56,9 @@ const printHelp = (logLevel) => {
56
56
  log_1.Log.info({ indent: false, logLevel }, 'Add Remotion packages with the correct version.');
57
57
  log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.gray('https://www.remotion.dev/docs/cli/add'));
58
58
  log_1.Log.info({ indent: false, logLevel });
59
+ log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.blue('remotion skills ') + chalk_1.chalk.gray('<add | update>'));
60
+ log_1.Log.info({ indent: false, logLevel }, 'Install or update skills from remotion-dev/skills.');
61
+ log_1.Log.info({ indent: false, logLevel });
59
62
  log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.blue(`remotion ${browser_1.BROWSER_COMMAND}`));
60
63
  log_1.Log.info({ indent: false, logLevel }, 'Ensure Remotion has a browser it can use for rendering.');
61
64
  log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.gray('https://www.remotion.dev/docs/cli/browser'));
@@ -500,8 +500,8 @@ const renderVideoFlow = async ({ remotionRoot, fullEntryPoint, indent, logLevel,
500
500
  chromeMode,
501
501
  mediaCacheSizeInBytes,
502
502
  onLog,
503
- apiKey: null,
504
503
  licenseKey: null,
504
+ isProduction: null,
505
505
  });
506
506
  if (!updatesDontOverwrite) {
507
507
  updateRenderProgress({ newline: true, printToConsole: true });
@@ -276,8 +276,8 @@ const renderStillFlow = async ({ remotionRoot, fullEntryPoint, entryPointReason,
276
276
  printToConsole: true,
277
277
  });
278
278
  },
279
- apiKey: null,
280
279
  licenseKey: null,
280
+ isProduction: null,
281
281
  });
282
282
  aggregate.rendering = {
283
283
  frames: 1,
@@ -0,0 +1,3 @@
1
+ import type { LogLevel } from '@remotion/renderer';
2
+ export declare const printSkillsHelp: (logLevel: LogLevel) => void;
3
+ export declare const skillsCommand: (args: string[], logLevel: LogLevel) => Promise<void> | undefined;
package/dist/skills.js ADDED
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.skillsCommand = exports.printSkillsHelp = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const chalk_1 = require("./chalk");
6
+ const log_1 = require("./log");
7
+ const printSkillsHelp = (logLevel) => {
8
+ log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.blue('remotion skills'));
9
+ log_1.Log.info({ indent: false, logLevel }, 'Install or update skills from remotion-dev/skills.');
10
+ log_1.Log.info({ indent: false, logLevel });
11
+ log_1.Log.info({ indent: false, logLevel }, 'Available subcommands:');
12
+ log_1.Log.info({ indent: false, logLevel });
13
+ log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.blue('remotion skills add'));
14
+ log_1.Log.info({ indent: false, logLevel }, 'Install skills from remotion-dev/skills.');
15
+ log_1.Log.info({ indent: false, logLevel });
16
+ log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.blue('remotion skills update'));
17
+ log_1.Log.info({ indent: false, logLevel }, 'Update skills from remotion-dev/skills.');
18
+ };
19
+ exports.printSkillsHelp = printSkillsHelp;
20
+ const skillsCommand = (args, logLevel) => {
21
+ const subcommand = args[0];
22
+ const restArgs = args.slice(1);
23
+ if (!subcommand || !['add', 'update'].includes(subcommand)) {
24
+ (0, exports.printSkillsHelp)(logLevel);
25
+ return;
26
+ }
27
+ const command = process.platform === 'win32' ? 'npx.cmd' : 'npx';
28
+ const fullArgs = [
29
+ '-y',
30
+ '--loglevel=error',
31
+ 'skills',
32
+ subcommand,
33
+ 'remotion-dev/skills',
34
+ ...restArgs,
35
+ ];
36
+ const child = (0, node_child_process_1.spawn)(command, fullArgs, {
37
+ stdio: 'inherit',
38
+ });
39
+ return new Promise((resolve, reject) => {
40
+ child.on('exit', (code) => {
41
+ if (code === 0) {
42
+ resolve();
43
+ }
44
+ else {
45
+ reject(new Error(`The skills command failed with exit code ${code}`));
46
+ }
47
+ });
48
+ child.on('error', (err) => {
49
+ reject(err);
50
+ });
51
+ });
52
+ };
53
+ exports.skillsCommand = skillsCommand;
package/dist/upgrade.js CHANGED
@@ -5,8 +5,26 @@ const renderer_1 = require("@remotion/renderer");
5
5
  const studio_server_1 = require("@remotion/studio-server");
6
6
  const node_child_process_1 = require("node:child_process");
7
7
  const chalk_1 = require("./chalk");
8
+ const extra_packages_1 = require("./extra-packages");
8
9
  const list_of_remotion_packages_1 = require("./list-of-remotion-packages");
9
10
  const log_1 = require("./log");
11
+ const getExtraPackageVersionsForRemotionVersion = (remotionVersion) => {
12
+ try {
13
+ const output = (0, node_child_process_1.execSync)(`npm view @remotion/studio@${remotionVersion} dependencies --json`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
14
+ const dependencies = JSON.parse(output);
15
+ const extraVersions = {};
16
+ for (const pkg of Object.keys(extra_packages_1.EXTRA_PACKAGES)) {
17
+ if (dependencies[pkg]) {
18
+ extraVersions[pkg] = dependencies[pkg];
19
+ }
20
+ }
21
+ return extraVersions;
22
+ }
23
+ catch (_a) {
24
+ // If we can't fetch the versions, return the default versions from EXTRA_PACKAGES
25
+ return extra_packages_1.EXTRA_PACKAGES;
26
+ }
27
+ };
10
28
  const upgradeCommand = async ({ remotionRoot, packageManager, version, logLevel, args, }) => {
11
29
  const { dependencies, devDependencies, optionalDependencies, peerDependencies, } = studio_server_1.StudioServerInternals.getInstalledDependencies(remotionRoot);
12
30
  let targetVersion;
@@ -24,14 +42,29 @@ const upgradeCommand = async ({ remotionRoot, packageManager, version, logLevel,
24
42
  .map((p) => p.path)
25
43
  .join(', ')}). Install dependencies using your favorite manager!`);
26
44
  }
27
- const toUpgrade = list_of_remotion_packages_1.listOfRemotionPackages.filter((u) => dependencies.includes(u) ||
28
- devDependencies.includes(u) ||
29
- optionalDependencies.includes(u) ||
30
- peerDependencies.includes(u));
45
+ const allDeps = [
46
+ ...dependencies,
47
+ ...devDependencies,
48
+ ...optionalDependencies,
49
+ ...peerDependencies,
50
+ ];
51
+ const remotionToUpgrade = list_of_remotion_packages_1.listOfRemotionPackages.filter((u) => allDeps.includes(u));
52
+ // Check if extra packages (zod, mediabunny) are installed
53
+ const installedExtraPackages = Object.keys(extra_packages_1.EXTRA_PACKAGES).filter((pkg) => allDeps.includes(pkg));
54
+ // Get the correct versions for extra packages for this Remotion version
55
+ const extraPackageVersions = getExtraPackageVersionsForRemotionVersion(targetVersion);
56
+ // Build the list of packages to upgrade
57
+ const packagesWithVersions = [
58
+ ...remotionToUpgrade.map((pkg) => `${pkg}@${targetVersion}`),
59
+ ...installedExtraPackages.map((pkg) => `${pkg}@${extraPackageVersions[pkg]}`),
60
+ ];
61
+ if (installedExtraPackages.length > 0) {
62
+ log_1.Log.info({ indent: false, logLevel }, `Also upgrading extra packages: ${installedExtraPackages.map((pkg) => `${pkg}@${extraPackageVersions[pkg]}`).join(', ')}`);
63
+ }
31
64
  const command = studio_server_1.StudioServerInternals.getInstallCommand({
32
65
  manager: manager.manager,
33
- packages: toUpgrade,
34
- version: targetVersion,
66
+ packages: packagesWithVersions,
67
+ version: '',
35
68
  additionalArgs: args,
36
69
  });
37
70
  log_1.Log.info({ indent: false, logLevel }, chalk_1.chalk.gray(`$ ${manager.manager} ${command.join(' ')}`));
package/dist/versions.js CHANGED
@@ -8,6 +8,7 @@ const renderer_1 = require("@remotion/renderer");
8
8
  const node_fs_1 = __importDefault(require("node:fs"));
9
9
  const node_path_1 = __importDefault(require("node:path"));
10
10
  const chalk_1 = require("./chalk");
11
+ const extra_packages_1 = require("./extra-packages");
11
12
  const list_of_remotion_packages_1 = require("./list-of-remotion-packages");
12
13
  const log_1 = require("./log");
13
14
  const parse_command_line_1 = require("./parse-command-line");
@@ -39,27 +40,69 @@ const groupBy = (vals) => {
39
40
  const getAllVersions = async (remotionRoot) => {
40
41
  return (await Promise.all(list_of_remotion_packages_1.listOfRemotionPackages.map(async (p) => [p, await getVersion(remotionRoot, p)]))).filter(([, version]) => version);
41
42
  };
43
+ const getExtraPackagesStatus = async (remotionRoot) => {
44
+ const results = [];
45
+ for (const [pkg, requiredVersion] of Object.entries(extra_packages_1.EXTRA_PACKAGES)) {
46
+ const versionAndPath = await getVersion(remotionRoot, pkg);
47
+ if (versionAndPath) {
48
+ results.push({
49
+ pkg,
50
+ requiredVersion,
51
+ installedVersion: versionAndPath.version,
52
+ path: versionAndPath.path,
53
+ isCorrect: versionAndPath.version === requiredVersion,
54
+ });
55
+ }
56
+ else {
57
+ results.push({
58
+ pkg,
59
+ requiredVersion,
60
+ installedVersion: null,
61
+ path: null,
62
+ isCorrect: true, // Not installed is fine - only validate if installed
63
+ });
64
+ }
65
+ }
66
+ return results;
67
+ };
42
68
  exports.VERSIONS_COMMAND = 'versions';
43
69
  const validateVersionsBeforeCommand = async (remotionRoot, logLevel) => {
44
70
  var _a;
45
71
  const versions = await getAllVersions(remotionRoot);
46
72
  const grouped = groupBy(versions);
47
73
  const installedVersions = Object.keys(grouped);
48
- if (installedVersions.length === 1) {
74
+ const hasRemotionMismatch = installedVersions.length > 1 && installedVersions.length !== 0;
75
+ // Check extra packages
76
+ const extraPackagesStatus = await getExtraPackagesStatus(remotionRoot);
77
+ const incorrectExtraPackages = extraPackagesStatus.filter((status) => !status.isCorrect);
78
+ if (!hasRemotionMismatch && incorrectExtraPackages.length === 0) {
49
79
  return;
50
80
  }
51
81
  // Could be a global install of @remotion/cli.
52
82
  // If you render a bundle with a different version, it will give a warning accordingly.
53
- if (installedVersions.length === 0) {
83
+ if (installedVersions.length === 0 && incorrectExtraPackages.length === 0) {
54
84
  return;
55
85
  }
56
86
  const logOptions = { indent: false, logLevel };
57
87
  log_1.Log.warn(logOptions, '-------------');
58
88
  log_1.Log.warn(logOptions, 'Version mismatch:');
59
- for (const version of installedVersions) {
60
- log_1.Log.warn(logOptions, `- On version: ${version}`);
61
- for (const pkg of (_a = grouped[version]) !== null && _a !== void 0 ? _a : []) {
62
- log_1.Log.warn(logOptions, ` - ${pkg.pkg} ${chalk_1.chalk.gray(node_path_1.default.relative(remotionRoot, pkg.versionAndPath.path))}`);
89
+ if (hasRemotionMismatch) {
90
+ for (const version of installedVersions) {
91
+ log_1.Log.warn(logOptions, `- On version: ${version}`);
92
+ for (const pkg of (_a = grouped[version]) !== null && _a !== void 0 ? _a : []) {
93
+ log_1.Log.warn(logOptions, ` - ${pkg.pkg} ${chalk_1.chalk.gray(node_path_1.default.relative(remotionRoot, pkg.versionAndPath.path))}`);
94
+ }
95
+ log_1.Log.info({ indent: false, logLevel });
96
+ }
97
+ }
98
+ if (incorrectExtraPackages.length > 0) {
99
+ log_1.Log.warn(logOptions, 'Extra packages with wrong versions:');
100
+ for (const status of incorrectExtraPackages) {
101
+ const docLink = extra_packages_1.EXTRA_PACKAGES_DOCS[status.pkg];
102
+ log_1.Log.warn(logOptions, ` - ${status.pkg}: installed ${status.installedVersion}, required ${status.requiredVersion}`);
103
+ if (docLink) {
104
+ log_1.Log.warn(logOptions, ` See: ${docLink}`);
105
+ }
63
106
  }
64
107
  log_1.Log.info({ indent: false, logLevel });
65
108
  }
@@ -71,6 +114,9 @@ const validateVersionsBeforeCommand = async (remotionRoot, logLevel) => {
71
114
  log_1.Log.warn(logOptions, 'To resolve:');
72
115
  log_1.Log.warn(logOptions, '- Make sure your package.json has all Remotion packages pointing to the same version.');
73
116
  log_1.Log.warn(logOptions, '- Remove the `^` character in front of a version to pin a package.');
117
+ for (const incorrectPkg of incorrectExtraPackages) {
118
+ log_1.Log.warn(logOptions, `- For ${incorrectPkg.pkg}, install exact version ${incorrectPkg.requiredVersion} (run: npx remotion add ${incorrectPkg.pkg}).`);
119
+ }
74
120
  if (!renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose')) {
75
121
  log_1.Log.warn(logOptions, '- Run `npx remotion versions --log=verbose` to see the path of the modules resolved.');
76
122
  }
@@ -94,19 +140,49 @@ const versionsCommand = async (remotionRoot, logLevel) => {
94
140
  }
95
141
  log_1.Log.info({ indent: false, logLevel });
96
142
  }
143
+ // Check extra packages
144
+ const extraPackagesStatus = await getExtraPackagesStatus(remotionRoot);
145
+ const installedExtraPackages = extraPackagesStatus.filter((status) => status.installedVersion !== null);
146
+ if (installedExtraPackages.length > 0) {
147
+ log_1.Log.info({ indent: false, logLevel }, 'Extra packages:');
148
+ for (const status of installedExtraPackages) {
149
+ const versionStatus = status.isCorrect
150
+ ? chalk_1.chalk.green(`${status.installedVersion}`)
151
+ : chalk_1.chalk.red(`${status.installedVersion} (required: ${status.requiredVersion})`);
152
+ log_1.Log.info({ indent: false, logLevel }, `- ${status.pkg}@${versionStatus}`);
153
+ if (status.path) {
154
+ log_1.Log.verbose({ indent: false, logLevel }, ` ${status.path}`);
155
+ }
156
+ }
157
+ log_1.Log.info({ indent: false, logLevel });
158
+ }
97
159
  if (installedVersions.length === 0) {
98
160
  log_1.Log.info({ indent: false, logLevel }, 'No Remotion packages found.');
99
161
  log_1.Log.info({ indent: false, logLevel }, 'Maybe @remotion/cli is installed globally.');
100
162
  log_1.Log.info({ indent: false, logLevel }, 'If you try to render a video that was bundled with a different version, you will get a warning.');
101
163
  process.exit(1);
102
164
  }
103
- if (installedVersions.length === 1) {
104
- log_1.Log.info({ indent: false, logLevel }, `✅ Great! All packages have the same version.`);
165
+ const incorrectExtraPackages = extraPackagesStatus.filter((status) => !status.isCorrect);
166
+ if (installedVersions.length === 1 && incorrectExtraPackages.length === 0) {
167
+ log_1.Log.info({ indent: false, logLevel }, `All packages have the correct version.`);
105
168
  }
106
169
  else {
107
- log_1.Log.error({ indent: false, logLevel }, 'Version mismatch: Not all Remotion packages have the same version.');
108
- log_1.Log.info({ indent: false, logLevel }, '- Make sure your package.json has all Remotion packages pointing to the same version.');
109
- log_1.Log.info({ indent: false, logLevel }, '- Remove the `^` character in front of a version to pin a package.');
170
+ if (installedVersions.length !== 1) {
171
+ log_1.Log.error({ indent: false, logLevel }, 'Version mismatch: Not all Remotion packages have the same version.');
172
+ log_1.Log.info({ indent: false, logLevel }, '- Make sure your package.json has all Remotion packages pointing to the same version.');
173
+ log_1.Log.info({ indent: false, logLevel }, '- Remove the `^` character in front of a version to pin a package.');
174
+ }
175
+ if (incorrectExtraPackages.length > 0) {
176
+ log_1.Log.error({ indent: false, logLevel }, 'Extra packages have incorrect versions:');
177
+ for (const status of incorrectExtraPackages) {
178
+ const docLink = extra_packages_1.EXTRA_PACKAGES_DOCS[status.pkg];
179
+ log_1.Log.info({ indent: false, logLevel }, `- ${status.pkg}: installed ${status.installedVersion}, required ${status.requiredVersion}`);
180
+ if (docLink) {
181
+ log_1.Log.info({ indent: false, logLevel }, ` See: ${docLink}`);
182
+ }
183
+ }
184
+ log_1.Log.info({ indent: false, logLevel }, `To fix, run: npx remotion add ${incorrectExtraPackages.map((s) => s.pkg).join(' ')}`);
185
+ }
110
186
  if (!renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose')) {
111
187
  log_1.Log.info({ indent: false, logLevel }, '- Rerun this command with --log=verbose to see the path of the modules resolved.');
112
188
  }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/cli"
4
4
  },
5
5
  "name": "@remotion/cli",
6
- "version": "4.0.409",
6
+ "version": "4.0.410",
7
7
  "description": "Control Remotion features using the `npx remotion` command",
8
8
  "main": "dist/index.js",
9
9
  "sideEffects": false,
@@ -36,17 +36,17 @@
36
36
  "author": "Jonny Burger <jonny@remotion.dev>",
37
37
  "license": "SEE LICENSE IN LICENSE.md",
38
38
  "dependencies": {
39
- "@remotion/bundler": "4.0.409",
40
- "@remotion/media-utils": "4.0.409",
41
- "@remotion/player": "4.0.409",
42
- "@remotion/renderer": "4.0.409",
43
- "@remotion/studio-shared": "4.0.409",
44
- "@remotion/studio-server": "4.0.409",
45
- "@remotion/studio": "4.0.409",
39
+ "@remotion/bundler": "4.0.410",
40
+ "@remotion/media-utils": "4.0.410",
41
+ "@remotion/player": "4.0.410",
42
+ "@remotion/renderer": "4.0.410",
43
+ "@remotion/studio-shared": "4.0.410",
44
+ "@remotion/studio-server": "4.0.410",
45
+ "@remotion/studio": "4.0.410",
46
46
  "dotenv": "9.0.2",
47
47
  "minimist": "1.2.6",
48
48
  "prompts": "2.4.2",
49
- "remotion": "4.0.409"
49
+ "remotion": "4.0.410"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "react": ">=16.8.0",
@@ -57,14 +57,14 @@
57
57
  "@types/prompts": "^2.4.1",
58
58
  "@types/prettier": "^2.7.2",
59
59
  "@types/node": "20.12.14",
60
- "@remotion/zod-types": "4.0.409",
61
- "@remotion/tailwind-v4": "4.0.409",
62
- "@remotion/enable-scss": "4.0.409",
63
- "@remotion/skia": "4.0.409",
60
+ "@remotion/zod-types": "4.0.410",
61
+ "@remotion/tailwind-v4": "4.0.410",
62
+ "@remotion/enable-scss": "4.0.410",
63
+ "@remotion/skia": "4.0.410",
64
64
  "react": "19.2.3",
65
65
  "react-dom": "19.2.3",
66
66
  "zod": "3.22.3",
67
- "@remotion/eslint-config-internal": "4.0.409",
67
+ "@remotion/eslint-config-internal": "4.0.410",
68
68
  "eslint": "9.19.0"
69
69
  },
70
70
  "keywords": [