@remotion/studio-server 4.0.513 → 4.0.515

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 (67) hide show
  1. package/dist/codemods/delete-jsx-node.d.ts +2 -5
  2. package/dist/codemods/delete-jsx-node.js +23 -341
  3. package/dist/codemods/duplicate-composition.d.ts +1 -9
  4. package/dist/codemods/duplicate-composition.js +3 -49
  5. package/dist/codemods/format-inline-content.d.ts +0 -4
  6. package/dist/codemods/format-inline-content.js +7 -46
  7. package/dist/codemods/recast-mods.js +0 -18
  8. package/dist/codemods/reorder-sequence.d.ts +2 -2
  9. package/dist/codemods/reorder-sequence.js +12 -112
  10. package/dist/codemods/split-jsx-sequence.d.ts +1 -2
  11. package/dist/codemods/split-jsx-sequence.js +11 -298
  12. package/dist/codemods/split-video-from-audio.d.ts +15 -0
  13. package/dist/codemods/split-video-from-audio.js +15 -0
  14. package/dist/codemods/update-default-props.d.ts +2 -6
  15. package/dist/codemods/update-default-props.js +12 -220
  16. package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.d.ts +1 -4
  17. package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.js +5 -102
  18. package/dist/codemods/update-keyframes/update-keyframes.d.ts +8 -93
  19. package/dist/codemods/update-keyframes/update-keyframes.js +11 -1302
  20. package/dist/detect-outdated-remotion-skills.d.ts +7 -0
  21. package/dist/detect-outdated-remotion-skills.js +11 -5
  22. package/dist/helpers/open-file-for-writing-without-symlinks.d.ts +4 -0
  23. package/dist/helpers/open-file-for-writing-without-symlinks.js +52 -0
  24. package/dist/helpers/resolve-composition-component.d.ts +3 -11
  25. package/dist/helpers/resolve-composition-component.js +38 -1495
  26. package/dist/helpers/video-config-values.js +25 -6
  27. package/dist/index.d.ts +3 -2
  28. package/dist/index.js +1 -0
  29. package/dist/max-timeline-tracks.d.ts +2 -1
  30. package/dist/max-timeline-tracks.js +10 -4
  31. package/dist/preview-server/api-routes.js +4 -0
  32. package/dist/preview-server/routes/add-effect.js +1 -1
  33. package/dist/preview-server/routes/apply-codemod.js +3 -3
  34. package/dist/preview-server/routes/apply-visual-control-change.js +3 -3
  35. package/dist/preview-server/routes/can-update-sequence-props.js +107 -24
  36. package/dist/preview-server/routes/delete-effect-keyframe.d.ts +3 -0
  37. package/dist/preview-server/routes/delete-effect-keyframe.js +89 -0
  38. package/dist/preview-server/routes/delete-effect.js +1 -1
  39. package/dist/preview-server/routes/delete-jsx-node.js +1 -1
  40. package/dist/preview-server/routes/delete-sequence-keyframe.d.ts +3 -0
  41. package/dist/preview-server/routes/delete-sequence-keyframe.js +82 -0
  42. package/dist/preview-server/routes/duplicate-effect.js +1 -1
  43. package/dist/preview-server/routes/duplicate-jsx-node.js +1 -1
  44. package/dist/preview-server/routes/element-install-plan.d.ts +1 -1
  45. package/dist/preview-server/routes/insert-element.js +2 -2
  46. package/dist/preview-server/routes/insert-jsx-element.js +1 -1
  47. package/dist/preview-server/routes/install-dependency.js +8 -2
  48. package/dist/preview-server/routes/log-updates/log-effect-update.js +2 -1
  49. package/dist/preview-server/routes/log-updates/log-update.js +2 -1
  50. package/dist/preview-server/routes/paste-effects.js +1 -1
  51. package/dist/preview-server/routes/remotion-skills-info.d.ts +7 -0
  52. package/dist/preview-server/routes/remotion-skills-info.js +24 -0
  53. package/dist/preview-server/routes/reorder-effect.js +1 -1
  54. package/dist/preview-server/routes/reorder-sequence.js +1 -1
  55. package/dist/preview-server/routes/save-props-mutex.d.ts +1 -0
  56. package/dist/preview-server/routes/save-props-mutex.js +11 -0
  57. package/dist/preview-server/routes/source-file-write-queue.d.ts +1 -0
  58. package/dist/preview-server/routes/source-file-write-queue.js +11 -2
  59. package/dist/preview-server/routes/split-jsx-sequence.js +1 -1
  60. package/dist/preview-server/routes/split-video-from-audio.d.ts +3 -0
  61. package/dist/preview-server/routes/split-video-from-audio.js +80 -0
  62. package/dist/preview-server/routes/update-default-props.js +1 -1
  63. package/dist/preview-server/start-server.js +188 -140
  64. package/dist/preview-server/undo-stack.d.ts +3 -52
  65. package/dist/preview-server/update-available.js +4 -4
  66. package/dist/routes.js +36 -5
  67. package/package.json +8 -8
@@ -4,7 +4,7 @@ export interface UndoEntryDescription {
4
4
  undoMessage: string;
5
5
  redoMessage: string;
6
6
  }
7
- type UndoEntryType = 'visual-control' | 'default-props' | 'sequence-props' | 'effect-props' | 'keyframe-add' | 'keyframe-delete' | 'add-effect' | 'delete-effect' | 'duplicate-effect' | 'paste-effects' | 'reorder-effect' | 'reorder-sequence' | 'delete-jsx-node' | 'duplicate-jsx-node' | 'split-jsx-sequence' | 'insert-jsx-element' | 'delete-composition' | 'rename-composition' | 'update-composition-metadata' | 'new-composition' | 'duplicate-composition' | 'move-composition-to-folder' | 'new-folder' | 'delete-folder' | 'rename-folder';
7
+ type UndoEntryType = 'visual-control' | 'default-props' | 'sequence-props' | 'effect-props' | 'keyframe-add' | 'keyframe-delete' | 'add-effect' | 'delete-effect' | 'duplicate-effect' | 'paste-effects' | 'reorder-effect' | 'reorder-sequence' | 'delete-jsx-node' | 'duplicate-jsx-node' | 'split-jsx-sequence' | 'split-video-from-audio' | 'insert-jsx-element' | 'delete-composition' | 'rename-composition' | 'update-composition-metadata' | 'new-composition' | 'duplicate-composition' | 'move-composition-to-folder' | 'new-folder' | 'delete-folder' | 'rename-folder';
8
8
  type UndoEntrySnapshot = {
9
9
  filePath: string;
10
10
  oldContents: string | null;
@@ -21,57 +21,8 @@ type UndoEntry = {
21
21
  description: UndoEntryDescription;
22
22
  /** When true, undo/redo file restores call `suppressBundlerUpdateForFile` (skip HMR refresh). */
23
23
  suppressHmrOnFileRestore: boolean;
24
- } & ({
25
- entryType: 'visual-control';
26
- } | {
27
- entryType: 'default-props';
28
- } | {
29
- entryType: 'sequence-props';
30
- } | {
31
- entryType: 'effect-props';
32
- } | {
33
- entryType: 'keyframe-add';
34
- } | {
35
- entryType: 'keyframe-delete';
36
- } | {
37
- entryType: 'add-effect';
38
- } | {
39
- entryType: 'delete-effect';
40
- } | {
41
- entryType: 'duplicate-effect';
42
- } | {
43
- entryType: 'paste-effects';
44
- } | {
45
- entryType: 'reorder-effect';
46
- } | {
47
- entryType: 'reorder-sequence';
48
- } | {
49
- entryType: 'delete-jsx-node';
50
- } | {
51
- entryType: 'duplicate-jsx-node';
52
- } | {
53
- entryType: 'split-jsx-sequence';
54
- } | {
55
- entryType: 'insert-jsx-element';
56
- } | {
57
- entryType: 'delete-composition';
58
- } | {
59
- entryType: 'rename-composition';
60
- } | {
61
- entryType: 'update-composition-metadata';
62
- } | {
63
- entryType: 'new-composition';
64
- } | {
65
- entryType: 'duplicate-composition';
66
- } | {
67
- entryType: 'move-composition-to-folder';
68
- } | {
69
- entryType: 'new-folder';
70
- } | {
71
- entryType: 'delete-folder';
72
- } | {
73
- entryType: 'rename-folder';
74
- });
24
+ entryType: UndoEntryType;
25
+ };
75
26
  export declare function pushToUndoStack({ filePath, oldContents, newContents, logLevel, remotionRoot, logLine, description, entryType, suppressHmrOnFileRestore, nodePathRemappings }: {
76
27
  filePath: string;
77
28
  oldContents: string;
@@ -4,8 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.isUpdateAvailableWithTimeout = exports.getRemotionVersion = exports.isUpdateAvailable = void 0;
7
- const node_fs_1 = require("node:fs");
8
- const node_path_1 = __importDefault(require("node:path"));
9
7
  const semver_1 = __importDefault(require("semver"));
10
8
  const detect_outdated_remotion_skills_1 = require("../detect-outdated-remotion-skills");
11
9
  const get_latest_remotion_version_1 = require("../get-latest-remotion-version");
@@ -17,12 +15,14 @@ const getSkillsUpdateInfo = ({ remotionRoot, currentVersion, }) => {
17
15
  }).project;
18
16
  return {
19
17
  skillsUpdateAvailable: projectSkills.type === 'outdated',
20
- remotionUpgradeSkillAvailable: (0, node_fs_1.existsSync)(node_path_1.default.join(remotionRoot, '.agents', 'skills', 'remotion-upgrade', 'SKILL.md')),
21
18
  };
22
19
  };
23
20
  const isUpdateAvailable = async ({ remotionRoot, currentVersion, logLevel, getLatestVersion, }) => {
24
21
  const latest = await (getLatestVersion !== null && getLatestVersion !== void 0 ? getLatestVersion : get_latest_remotion_version_1.getLatestRemotionVersion)();
25
- const skillsUpdateInfo = getSkillsUpdateInfo({ remotionRoot, currentVersion });
22
+ const skillsUpdateInfo = getSkillsUpdateInfo({
23
+ remotionRoot,
24
+ currentVersion,
25
+ });
26
26
  const pkgManager = (0, get_package_manager_1.getPackageManager)({
27
27
  remotionRoot,
28
28
  packageManager: undefined,
package/dist/routes.js CHANGED
@@ -34,7 +34,6 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.handleRoutes = void 0;
37
- const fs_1 = __importStar(require("fs"));
38
37
  const node_fs_1 = require("node:fs");
39
38
  const node_path_1 = __importStar(require("node:path"));
40
39
  const node_url_1 = require("node:url");
@@ -45,6 +44,7 @@ const better_opn_1 = require("./better-opn");
45
44
  const client_render_queue_1 = require("./client-render-queue");
46
45
  const get_file_source_1 = require("./helpers/get-file-source");
47
46
  const get_installed_installable_packages_1 = require("./helpers/get-installed-installable-packages");
47
+ const open_file_for_writing_without_symlinks_1 = require("./helpers/open-file-for-writing-without-symlinks");
48
48
  const resolve_output_path_1 = require("./helpers/resolve-output-path");
49
49
  const api_routes_1 = require("./preview-server/api-routes");
50
50
  const get_package_manager_1 = require("./preview-server/get-package-manager");
@@ -61,6 +61,21 @@ const origin_policy_1 = require("./preview-server/studio-protocol/origin-policy"
61
61
  const validate_same_origin_1 = require("./preview-server/validate-same-origin");
62
62
  const watch_ignore_next_change_1 = require("./preview-server/watch-ignore-next-change");
63
63
  const loggedStaticFileHints = new Set();
64
+ const clientRenderOutputExtensions = new Set([
65
+ 'aac',
66
+ 'flac',
67
+ 'jpeg',
68
+ 'jpg',
69
+ 'mkv',
70
+ 'mov',
71
+ 'mp3',
72
+ 'mp4',
73
+ 'ogg',
74
+ 'png',
75
+ 'wav',
76
+ 'webm',
77
+ 'webp',
78
+ ]);
64
79
  const static404 = (response) => {
65
80
  response.writeHead(404);
66
81
  response.end('The static/ prefix has been changed, this URL is no longer valid.');
@@ -188,8 +203,14 @@ const handleAddAsset = ({ req, res, search, publicDir, }) => {
188
203
  if (relativeToPublicDir.startsWith('..')) {
189
204
  throw new Error(`Not allowed to write to ${relativeToPublicDir}`);
190
205
  }
191
- fs_1.default.mkdirSync(node_path_1.default.dirname(absolutePath), { recursive: true });
192
- const writeStream = (0, fs_1.createWriteStream)(absolutePath);
206
+ const fileDescriptor = (0, open_file_for_writing_without_symlinks_1.openFileForWritingWithoutSymlinks)({
207
+ rootDirectory: publicDir,
208
+ absolutePath,
209
+ });
210
+ const writeStream = (0, node_fs_1.createWriteStream)(absolutePath, {
211
+ fd: fileDescriptor,
212
+ autoClose: true,
213
+ });
193
214
  writeStream.on('close', () => {
194
215
  res.end(JSON.stringify({ success: true }));
195
216
  });
@@ -210,8 +231,18 @@ const handleUploadOutput = ({ req, res, search, remotionRoot, }) => {
210
231
  throw new Error('No `filePath` provided');
211
232
  }
212
233
  const absolutePath = (0, resolve_output_path_1.resolveOutputPath)(remotionRoot, filePath);
213
- fs_1.default.mkdirSync(node_path_1.default.dirname(absolutePath), { recursive: true });
214
- const writeStream = (0, fs_1.createWriteStream)(absolutePath);
234
+ const extension = node_path_1.default.extname(absolutePath).slice(1).toLowerCase();
235
+ if (!clientRenderOutputExtensions.has(extension)) {
236
+ throw new Error(`Not allowed to upload a .${extension || 'unknown'} file`);
237
+ }
238
+ const fileDescriptor = (0, open_file_for_writing_without_symlinks_1.openFileForWritingWithoutSymlinks)({
239
+ rootDirectory: remotionRoot,
240
+ absolutePath,
241
+ });
242
+ const writeStream = (0, node_fs_1.createWriteStream)(absolutePath, {
243
+ fd: fileDescriptor,
244
+ autoClose: true,
245
+ });
215
246
  writeStream.on('close', () => {
216
247
  res.end(JSON.stringify({ success: true }));
217
248
  });
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio-server"
4
4
  },
5
5
  "name": "@remotion/studio-server",
6
- "version": "4.0.513",
6
+ "version": "4.0.515",
7
7
  "description": "Run a Remotion Studio with a server backend",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -23,7 +23,7 @@
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@remotion/studio-protocol": "4.0.513",
26
+ "@remotion/studio-protocol": "4.0.515",
27
27
  "@babel/types": "7.24.0",
28
28
  "@babel/parser": "7.24.1",
29
29
  "@svgr/core": "8.1.0",
@@ -32,12 +32,12 @@
32
32
  "semver": "7.5.3",
33
33
  "zod": "4.4.3",
34
34
  "prettier": "3.8.1",
35
- "remotion": "4.0.513",
35
+ "remotion": "4.0.515",
36
36
  "recast": "0.23.11",
37
- "@remotion/bundler": "4.0.513",
38
- "@remotion/renderer": "4.0.513",
39
- "@remotion/studio-codemods": "4.0.513",
40
- "@remotion/studio-shared": "4.0.513",
37
+ "@remotion/bundler": "4.0.515",
38
+ "@remotion/renderer": "4.0.515",
39
+ "@remotion/studio-codemods": "4.0.515",
40
+ "@remotion/studio-shared": "4.0.515",
41
41
  "memfs": "3.4.3",
42
42
  "open": "8.4.2"
43
43
  },
@@ -45,7 +45,7 @@
45
45
  "ast-types": "0.16.1",
46
46
  "react": "19.2.3",
47
47
  "@types/semver": "7.5.3",
48
- "@remotion/eslint-config-internal": "4.0.513",
48
+ "@remotion/eslint-config-internal": "4.0.515",
49
49
  "eslint": "9.19.0",
50
50
  "@types/node": "20.12.14",
51
51
  "@typescript/native-preview": "7.0.0-dev.20260217.1"