@remotion/studio-server 4.0.490 → 4.0.492

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 (44) hide show
  1. package/dist/better-opn/index.d.ts +4 -0
  2. package/dist/better-opn/index.js +152 -31
  3. package/dist/codemods/paste-effects.d.ts +2 -1
  4. package/dist/codemods/paste-effects.js +33 -6
  5. package/dist/codemods/split-jsx-sequence.js +5 -0
  6. package/dist/codemods/update-keyframes/update-keyframes.d.ts +9 -5
  7. package/dist/codemods/update-keyframes/update-keyframes.js +88 -42
  8. package/dist/codemods/update-nested-prop.d.ts +3 -2
  9. package/dist/codemods/update-nested-prop.js +17 -4
  10. package/dist/codemods/update-sequence-props/update-sequence-props.d.ts +6 -3
  11. package/dist/codemods/update-sequence-props/update-sequence-props.js +51 -10
  12. package/dist/helpers/video-config-numeric-expression.d.ts +12 -0
  13. package/dist/helpers/video-config-numeric-expression.js +152 -0
  14. package/dist/helpers/video-config-values.d.ts +7 -0
  15. package/dist/helpers/video-config-values.js +84 -0
  16. package/dist/index.d.ts +1 -2
  17. package/dist/preview-server/element-install-state.d.ts +1 -0
  18. package/dist/preview-server/routes/add-effect-keyframe.js +6 -0
  19. package/dist/preview-server/routes/add-keyframes.js +2 -0
  20. package/dist/preview-server/routes/add-sequence-keyframe.js +2 -0
  21. package/dist/preview-server/routes/apply-codemod.d.ts +1 -0
  22. package/dist/preview-server/routes/apply-codemod.js +62 -13
  23. package/dist/preview-server/routes/can-update-effect-props.d.ts +8 -4
  24. package/dist/preview-server/routes/can-update-effect-props.js +26 -5
  25. package/dist/preview-server/routes/can-update-sequence-props.d.ts +12 -5
  26. package/dist/preview-server/routes/can-update-sequence-props.js +82 -33
  27. package/dist/preview-server/routes/delete-keyframes.js +8 -0
  28. package/dist/preview-server/routes/move-keyframes.js +2 -0
  29. package/dist/preview-server/routes/paste-effects.js +2 -1
  30. package/dist/preview-server/routes/save-effect-props.js +5 -0
  31. package/dist/preview-server/routes/save-sequence-props.js +5 -0
  32. package/dist/preview-server/routes/subscribe-to-sequence-props.js +3 -1
  33. package/dist/preview-server/routes/unsubscribe-from-sequence-props.js +3 -1
  34. package/dist/preview-server/routes/update-effect-keyframe-settings.js +6 -0
  35. package/dist/preview-server/routes/update-element-install-target.js +15 -1
  36. package/dist/preview-server/routes/update-sequence-keyframe-settings.js +2 -0
  37. package/dist/preview-server/sequence-props-watchers.d.ts +7 -3
  38. package/dist/preview-server/sequence-props-watchers.js +20 -6
  39. package/dist/preview-server/start-server.d.ts +0 -1
  40. package/dist/preview-server/start-server.js +0 -1
  41. package/dist/routes.js +3 -0
  42. package/dist/start-studio.d.ts +1 -2
  43. package/dist/start-studio.js +1 -2
  44. package/package.json +6 -6
@@ -14,7 +14,8 @@ const live_events_1 = require("./live-events");
14
14
  const node_path_cache_1 = require("./node-path-cache");
15
15
  const can_update_sequence_props_1 = require("./routes/can-update-sequence-props");
16
16
  const sequencePropsWatchers = {};
17
- const getSequencePropsStatus = ({ fileName, line, column, preferredNodePath, componentIdentity, keys, effects, remotionRoot, logLevel, }) => {
17
+ const getWatcherKey = (nodePath, assetKeys) => `${(0, studio_shared_1.stringifySequenceSubscriptionKey)(nodePath)}:${assetKeys.join('\0')}:${JSON.stringify(nodePath.videoConfigValues)}`;
18
+ const getSequencePropsStatus = ({ fileName, line, column, preferredNodePath, componentIdentity, keys, assetKeys, effects, remotionRoot, logLevel, videoConfigValues, }) => {
18
19
  if (preferredNodePath) {
19
20
  try {
20
21
  const fromNodePath = (0, can_update_sequence_props_1.computeSequencePropsStatus)({
@@ -22,8 +23,10 @@ const getSequencePropsStatus = ({ fileName, line, column, preferredNodePath, com
22
23
  nodePath: preferredNodePath,
23
24
  componentIdentity,
24
25
  keys,
26
+ assetKeys,
25
27
  effects,
26
28
  remotionRoot,
29
+ videoConfigValues,
27
30
  });
28
31
  return {
29
32
  status: fromNodePath,
@@ -32,6 +35,7 @@ const getSequencePropsStatus = ({ fileName, line, column, preferredNodePath, com
32
35
  nodePath: preferredNodePath,
33
36
  sequenceKeys: keys,
34
37
  effectKeys: effects,
38
+ videoConfigValues,
35
39
  },
36
40
  success: true,
37
41
  };
@@ -53,8 +57,10 @@ const getSequencePropsStatus = ({ fileName, line, column, preferredNodePath, com
53
57
  nodePath: cachedNodePath,
54
58
  componentIdentity,
55
59
  keys,
60
+ assetKeys,
56
61
  effects,
57
62
  remotionRoot,
63
+ videoConfigValues,
58
64
  });
59
65
  }
60
66
  catch (error) {
@@ -73,6 +79,7 @@ const getSequencePropsStatus = ({ fileName, line, column, preferredNodePath, com
73
79
  nodePath: cachedNodePath,
74
80
  sequenceKeys: keys,
75
81
  effectKeys: effects,
82
+ videoConfigValues,
76
83
  },
77
84
  success: true,
78
85
  };
@@ -83,13 +90,15 @@ const getSequencePropsStatus = ({ fileName, line, column, preferredNodePath, com
83
90
  line,
84
91
  componentIdentity,
85
92
  keys,
93
+ assetKeys,
86
94
  effects,
87
95
  remotionRoot,
88
96
  logLevel,
97
+ videoConfigValues,
89
98
  });
90
99
  return status;
91
100
  };
92
- const subscribeToSequencePropsWatchers = ({ fileName, line, column, nodePath: preferredNodePath, componentIdentity, keys, effects, remotionRoot, clientId, logLevel, }) => {
101
+ const subscribeToSequencePropsWatchers = ({ fileName, line, column, nodePath: preferredNodePath, componentIdentity, keys, assetKeys, effects, remotionRoot, clientId, logLevel, videoConfigValues, }) => {
93
102
  var _a;
94
103
  const initialResult = getSequencePropsStatus({
95
104
  fileName,
@@ -98,9 +107,11 @@ const subscribeToSequencePropsWatchers = ({ fileName, line, column, nodePath: pr
98
107
  preferredNodePath,
99
108
  componentIdentity,
100
109
  keys,
110
+ assetKeys,
101
111
  effects,
102
112
  remotionRoot,
103
113
  logLevel,
114
+ videoConfigValues,
104
115
  });
105
116
  if (!initialResult.success) {
106
117
  return initialResult;
@@ -109,7 +120,7 @@ const subscribeToSequencePropsWatchers = ({ fileName, line, column, nodePath: pr
109
120
  // Cache the resolved nodePath for future lookups with stale source maps
110
121
  (0, node_path_cache_1.setCachedNodePath)(fileName, line, column, initialResult.nodePath.nodePath);
111
122
  const { nodePath } = initialResult;
112
- const watcherKey = (0, studio_shared_1.stringifySequenceSubscriptionKey)(nodePath);
123
+ const watcherKey = getWatcherKey(nodePath, assetKeys);
113
124
  // If a watcher already exists for this key, just bump the ref count
114
125
  if ((_a = sequencePropsWatchers[clientId]) === null || _a === void 0 ? void 0 : _a[watcherKey]) {
115
126
  sequencePropsWatchers[clientId][watcherKey].refCount++;
@@ -131,7 +142,9 @@ const subscribeToSequencePropsWatchers = ({ fileName, line, column, nodePath: pr
131
142
  nodePath: nodePath.nodePath,
132
143
  componentIdentity,
133
144
  keys,
145
+ assetKeys,
134
146
  effects,
147
+ videoConfigValues,
135
148
  });
136
149
  const previousEffectChain = result.effects.map((effect) => effect.canUpdate && effect.callee);
137
150
  const newEffectChain = initialResult.success &&
@@ -173,14 +186,15 @@ const subscribeToSequencePropsWatchers = ({ fileName, line, column, nodePath: pr
173
186
  return initialResult;
174
187
  };
175
188
  exports.subscribeToSequencePropsWatchers = subscribeToSequencePropsWatchers;
176
- const unsubscribeFromSequencePropsWatchers = ({ fileName, nodePath, remotionRoot, clientId, sequenceKeys, effectKeys, }) => {
189
+ const unsubscribeFromSequencePropsWatchers = ({ fileName, nodePath, remotionRoot, clientId, sequenceKeys, assetKeys, effectKeys, videoConfigValues, }) => {
177
190
  const absolutePath = node_path_1.default.resolve(remotionRoot, fileName);
178
- const watcherKey = (0, studio_shared_1.stringifySequenceSubscriptionKey)({
191
+ const watcherKey = getWatcherKey({
179
192
  absolutePath,
180
193
  nodePath,
181
194
  sequenceKeys,
182
195
  effectKeys,
183
- });
196
+ videoConfigValues,
197
+ }, assetKeys);
184
198
  if (!sequencePropsWatchers[clientId] ||
185
199
  !sequencePropsWatchers[clientId][watcherKey]) {
186
200
  return;
@@ -22,7 +22,6 @@ export declare const startServer: (options: {
22
22
  bufferStateDelayInMilliseconds: number | null;
23
23
  remotionRoot: string;
24
24
  keyboardShortcutsEnabled: boolean;
25
- experimentalClientSideRenderingEnabled: boolean;
26
25
  publicDir: string;
27
26
  poll: number | null;
28
27
  staticHash: string;
@@ -41,7 +41,6 @@ const startServer = async (options) => {
41
41
  maxTimelineTracks: (_c = options === null || options === void 0 ? void 0 : options.maxTimelineTracks) !== null && _c !== void 0 ? _c : null,
42
42
  remotionRoot: options.remotionRoot,
43
43
  keyboardShortcutsEnabled: options.keyboardShortcutsEnabled,
44
- experimentalClientSideRenderingEnabled: options.experimentalClientSideRenderingEnabled,
45
44
  poll: options.poll,
46
45
  bufferStateDelayInMilliseconds: options.bufferStateDelayInMilliseconds,
47
46
  askAIEnabled: options.askAIEnabled,
package/dist/routes.js CHANGED
@@ -41,6 +41,7 @@ const node_url_1 = require("node:url");
41
41
  const bundler_1 = require("@remotion/bundler");
42
42
  const renderer_1 = require("@remotion/renderer");
43
43
  const studio_shared_1 = require("@remotion/studio-shared");
44
+ const better_opn_1 = require("./better-opn");
44
45
  const client_render_queue_1 = require("./client-render-queue");
45
46
  const get_file_source_1 = require("./helpers/get-file-source");
46
47
  const get_installed_installable_packages_1 = require("./helpers/get-installed-installable-packages");
@@ -215,6 +216,7 @@ const handleRequestElementInstall = async ({ liveEventsServer, request, response
215
216
  }));
216
217
  return;
217
218
  }
219
+ (0, better_opn_1.focusBrowserTab)({ url: target.studioUrl }).catch(() => undefined);
218
220
  response.writeHead(200);
219
221
  response.end(JSON.stringify({ success: true, status: 'sent' }));
220
222
  }
@@ -276,6 +278,7 @@ const handleFallback = async ({ remotionRoot, hash, response, request, getCurren
276
278
  title: 'Remotion Studio',
277
279
  renderDefaults: getRenderDefaults(),
278
280
  publicFolderExists: (0, node_fs_1.existsSync)(publicDir) ? publicDir : null,
281
+ fileSystemPlatform: process.platform,
279
282
  gitSource,
280
283
  projectName: (0, studio_shared_1.getProjectName)({
281
284
  basename: node_path_1.default.basename,
@@ -6,7 +6,7 @@ export type StartStudioResult = {
6
6
  } | {
7
7
  type: 'already-running';
8
8
  };
9
- export declare const startStudio: ({ browserArgs, browserFlag, shouldOpenBrowser, fullEntryPath, logLevel, getCurrentInputProps, getEnvVariables, desiredPort, maxTimelineTracks, remotionRoot, keyboardShortcutsEnabled, experimentalClientSideRenderingEnabled, relativePublicDir, webpackOverride, poll, getRenderDefaults, getRenderQueue, numberOfAudioTags, queueMethods, previewEntry, gitSource, bufferStateDelayInMilliseconds, binariesDirectory, forceIPv4, audioLatencyHint, previewSampleRate, enableCrossSiteIsolation, askAIEnabled, interactivityEnabled, forceNew, rspack, getStudioRuntimeConfig, }: {
9
+ export declare const startStudio: ({ browserArgs, browserFlag, shouldOpenBrowser, fullEntryPath, logLevel, getCurrentInputProps, getEnvVariables, desiredPort, maxTimelineTracks, remotionRoot, keyboardShortcutsEnabled, relativePublicDir, webpackOverride, poll, getRenderDefaults, getRenderQueue, numberOfAudioTags, queueMethods, previewEntry, gitSource, bufferStateDelayInMilliseconds, binariesDirectory, forceIPv4, audioLatencyHint, previewSampleRate, enableCrossSiteIsolation, askAIEnabled, interactivityEnabled, forceNew, rspack, getStudioRuntimeConfig, }: {
10
10
  browserArgs: string;
11
11
  browserFlag: string;
12
12
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
@@ -19,7 +19,6 @@ export declare const startStudio: ({ browserArgs, browserFlag, shouldOpenBrowser
19
19
  bufferStateDelayInMilliseconds: number | null;
20
20
  remotionRoot: string;
21
21
  keyboardShortcutsEnabled: boolean;
22
- experimentalClientSideRenderingEnabled: boolean;
23
22
  relativePublicDir: string | null;
24
23
  webpackOverride: WebpackOverrideFn;
25
24
  poll: number | null;
@@ -19,7 +19,7 @@ const public_folder_1 = require("./preview-server/public-folder");
19
19
  const start_server_1 = require("./preview-server/start-server");
20
20
  const server_ready_1 = require("./server-ready");
21
21
  const watch_root_file_1 = require("./watch-root-file");
22
- const startStudio = async ({ browserArgs, browserFlag, shouldOpenBrowser, fullEntryPath, logLevel, getCurrentInputProps, getEnvVariables, desiredPort, maxTimelineTracks, remotionRoot, keyboardShortcutsEnabled, experimentalClientSideRenderingEnabled, relativePublicDir, webpackOverride, poll, getRenderDefaults, getRenderQueue, numberOfAudioTags, queueMethods, previewEntry, gitSource, bufferStateDelayInMilliseconds, binariesDirectory, forceIPv4, audioLatencyHint, previewSampleRate, enableCrossSiteIsolation, askAIEnabled, interactivityEnabled, forceNew, rspack, getStudioRuntimeConfig, }) => {
22
+ const startStudio = async ({ browserArgs, browserFlag, shouldOpenBrowser, fullEntryPath, logLevel, getCurrentInputProps, getEnvVariables, desiredPort, maxTimelineTracks, remotionRoot, keyboardShortcutsEnabled, relativePublicDir, webpackOverride, poll, getRenderDefaults, getRenderQueue, numberOfAudioTags, queueMethods, previewEntry, gitSource, bufferStateDelayInMilliseconds, binariesDirectory, forceIPv4, audioLatencyHint, previewSampleRate, enableCrossSiteIsolation, askAIEnabled, interactivityEnabled, forceNew, rspack, getStudioRuntimeConfig, }) => {
23
23
  try {
24
24
  if (typeof Bun === 'undefined') {
25
25
  process.title = 'node (npx remotion studio)';
@@ -72,7 +72,6 @@ const startStudio = async ({ browserArgs, browserFlag, shouldOpenBrowser, fullEn
72
72
  maxTimelineTracks,
73
73
  remotionRoot,
74
74
  keyboardShortcutsEnabled,
75
- experimentalClientSideRenderingEnabled,
76
75
  publicDir,
77
76
  webpackOverride,
78
77
  poll,
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.490",
6
+ "version": "4.0.492",
7
7
  "description": "Run a Remotion Studio with a server backend",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -27,11 +27,11 @@
27
27
  "@babel/parser": "7.24.1",
28
28
  "semver": "7.5.3",
29
29
  "prettier": "3.8.1",
30
- "remotion": "4.0.490",
30
+ "remotion": "4.0.492",
31
31
  "recast": "0.23.11",
32
- "@remotion/bundler": "4.0.490",
33
- "@remotion/renderer": "4.0.490",
34
- "@remotion/studio-shared": "4.0.490",
32
+ "@remotion/bundler": "4.0.492",
33
+ "@remotion/renderer": "4.0.492",
34
+ "@remotion/studio-shared": "4.0.492",
35
35
  "memfs": "3.4.3",
36
36
  "open": "8.4.2"
37
37
  },
@@ -39,7 +39,7 @@
39
39
  "ast-types": "0.16.1",
40
40
  "react": "19.2.3",
41
41
  "@types/semver": "7.5.3",
42
- "@remotion/eslint-config-internal": "4.0.490",
42
+ "@remotion/eslint-config-internal": "4.0.492",
43
43
  "eslint": "9.19.0",
44
44
  "@types/node": "20.12.14",
45
45
  "@typescript/native-preview": "7.0.0-dev.20260217.1"