@remotion/studio-server 4.0.469 → 4.0.470

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 (48) hide show
  1. package/dist/codemods/delete-effect.d.ts +18 -0
  2. package/dist/codemods/delete-effect.js +95 -21
  3. package/dist/codemods/delete-jsx-node.d.ts +10 -0
  4. package/dist/codemods/delete-jsx-node.js +38 -14
  5. package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.d.ts +4 -0
  6. package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.js +152 -0
  7. package/dist/codemods/update-keyframes/update-keyframes.d.ts +8 -0
  8. package/dist/codemods/update-keyframes/update-keyframes.js +94 -24
  9. package/dist/codemods/update-sequence-props/update-sequence-props.d.ts +32 -10
  10. package/dist/codemods/update-sequence-props/update-sequence-props.js +39 -7
  11. package/dist/index.d.ts +2 -1
  12. package/dist/preview-server/api-routes.js +16 -0
  13. package/dist/preview-server/routes/add-effect-keyframe.d.ts +3 -0
  14. package/dist/preview-server/routes/add-effect-keyframe.js +91 -0
  15. package/dist/preview-server/routes/add-sequence-keyframe.d.ts +3 -0
  16. package/dist/preview-server/routes/add-sequence-keyframe.js +84 -0
  17. package/dist/preview-server/routes/apply-codemod.js +1 -0
  18. package/dist/preview-server/routes/apply-visual-control-change.js +1 -0
  19. package/dist/preview-server/routes/can-update-sequence-props.js +33 -13
  20. package/dist/preview-server/routes/composition-component-info.d.ts +3 -0
  21. package/dist/preview-server/routes/composition-component-info.js +26 -0
  22. package/dist/preview-server/routes/delete-effect-keyframe.d.ts +3 -0
  23. package/dist/preview-server/routes/delete-effect-keyframe.js +89 -0
  24. package/dist/preview-server/routes/delete-effect.js +76 -37
  25. package/dist/preview-server/routes/delete-jsx-node.js +67 -36
  26. package/dist/preview-server/routes/delete-sequence-keyframe.d.ts +3 -0
  27. package/dist/preview-server/routes/delete-sequence-keyframe.js +82 -0
  28. package/dist/preview-server/routes/duplicate-jsx-node.js +1 -0
  29. package/dist/preview-server/routes/open-in-editor.d.ts +4 -0
  30. package/dist/preview-server/routes/open-in-editor.js +40 -0
  31. package/dist/preview-server/routes/register-client-render.d.ts +3 -0
  32. package/dist/preview-server/routes/register-client-render.js +11 -0
  33. package/dist/preview-server/routes/save-effect-props.js +1 -0
  34. package/dist/preview-server/routes/save-sequence-props.js +158 -72
  35. package/dist/preview-server/routes/unregister-client-render.d.ts +4 -0
  36. package/dist/preview-server/routes/unregister-client-render.js +11 -0
  37. package/dist/preview-server/routes/update-default-props.js +1 -0
  38. package/dist/preview-server/start-server.d.ts +1 -0
  39. package/dist/preview-server/start-server.js +1 -0
  40. package/dist/preview-server/undo-stack.d.ts +26 -3
  41. package/dist/preview-server/undo-stack.js +130 -42
  42. package/dist/preview-server/validate-same-origin.d.ts +2 -0
  43. package/dist/preview-server/validate-same-origin.js +13 -0
  44. package/dist/routes.d.ts +2 -1
  45. package/dist/routes.js +9 -136
  46. package/dist/start-studio.d.ts +2 -1
  47. package/dist/start-studio.js +2 -1
  48. package/package.json +6 -6
package/dist/routes.js CHANGED
@@ -44,18 +44,16 @@ const studio_shared_1 = require("@remotion/studio-shared");
44
44
  const client_render_queue_1 = require("./client-render-queue");
45
45
  const get_file_source_1 = require("./helpers/get-file-source");
46
46
  const get_installed_installable_packages_1 = require("./helpers/get-installed-installable-packages");
47
- const open_in_editor_1 = require("./helpers/open-in-editor");
48
- const resolve_composition_component_1 = require("./helpers/resolve-composition-component");
49
47
  const resolve_output_path_1 = require("./helpers/resolve-output-path");
50
48
  const api_routes_1 = require("./preview-server/api-routes");
51
49
  const get_package_manager_1 = require("./preview-server/get-package-manager");
52
50
  const get_static_file_fallback_hint_1 = require("./preview-server/get-static-file-fallback-hint");
53
51
  const handler_1 = require("./preview-server/handler");
54
- const parse_body_1 = require("./preview-server/parse-body");
55
52
  const public_folder_1 = require("./preview-server/public-folder");
53
+ const open_in_editor_1 = require("./preview-server/routes/open-in-editor");
56
54
  const serve_static_1 = require("./preview-server/serve-static");
55
+ const validate_same_origin_1 = require("./preview-server/validate-same-origin");
57
56
  const watch_ignore_next_change_1 = require("./preview-server/watch-ignore-next-change");
58
- const editorGuess = (0, open_in_editor_1.guessEditor)();
59
57
  const loggedStaticFileHints = new Set();
60
58
  const static404 = (response) => {
61
59
  response.writeHead(404);
@@ -80,7 +78,7 @@ const handleRemotionConfig = (response, remotionRoot) => {
80
78
  response.end(JSON.stringify(body));
81
79
  return Promise.resolve();
82
80
  };
83
- const handleFallback = async ({ remotionRoot, hash, response, request, getCurrentInputProps, getEnvVariables, publicDir, getRenderQueue, getRenderDefaults, numberOfAudioTags, audioLatencyHint, gitSource, logLevel, enableCrossSiteIsolation, }) => {
81
+ const handleFallback = async ({ remotionRoot, hash, response, request, getCurrentInputProps, getEnvVariables, publicDir, getRenderQueue, getRenderDefaults, numberOfAudioTags, audioLatencyHint, previewSampleRate, gitSource, logLevel, enableCrossSiteIsolation, }) => {
84
82
  var _a;
85
83
  const acceptsHtml = ((_a = request.headers.accept) !== null && _a !== void 0 ? _a : '').includes('text/html');
86
84
  if (request.method === 'GET' && acceptsHtml) {
@@ -103,8 +101,7 @@ const handleFallback = async ({ remotionRoot, hash, response, request, getCurren
103
101
  `Change \`"${pathname}"\` to \`staticFile("${pathname}")\` to fix the error.`,
104
102
  ].join('\n'));
105
103
  }
106
- const [edit] = await editorGuess;
107
- const displayName = (0, open_in_editor_1.getDisplayNameForEditor)(edit ? edit.command : null);
104
+ const displayName = await (0, open_in_editor_1.getEditorName)();
108
105
  response.setHeader('content-type', 'text/html');
109
106
  if (enableCrossSiteIsolation) {
110
107
  response.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
@@ -145,6 +142,7 @@ const handleFallback = async ({ remotionRoot, hash, response, request, getCurren
145
142
  logLevel,
146
143
  mode: 'dev',
147
144
  audioLatencyHint: audioLatencyHint !== null && audioLatencyHint !== void 0 ? audioLatencyHint : 'playback',
145
+ sampleRate: previewSampleRate,
148
146
  }));
149
147
  };
150
148
  const handleFileSource = async ({ method, remotionRoot, search, response, }) => {
@@ -167,88 +165,9 @@ const handleFileSource = async ({ method, remotionRoot, search, response, }) =>
167
165
  response.end();
168
166
  return Promise.resolve();
169
167
  };
170
- const handleOpenInEditor = async (remotionRoot, req, res, logLevel) => {
171
- if (req.method === 'OPTIONS') {
172
- res.statusCode = 200;
173
- res.end();
174
- return;
175
- }
176
- try {
177
- const body = (await (0, parse_body_1.parseRequestBody)(req));
178
- if (!('stack' in body)) {
179
- throw new TypeError('Need to pass stack');
180
- }
181
- const stack = body.stack;
182
- const guess = await editorGuess;
183
- const didOpen = await (0, open_in_editor_1.launchEditor)({
184
- colNumber: stack.originalColumnNumber,
185
- editor: guess[0],
186
- fileName: node_path_1.default.resolve(remotionRoot, stack.originalFileName),
187
- lineNumber: stack.originalLineNumber,
188
- vsCodeNewWindow: false,
189
- logLevel,
190
- });
191
- res.setHeader('content-type', 'application/json');
192
- res.writeHead(200);
193
- res.end(JSON.stringify({
194
- success: didOpen,
195
- }));
196
- }
197
- catch (_a) {
198
- res.setHeader('content-type', 'application/json');
199
- res.writeHead(200);
200
- res.end(JSON.stringify({
201
- success: false,
202
- }));
203
- }
204
- };
205
- const handleGetCompositionComponentInfo = async (remotionRoot, req, res) => {
206
- if (req.method === 'OPTIONS') {
207
- res.statusCode = 200;
208
- res.end();
209
- return;
210
- }
211
- res.setHeader('content-type', 'application/json');
212
- try {
213
- const body = (await (0, parse_body_1.parseRequestBody)(req));
214
- if (typeof body.compositionFile !== 'string') {
215
- throw new TypeError('Need to pass compositionFile');
216
- }
217
- if (typeof body.compositionId !== 'string') {
218
- throw new TypeError('Need to pass compositionId');
219
- }
220
- const location = await (0, resolve_composition_component_1.resolveCompositionComponent)({
221
- remotionRoot,
222
- compositionFile: body.compositionFile,
223
- compositionId: body.compositionId,
224
- });
225
- res.writeHead(200);
226
- res.end(JSON.stringify({
227
- success: true,
228
- location,
229
- canAddSequence: location.canAddSequence,
230
- }));
231
- }
232
- catch (err) {
233
- res.writeHead(200);
234
- res.end(JSON.stringify({
235
- success: false,
236
- error: err.message,
237
- }));
238
- }
239
- };
240
- const validateSameOrigin = (req) => {
241
- const { origin, host } = req.headers;
242
- if (origin) {
243
- const originUrl = new URL(origin);
244
- if (originUrl.host !== host) {
245
- throw new Error('Request from different origin not allowed');
246
- }
247
- }
248
- };
249
168
  const handleAddAsset = ({ req, res, search, publicDir, }) => {
250
169
  try {
251
- validateSameOrigin(req);
170
+ (0, validate_same_origin_1.validateSameOrigin)(req);
252
171
  const query = new node_url_1.URLSearchParams(search);
253
172
  const filePath = query.get('filePath');
254
173
  if (typeof filePath !== 'string') {
@@ -274,7 +193,7 @@ const handleAddAsset = ({ req, res, search, publicDir, }) => {
274
193
  };
275
194
  const handleUploadOutput = ({ req, res, search, remotionRoot, }) => {
276
195
  try {
277
- validateSameOrigin(req);
196
+ (0, validate_same_origin_1.validateSameOrigin)(req);
278
197
  const query = new node_url_1.URLSearchParams(search);
279
198
  const filePath = query.get('filePath');
280
199
  if (typeof filePath !== 'string') {
@@ -303,34 +222,6 @@ const handleUploadOutput = ({ req, res, search, remotionRoot, }) => {
303
222
  }
304
223
  return Promise.resolve();
305
224
  };
306
- const handleRegisterClientRender = async ({ req, res, remotionRoot, }) => {
307
- try {
308
- validateSameOrigin(req);
309
- const body = (await (0, parse_body_1.parseRequestBody)(req));
310
- (0, client_render_queue_1.addCompletedClientRender)({ render: body, remotionRoot });
311
- res.setHeader('content-type', 'application/json');
312
- res.writeHead(200);
313
- res.end(JSON.stringify({ success: true }));
314
- }
315
- catch (err) {
316
- res.statusCode = 500;
317
- res.end(JSON.stringify({ error: err.message }));
318
- }
319
- };
320
- const handleUnregisterClientRender = async ({ req, res, }) => {
321
- try {
322
- validateSameOrigin(req);
323
- const body = (await (0, parse_body_1.parseRequestBody)(req));
324
- (0, client_render_queue_1.removeCompletedClientRender)(body.id);
325
- res.setHeader('content-type', 'application/json');
326
- res.writeHead(200);
327
- res.end(JSON.stringify({ success: true }));
328
- }
329
- catch (err) {
330
- res.statusCode = 500;
331
- res.end(JSON.stringify({ error: err.message }));
332
- }
333
- };
334
225
  const handleFavicon = (_, response) => {
335
226
  const filePath = node_path_1.default.join(__dirname, '..', 'web', 'favicon.png');
336
227
  const stat = (0, node_fs_1.statSync)(filePath);
@@ -353,7 +244,7 @@ const handleBeep = (_, response) => {
353
244
  readStream.pipe(response);
354
245
  return Promise.resolve();
355
246
  };
356
- const handleRoutes = ({ staticHash, staticHashPrefix, outputHash, outputHashPrefix, request, response, liveEventsServer, getCurrentInputProps, getEnvVariables, remotionRoot, entryPoint, publicDir, logLevel, getRenderQueue, getRenderDefaults, numberOfAudioTags, queueMethods: methods, gitSource, binariesDirectory, audioLatencyHint, enableCrossSiteIsolation, }) => {
247
+ const handleRoutes = ({ staticHash, staticHashPrefix, outputHash, outputHashPrefix, request, response, liveEventsServer, getCurrentInputProps, getEnvVariables, remotionRoot, entryPoint, publicDir, logLevel, getRenderQueue, getRenderDefaults, numberOfAudioTags, queueMethods: methods, gitSource, binariesDirectory, audioLatencyHint, previewSampleRate, enableCrossSiteIsolation, }) => {
357
248
  const url = new URL(request.url, 'http://localhost');
358
249
  if (url.pathname === '/api/file-source') {
359
250
  return handleFileSource({
@@ -363,12 +254,6 @@ const handleRoutes = ({ staticHash, staticHashPrefix, outputHash, outputHashPref
363
254
  response,
364
255
  });
365
256
  }
366
- if (url.pathname === '/api/open-in-editor') {
367
- return handleOpenInEditor(remotionRoot, request, response, logLevel);
368
- }
369
- if (url.pathname === '/api/composition-component-info') {
370
- return handleGetCompositionComponentInfo(remotionRoot, request, response);
371
- }
372
257
  if (url.pathname === `${staticHash}/api/add-asset`) {
373
258
  return handleAddAsset({
374
259
  req: request,
@@ -385,19 +270,6 @@ const handleRoutes = ({ staticHash, staticHashPrefix, outputHash, outputHashPref
385
270
  remotionRoot,
386
271
  });
387
272
  }
388
- if (url.pathname === '/api/register-client-render') {
389
- return handleRegisterClientRender({
390
- req: request,
391
- res: response,
392
- remotionRoot,
393
- });
394
- }
395
- if (url.pathname === '/api/unregister-client-render') {
396
- return handleUnregisterClientRender({
397
- req: request,
398
- res: response,
399
- });
400
- }
401
273
  for (const [key, value] of Object.entries(api_routes_1.allApiRoutes)) {
402
274
  if (url.pathname === key) {
403
275
  return (0, handler_1.handleRequest)({
@@ -467,6 +339,7 @@ const handleRoutes = ({ staticHash, staticHashPrefix, outputHash, outputHashPref
467
339
  gitSource,
468
340
  logLevel,
469
341
  audioLatencyHint,
342
+ previewSampleRate,
470
343
  enableCrossSiteIsolation,
471
344
  });
472
345
  };
@@ -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, enableCrossSiteIsolation, askAIEnabled, forceNew, rspack, }: {
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, forceNew, rspack, }: {
10
10
  browserArgs: string;
11
11
  browserFlag: string;
12
12
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
@@ -27,6 +27,7 @@ export declare const startStudio: ({ browserArgs, browserFlag, shouldOpenBrowser
27
27
  getRenderQueue: () => RenderJob[];
28
28
  numberOfAudioTags: number;
29
29
  audioLatencyHint: AudioContextLatencyCategory | null;
30
+ previewSampleRate: number | null;
30
31
  enableCrossSiteIsolation: boolean;
31
32
  queueMethods: QueueMethods;
32
33
  previewEntry: string;
@@ -18,7 +18,7 @@ const public_folder_1 = require("./preview-server/public-folder");
18
18
  const start_server_1 = require("./preview-server/start-server");
19
19
  const server_ready_1 = require("./server-ready");
20
20
  const watch_root_file_1 = require("./watch-root-file");
21
- 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, enableCrossSiteIsolation, askAIEnabled, forceNew, rspack, }) => {
21
+ 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, forceNew, rspack, }) => {
22
22
  try {
23
23
  if (typeof Bun === 'undefined') {
24
24
  process.title = 'node (npx remotion studio)';
@@ -89,6 +89,7 @@ const startStudio = async ({ browserArgs, browserFlag, shouldOpenBrowser, fullEn
89
89
  binariesDirectory,
90
90
  forceIPv4,
91
91
  audioLatencyHint,
92
+ previewSampleRate,
92
93
  enableCrossSiteIsolation,
93
94
  askAIEnabled,
94
95
  forceNew,
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.469",
6
+ "version": "4.0.470",
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.469",
30
+ "remotion": "4.0.470",
31
31
  "recast": "0.23.11",
32
- "@remotion/bundler": "4.0.469",
33
- "@remotion/renderer": "4.0.469",
34
- "@remotion/studio-shared": "4.0.469",
32
+ "@remotion/bundler": "4.0.470",
33
+ "@remotion/renderer": "4.0.470",
34
+ "@remotion/studio-shared": "4.0.470",
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.469",
42
+ "@remotion/eslint-config-internal": "4.0.470",
43
43
  "eslint": "9.19.0",
44
44
  "@types/node": "20.12.14",
45
45
  "@typescript/native-preview": "7.0.0-dev.20260217.1"