@remotion/studio-server 4.0.494 → 4.0.496

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.
@@ -44,8 +44,10 @@ const recast = __importStar(require("recast"));
44
44
  const no_react_1 = require("remotion/no-react");
45
45
  const format_file_content_1 = require("../codemods/format-file-content");
46
46
  const parse_ast_1 = require("../codemods/parse-ast");
47
+ const strip_parenthesized_extra_1 = require("../codemods/strip-parenthesized-extra");
47
48
  const update_nested_prop_1 = require("../codemods/update-nested-prop");
48
49
  const imports_1 = require("./imports");
50
+ const svg_to_jsx_1 = require("./svg-to-jsx");
49
51
  const allowedFileExtensions = new Set(['.tsx', '.ts', '.jsx', '.js']);
50
52
  const extensionsToProbe = ['.tsx', '.ts', '.jsx', '.js'];
51
53
  const isInRemotionRoot = ({ remotionRoot, fileName, }) => {
@@ -609,6 +611,35 @@ const createAssetElement = ({ addPositionStyle, localName, staticFileLocalName,
609
611
  : []),
610
612
  ], true), null, []);
611
613
  };
614
+ const createSvgElement = async ({ interactiveLocalName, markup, position, }) => {
615
+ var _a;
616
+ var _b;
617
+ const svgElement = await (0, svg_to_jsx_1.svgMarkupToJsx)(markup);
618
+ const attributes = (_b = svgElement.openingElement.attributes) !== null && _b !== void 0 ? _b : [];
619
+ svgElement.openingElement.attributes = attributes;
620
+ const styleAttribute = attributes.find((attribute) => attribute.type === 'JSXAttribute' &&
621
+ attribute.name.type === 'JSXIdentifier' &&
622
+ attribute.name.name === 'style');
623
+ const positionProperties = getPositionStyleProperties(position);
624
+ if (styleAttribute === undefined) {
625
+ attributes.push(createStyleAttribute(positionProperties));
626
+ }
627
+ else if (styleAttribute.type === 'JSXAttribute' &&
628
+ ((_a = styleAttribute.value) === null || _a === void 0 ? void 0 : _a.type) === 'JSXExpressionContainer' &&
629
+ styleAttribute.value.expression.type === 'ObjectExpression') {
630
+ styleAttribute.value.expression.properties.push(...positionProperties);
631
+ }
632
+ else {
633
+ throw new Error('Could not convert the root SVG style to JSX');
634
+ }
635
+ const interactiveSvgName = () => recast.types.builders.jsxMemberExpression(recast.types.builders.jsxIdentifier(interactiveLocalName), recast.types.builders.jsxIdentifier('Svg'));
636
+ svgElement.openingElement.name = interactiveSvgName();
637
+ if (svgElement.closingElement !== null &&
638
+ svgElement.closingElement !== undefined) {
639
+ svgElement.closingElement.name = interactiveSvgName();
640
+ }
641
+ return svgElement;
642
+ };
612
643
  const createFragmentWithElement = (element) => {
613
644
  return recast.types.builders.jsxFragment(recast.types.builders.jsxOpeningFragment(), recast.types.builders.jsxClosingFragment(), [element]);
614
645
  };
@@ -732,6 +763,36 @@ const ensureSequenceImport = (ast) => {
732
763
  localName: getAvailableSequenceLocalName(ast),
733
764
  });
734
765
  };
766
+ const ensureInteractiveImport = (ast) => {
767
+ var _a;
768
+ var _b, _c;
769
+ for (const statement of ast.program.body) {
770
+ if (statement.type !== 'ImportDeclaration' ||
771
+ statement.source.type !== 'StringLiteral' ||
772
+ statement.source.value !== 'remotion') {
773
+ continue;
774
+ }
775
+ for (const specifier of (_b = statement.specifiers) !== null && _b !== void 0 ? _b : []) {
776
+ if (specifier.type === 'ImportSpecifier' &&
777
+ (0, imports_1.getImportedName)(specifier) === 'Interactive') {
778
+ return (_c = (_a = specifier.local) === null || _a === void 0 ? void 0 : _a.name) !== null && _c !== void 0 ? _c : 'Interactive';
779
+ }
780
+ }
781
+ }
782
+ const candidates = ['Interactive', 'RemotionInteractive'];
783
+ const localName = candidates.find((candidate) => {
784
+ return !hasTopLevelBinding({ ast, name: candidate });
785
+ });
786
+ if (localName === undefined) {
787
+ throw new Error('Cannot add <Interactive.Svg> because Interactive is already defined');
788
+ }
789
+ return (0, imports_1.ensureNamedImport)({
790
+ ast,
791
+ importedName: 'Interactive',
792
+ sourcePath: 'remotion',
793
+ localName,
794
+ });
795
+ };
735
796
  const getImportDeclarations = ({ ast, sourcePath, }) => {
736
797
  return ast.program.body.filter((node) => node.type === 'ImportDeclaration' &&
737
798
  node.source.type === 'StringLiteral' &&
@@ -785,12 +846,12 @@ const ensureStaticFileImport = (ast) => {
785
846
  label: 'staticFile()',
786
847
  });
787
848
  };
788
- const ensureImgImport = (ast) => {
849
+ const ensureCanvasImageImport = (ast) => {
789
850
  return ensureOfficialNamedImport({
790
851
  ast,
791
- importedName: 'Img',
852
+ importedName: 'CanvasImage',
792
853
  sourcePath: 'remotion',
793
- label: '<Img>',
854
+ label: '<CanvasImage>',
794
855
  });
795
856
  };
796
857
  const ensureAnimatedImageImport = (ast) => {
@@ -1050,7 +1111,7 @@ const addElementToComponentRoot = ({ ast, exportName, element, }) => {
1050
1111
  if (rootNode.type === 'JSXElement' && rootNode.openingElement.selfClosing) {
1051
1112
  const fragment = recast.types.builders.jsxFragment(recast.types.builders.jsxOpeningFragment(), recast.types.builders.jsxClosingFragment(), [
1052
1113
  createSequenceWithChild({
1053
- child: rootNode,
1114
+ child: (0, strip_parenthesized_extra_1.stripParenthesizedExtra)(rootNode),
1054
1115
  sequenceLocalName: ensureSequenceImport(ast),
1055
1116
  }),
1056
1117
  element,
@@ -1280,6 +1341,13 @@ const createInsertableJsxElement = ({ addPositionStyleToComponent, ast, destinat
1280
1341
  position: element.position,
1281
1342
  });
1282
1343
  }
1344
+ if (element.type === 'svg') {
1345
+ return createSvgElement({
1346
+ interactiveLocalName: ensureInteractiveImport(ast),
1347
+ markup: element.markup,
1348
+ position: element.position,
1349
+ });
1350
+ }
1283
1351
  if (element.type === 'composition') {
1284
1352
  return Promise.resolve(ensureCompositionComponentImport({
1285
1353
  ast,
@@ -1302,7 +1370,7 @@ const createInsertableJsxElement = ({ addPositionStyleToComponent, ast, destinat
1302
1370
  const staticFileLocalName = element.srcType === 'remote' ? null : ensureStaticFileImport(ast);
1303
1371
  let localName;
1304
1372
  if (element.assetType === 'image') {
1305
- localName = ensureImgImport(ast);
1373
+ localName = ensureCanvasImageImport(ast);
1306
1374
  }
1307
1375
  else if (element.assetType === 'video') {
1308
1376
  localName = ensureVideoImport(ast);
@@ -0,0 +1,2 @@
1
+ import type { namedTypes } from 'ast-types';
2
+ export declare const svgMarkupToJsx: (markup: string) => Promise<namedTypes.JSXElement>;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.svgMarkupToJsx = void 0;
40
+ const core_1 = require("@svgr/core");
41
+ const plugin_jsx_1 = __importDefault(require("@svgr/plugin-jsx"));
42
+ const recast = __importStar(require("recast"));
43
+ const parse_ast_1 = require("../codemods/parse-ast");
44
+ const svgMarkupToJsx = async (markup) => {
45
+ const componentCode = await (0, core_1.transform)(markup, {
46
+ expandProps: false,
47
+ jsxRuntime: 'automatic',
48
+ plugins: [plugin_jsx_1.default],
49
+ prettier: false,
50
+ typescript: true,
51
+ }, { componentName: 'PastedSvg' });
52
+ const ast = (0, parse_ast_1.parseAst)(componentCode);
53
+ let svgElement = null;
54
+ recast.types.visit(ast, {
55
+ visitJSXElement(path) {
56
+ const { name } = path.node.openingElement;
57
+ if (name.type === 'JSXIdentifier' && name.name === 'svg') {
58
+ svgElement = path.node;
59
+ return false;
60
+ }
61
+ this.traverse(path);
62
+ return undefined;
63
+ },
64
+ });
65
+ if (svgElement === null) {
66
+ throw new Error('The pasted markup does not contain an <svg> root element');
67
+ }
68
+ return svgElement;
69
+ };
70
+ exports.svgMarkupToJsx = svgMarkupToJsx;
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { ApiRoutes, CopyStillToClipboardRequest, getDefaultOutLocation, OpenInFi
2
2
  export type { AggregateRenderProgress, BundlingState, CopyingState, DownloadProgress, HotMiddlewareOptions, JobProgressCallback, ModuleMap, PackageManager, ProjectInfo, RenderingProgressInput, RenderJob, RenderJobWithCleanup, RequiredChromiumOptions, StitchingProgressInput, UiOpenGlOptions, } from '@remotion/studio-shared';
3
3
  import { AnsiDiff } from './ansi-diff';
4
4
  export declare const StudioServerInternals: {
5
- 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, }: {
5
+ startStudio: ({ browserArgs, browserFlag, shouldOpenBrowser, fullEntryPath, logLevel, getCurrentInputProps, getEnvVariables, desiredPort, maxTimelineTracks, remotionRoot, keyboardShortcutsEnabled, relativePublicDir, webpackOverride, poll, getRenderDefaults, getRenderQueue, getNumberOfAudioTags, queueMethods, previewEntry, gitSource, bufferStateDelayInMilliseconds, binariesDirectory, forceIPv4, getAudioLatencyHint, getPreviewSampleRate, enableCrossSiteIsolation, askAIEnabled, interactivityEnabled, forceNew, rspack, getStudioRuntimeConfig, }: {
6
6
  browserArgs: string;
7
7
  browserFlag: string;
8
8
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
@@ -20,9 +20,9 @@ export declare const StudioServerInternals: {
20
20
  poll: number | null;
21
21
  getRenderDefaults: () => import("@remotion/studio-shared").RenderDefaults;
22
22
  getRenderQueue: () => import("@remotion/studio-shared").RenderJob[];
23
- numberOfAudioTags: number;
24
- audioLatencyHint: AudioContextLatencyCategory | null;
25
- previewSampleRate: number | null;
23
+ getNumberOfAudioTags: () => number;
24
+ getAudioLatencyHint: () => AudioContextLatencyCategory | null;
25
+ getPreviewSampleRate: () => number | null;
26
26
  enableCrossSiteIsolation: boolean;
27
27
  queueMethods: import("./preview-server/api-types").QueueMethods;
28
28
  previewEntry: string;
@@ -56,6 +56,7 @@ export declare const StudioServerInternals: {
56
56
  };
57
57
  getMaxTimelineTracks: () => number;
58
58
  setMaxTimelineTracks: (maxTracks: number) => void;
59
+ resetMaxTimelineTracks: () => void;
59
60
  getLatestRemotionVersion: () => Promise<any>;
60
61
  installFileWatcher: (options: {
61
62
  file: string;
package/dist/index.js CHANGED
@@ -26,6 +26,7 @@ exports.StudioServerInternals = {
26
26
  getPackageManager: get_package_manager_1.getPackageManager,
27
27
  getMaxTimelineTracks: max_timeline_tracks_1.getMaxTimelineTracks,
28
28
  setMaxTimelineTracks: max_timeline_tracks_1.setMaxTimelineTracks,
29
+ resetMaxTimelineTracks: max_timeline_tracks_1.resetMaxTimelineTracks,
29
30
  getLatestRemotionVersion: get_latest_remotion_version_1.getLatestRemotionVersion,
30
31
  installFileWatcher: file_watcher_1.installFileWatcher,
31
32
  writeFileAndNotifyFileWatchers: file_watcher_1.writeFileAndNotifyFileWatchers,
@@ -1,2 +1,3 @@
1
1
  export declare const setMaxTimelineTracks: (maxTracks: number) => void;
2
2
  export declare const getMaxTimelineTracks: () => number;
3
+ export declare const resetMaxTimelineTracks: () => void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMaxTimelineTracks = exports.setMaxTimelineTracks = void 0;
3
+ exports.resetMaxTimelineTracks = exports.getMaxTimelineTracks = exports.setMaxTimelineTracks = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
5
  let maxTimelineTracks = studio_shared_1.DEFAULT_TIMELINE_TRACKS;
6
6
  const setMaxTimelineTracks = (maxTracks) => {
@@ -23,3 +23,7 @@ const getMaxTimelineTracks = () => {
23
23
  return maxTimelineTracks;
24
24
  };
25
25
  exports.getMaxTimelineTracks = getMaxTimelineTracks;
26
+ const resetMaxTimelineTracks = () => {
27
+ maxTimelineTracks = studio_shared_1.DEFAULT_TIMELINE_TRACKS;
28
+ };
29
+ exports.resetMaxTimelineTracks = resetMaxTimelineTracks;
@@ -10,6 +10,7 @@ const apply_codemod_1 = require("./routes/apply-codemod");
10
10
  const apply_visual_control_change_1 = require("./routes/apply-visual-control-change");
11
11
  const cancel_render_1 = require("./routes/cancel-render");
12
12
  const composition_component_info_1 = require("./routes/composition-component-info");
13
+ const convert_figma_clipboard_to_svg_1 = require("./routes/convert-figma-clipboard-to-svg");
13
14
  const delete_effect_1 = require("./routes/delete-effect");
14
15
  const delete_jsx_node_1 = require("./routes/delete-jsx-node");
15
16
  const delete_keyframes_1 = require("./routes/delete-keyframes");
@@ -51,6 +52,7 @@ const update_element_install_target_1 = require("./routes/update-element-install
51
52
  const update_sequence_keyframe_settings_1 = require("./routes/update-sequence-keyframe-settings");
52
53
  exports.allApiRoutes = {
53
54
  '/api/composition-component-info': composition_component_info_1.compositionComponentInfoHandler,
55
+ '/api/convert-figma-clipboard-to-svg': convert_figma_clipboard_to_svg_1.convertFigmaClipboardToSvgHandler,
54
56
  '/api/cancel': cancel_render_1.handleCancelRender,
55
57
  '/api/render': add_render_1.handleAddRender,
56
58
  '/api/unsubscribe-from-file-existence': unsubscribe_from_file_existence_1.unsubscribeFromFileExistence,
@@ -7,7 +7,6 @@ exports.getValueContentRangeHeader = getValueContentRangeHeader;
7
7
  exports.middleware = middleware;
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const node_querystring_1 = __importDefault(require("node:querystring"));
10
- const node_url_1 = require("node:url");
11
10
  const renderer_1 = require("@remotion/renderer");
12
11
  const compatible_api_1 = require("./compatible-api");
13
12
  const get_paths_1 = require("./get-paths");
@@ -30,15 +29,18 @@ const mem = (fn, { cache = new Map() } = {}) => {
30
29
  cacheStore.set(memoized, cache);
31
30
  return memoized;
32
31
  };
33
- const memoizedParse = mem(node_url_1.parse);
32
+ const memoizedParse = mem((url) => new URL(url, 'http://localhost'));
34
33
  function getFilenameFromUrl(context, url) {
35
34
  var _a, _b;
36
35
  const paths = (0, get_paths_1.getPaths)(context);
37
36
  let foundFilename;
38
37
  let urlObject;
38
+ if (!url) {
39
+ return;
40
+ }
39
41
  try {
40
42
  // The `url` property of the `request` is contains only `pathname`, `search` and `hash`
41
- urlObject = memoizedParse(url, false, true);
43
+ urlObject = memoizedParse(url);
42
44
  }
43
45
  catch (_c) {
44
46
  return;
@@ -47,7 +49,7 @@ function getFilenameFromUrl(context, url) {
47
49
  let filename;
48
50
  let publicPathObject;
49
51
  try {
50
- publicPathObject = memoizedParse(publicPath !== 'auto' && publicPath ? publicPath : '/', false, true);
52
+ publicPathObject = memoizedParse(publicPath !== 'auto' && publicPath ? publicPath : '/');
51
53
  }
52
54
  catch (_d) {
53
55
  continue;
@@ -0,0 +1,3 @@
1
+ import type { ConvertFigmaClipboardToSvgRequest, ConvertFigmaClipboardToSvgResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const convertFigmaClipboardToSvgHandler: ApiHandler<ConvertFigmaClipboardToSvgRequest, ConvertFigmaClipboardToSvgResponse>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertFigmaClipboardToSvgHandler = void 0;
4
+ const figma_clipboard_1 = require("../../figma/figma-clipboard");
5
+ const convertFigmaClipboardToSvgHandler = ({ input }) => {
6
+ try {
7
+ const { svg } = (0, figma_clipboard_1.convertFigmaClipboardToSvg)(input.html);
8
+ return Promise.resolve({ success: true, svg });
9
+ }
10
+ catch (error) {
11
+ const reason = error instanceof Error ? error.message : String(error);
12
+ return Promise.resolve({
13
+ reason: reason.replace(/^Cannot import Figma selection:\s*/i, ''),
14
+ success: false,
15
+ });
16
+ }
17
+ };
18
+ exports.convertFigmaClipboardToSvgHandler = convertFigmaClipboardToSvgHandler;
@@ -96,6 +96,7 @@ const deleteKeyframes = async ({ sequenceKeyframes, effectKeyframes, clientId, r
96
96
  const result = await (0, update_keyframes_1.updateSequenceKeyframes)({
97
97
  input: output,
98
98
  nodePath: firstSequenceKeyframe.nodePath.nodePath,
99
+ schema: firstSequenceKeyframe.schema,
99
100
  videoConfigValues: firstSequenceKeyframe.nodePath.videoConfigValues,
100
101
  updates: keyframeGroup.map((keyframe) => {
101
102
  var _a;
@@ -131,6 +132,7 @@ const deleteKeyframes = async ({ sequenceKeyframes, effectKeyframes, clientId, r
131
132
  input: output,
132
133
  sequenceNodePath: firstEffectKeyframe.sequenceNodePath.nodePath,
133
134
  effectIndex: firstEffectKeyframe.effectIndex,
135
+ schema: firstEffectKeyframe.schema,
134
136
  videoConfigValues: firstEffectKeyframe.sequenceNodePath.videoConfigValues,
135
137
  updates: keyframeGroup.map((keyframe) => {
136
138
  var _a;
@@ -53,6 +53,12 @@ const validateElement = (element, remotionRoot) => {
53
53
  validateDimension('height', element.height);
54
54
  return;
55
55
  }
56
+ if (element.type === 'svg') {
57
+ if (typeof element.markup !== 'string' || element.markup.trim() === '') {
58
+ throw new Error('SVG markup must be a non-empty string');
59
+ }
60
+ return;
61
+ }
56
62
  if (element.type === 'asset') {
57
63
  if (element.srcType === 'remote') {
58
64
  if (!(0, studio_shared_1.isUrl)(element.src)) {
@@ -111,9 +117,12 @@ const getElementLabel = (element) => {
111
117
  if (element.type === 'solid') {
112
118
  return '<Solid>';
113
119
  }
120
+ if (element.type === 'svg') {
121
+ return '<Interactive.Svg>';
122
+ }
114
123
  if (element.type === 'asset') {
115
124
  if (element.assetType === 'image') {
116
- return '<Img>';
125
+ return '<CanvasImage>';
117
126
  }
118
127
  if (element.assetType === 'video') {
119
128
  return '<Video>';
@@ -31,13 +31,13 @@ export declare const startServer: (options: {
31
31
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
32
32
  getRenderQueue: () => RenderJob[];
33
33
  getRenderDefaults: () => RenderDefaults;
34
- numberOfAudioTags: number;
34
+ getNumberOfAudioTags: () => number;
35
35
  queueMethods: QueueMethods;
36
36
  gitSource: GitSource | null;
37
37
  binariesDirectory: string | null;
38
38
  forceIPv4: boolean;
39
- audioLatencyHint: AudioContextLatencyCategory | null;
40
- previewSampleRate: number | null;
39
+ getAudioLatencyHint: () => AudioContextLatencyCategory | null;
40
+ getPreviewSampleRate: () => number | null;
41
41
  enableCrossSiteIsolation: boolean;
42
42
  askAIEnabled: boolean;
43
43
  interactivityEnabled: boolean;
@@ -97,12 +97,12 @@ const startServer = async (options) => {
97
97
  logLevel: options.logLevel,
98
98
  getRenderQueue: options.getRenderQueue,
99
99
  getRenderDefaults: options.getRenderDefaults,
100
- numberOfAudioTags: options.numberOfAudioTags,
100
+ getNumberOfAudioTags: options.getNumberOfAudioTags,
101
101
  queueMethods: options.queueMethods,
102
102
  gitSource: options.gitSource,
103
103
  binariesDirectory: options.binariesDirectory,
104
- audioLatencyHint: options.audioLatencyHint,
105
- previewSampleRate: options.previewSampleRate,
104
+ getAudioLatencyHint: options.getAudioLatencyHint,
105
+ getPreviewSampleRate: options.getPreviewSampleRate,
106
106
  enableCrossSiteIsolation: options.enableCrossSiteIsolation,
107
107
  getStudioRuntimeConfig: options.getStudioRuntimeConfig,
108
108
  });
package/dist/routes.d.ts CHANGED
@@ -2,7 +2,7 @@ import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import type { GitSource, RenderDefaults, RenderJob, StudioRuntimeConfig } from '@remotion/studio-shared';
3
3
  import type { QueueMethods } from './preview-server/api-types';
4
4
  import type { LiveEventsServer } from './preview-server/live-events';
5
- export declare 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, getStudioRuntimeConfig, }: {
5
+ export declare const handleRoutes: ({ staticHash, staticHashPrefix, outputHash, outputHashPrefix, request, response, liveEventsServer, getCurrentInputProps, getEnvVariables, remotionRoot, entryPoint, publicDir, logLevel, getRenderQueue, getRenderDefaults, getNumberOfAudioTags, queueMethods: methods, gitSource, binariesDirectory, getAudioLatencyHint, getPreviewSampleRate, enableCrossSiteIsolation, getStudioRuntimeConfig, }: {
6
6
  staticHash: string;
7
7
  staticHashPrefix: string;
8
8
  outputHash: string;
@@ -18,12 +18,12 @@ export declare const handleRoutes: ({ staticHash, staticHashPrefix, outputHash,
18
18
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
19
19
  getRenderQueue: () => RenderJob[];
20
20
  getRenderDefaults: () => RenderDefaults;
21
- numberOfAudioTags: number;
21
+ getNumberOfAudioTags: () => number;
22
22
  queueMethods: QueueMethods;
23
23
  gitSource: GitSource | null;
24
24
  binariesDirectory: string | null;
25
- audioLatencyHint: AudioContextLatencyCategory | null;
26
- previewSampleRate: number | null;
25
+ getAudioLatencyHint: () => AudioContextLatencyCategory | null;
26
+ getPreviewSampleRate: () => number | null;
27
27
  enableCrossSiteIsolation: boolean;
28
28
  getStudioRuntimeConfig: () => StudioRuntimeConfig;
29
29
  }) => Promise<void>;
package/dist/routes.js CHANGED
@@ -225,8 +225,8 @@ const handleRequestElementInstall = async ({ liveEventsServer, request, response
225
225
  response.end(JSON.stringify({ success: false, reason: err.message }));
226
226
  }
227
227
  };
228
- const handleFallback = async ({ remotionRoot, hash, response, request, getCurrentInputProps, getEnvVariables, publicDir, getRenderQueue, getRenderDefaults, numberOfAudioTags, audioLatencyHint, previewSampleRate, gitSource, logLevel, enableCrossSiteIsolation, getStudioRuntimeConfig, }) => {
229
- var _a;
228
+ const handleFallback = async ({ remotionRoot, hash, response, request, getCurrentInputProps, getEnvVariables, publicDir, getRenderQueue, getRenderDefaults, getNumberOfAudioTags, getAudioLatencyHint, getPreviewSampleRate, gitSource, logLevel, enableCrossSiteIsolation, getStudioRuntimeConfig, }) => {
229
+ var _a, _b;
230
230
  const acceptsHtml = ((_a = request.headers.accept) !== null && _a !== void 0 ? _a : '').includes('text/html');
231
231
  if (request.method === 'GET' && acceptsHtml) {
232
232
  await (0, watch_ignore_next_change_1.reloadPreviouslySuppressedFiles)();
@@ -272,7 +272,7 @@ const handleFallback = async ({ remotionRoot, hash, response, request, getCurren
272
272
  studioServerCommand: packageManager === 'unknown' ? null : packageManager.startCommand,
273
273
  renderQueue: getRenderQueue(),
274
274
  completedClientRenders: (0, client_render_queue_1.getCompletedClientRenders)(),
275
- numberOfAudioTags,
275
+ numberOfAudioTags: getNumberOfAudioTags(),
276
276
  publicFiles: (0, public_folder_1.getFiles)(),
277
277
  includeFavicon: true,
278
278
  title: 'Remotion Studio',
@@ -289,8 +289,8 @@ const handleFallback = async ({ remotionRoot, hash, response, request, getCurren
289
289
  packageManager: packageManager === 'unknown' ? 'unknown' : packageManager.manager,
290
290
  logLevel,
291
291
  mode: 'dev',
292
- audioLatencyHint: audioLatencyHint !== null && audioLatencyHint !== void 0 ? audioLatencyHint : 'playback',
293
- sampleRate: previewSampleRate,
292
+ audioLatencyHint: (_b = getAudioLatencyHint()) !== null && _b !== void 0 ? _b : 'playback',
293
+ sampleRate: getPreviewSampleRate(),
294
294
  studioRuntimeConfig: getStudioRuntimeConfig(),
295
295
  }));
296
296
  };
@@ -394,7 +394,7 @@ const handleBeep = (_, response) => {
394
394
  readStream.pipe(response);
395
395
  return Promise.resolve();
396
396
  };
397
- 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, getStudioRuntimeConfig, }) => {
397
+ const handleRoutes = ({ staticHash, staticHashPrefix, outputHash, outputHashPrefix, request, response, liveEventsServer, getCurrentInputProps, getEnvVariables, remotionRoot, entryPoint, publicDir, logLevel, getRenderQueue, getRenderDefaults, getNumberOfAudioTags, queueMethods: methods, gitSource, binariesDirectory, getAudioLatencyHint, getPreviewSampleRate, enableCrossSiteIsolation, getStudioRuntimeConfig, }) => {
398
398
  const url = new URL(request.url, 'http://localhost');
399
399
  if (url.pathname === '/api/file-source') {
400
400
  return handleFileSource({
@@ -506,11 +506,11 @@ const handleRoutes = ({ staticHash, staticHashPrefix, outputHash, outputHashPref
506
506
  publicDir,
507
507
  getRenderQueue,
508
508
  getRenderDefaults,
509
- numberOfAudioTags,
509
+ getNumberOfAudioTags,
510
510
  gitSource,
511
511
  logLevel,
512
- audioLatencyHint,
513
- previewSampleRate,
512
+ getAudioLatencyHint,
513
+ getPreviewSampleRate,
514
514
  enableCrossSiteIsolation,
515
515
  getStudioRuntimeConfig,
516
516
  });
@@ -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, 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, getNumberOfAudioTags, queueMethods, previewEntry, gitSource, bufferStateDelayInMilliseconds, binariesDirectory, forceIPv4, getAudioLatencyHint, getPreviewSampleRate, enableCrossSiteIsolation, askAIEnabled, interactivityEnabled, forceNew, rspack, getStudioRuntimeConfig, }: {
10
10
  browserArgs: string;
11
11
  browserFlag: string;
12
12
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
@@ -24,9 +24,9 @@ export declare const startStudio: ({ browserArgs, browserFlag, shouldOpenBrowser
24
24
  poll: number | null;
25
25
  getRenderDefaults: () => RenderDefaults;
26
26
  getRenderQueue: () => RenderJob[];
27
- numberOfAudioTags: number;
28
- audioLatencyHint: AudioContextLatencyCategory | null;
29
- previewSampleRate: number | null;
27
+ getNumberOfAudioTags: () => number;
28
+ getAudioLatencyHint: () => AudioContextLatencyCategory | null;
29
+ getPreviewSampleRate: () => number | null;
30
30
  enableCrossSiteIsolation: boolean;
31
31
  queueMethods: QueueMethods;
32
32
  previewEntry: string;
@@ -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, 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, getNumberOfAudioTags, queueMethods, previewEntry, gitSource, bufferStateDelayInMilliseconds, binariesDirectory, forceIPv4, getAudioLatencyHint, getPreviewSampleRate, enableCrossSiteIsolation, askAIEnabled, interactivityEnabled, forceNew, rspack, getStudioRuntimeConfig, }) => {
23
23
  try {
24
24
  if (typeof Bun === 'undefined') {
25
25
  process.title = 'node (npx remotion studio)';
@@ -82,14 +82,14 @@ const startStudio = async ({ browserArgs, browserFlag, shouldOpenBrowser, fullEn
82
82
  logLevel,
83
83
  getRenderDefaults,
84
84
  getRenderQueue,
85
- numberOfAudioTags,
85
+ getNumberOfAudioTags,
86
86
  queueMethods,
87
87
  gitSource,
88
88
  bufferStateDelayInMilliseconds,
89
89
  binariesDirectory,
90
90
  forceIPv4,
91
- audioLatencyHint,
92
- previewSampleRate,
91
+ getAudioLatencyHint,
92
+ getPreviewSampleRate,
93
93
  enableCrossSiteIsolation,
94
94
  askAIEnabled,
95
95
  interactivityEnabled,
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.494",
6
+ "version": "4.0.496",
7
7
  "description": "Run a Remotion Studio with a server backend",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -25,13 +25,16 @@
25
25
  "dependencies": {
26
26
  "@babel/types": "7.24.0",
27
27
  "@babel/parser": "7.24.1",
28
+ "@svgr/core": "8.1.0",
29
+ "@svgr/plugin-jsx": "8.1.0",
30
+ "kiwi-schema": "0.5.0",
28
31
  "semver": "7.5.3",
29
32
  "prettier": "3.8.1",
30
- "remotion": "4.0.494",
33
+ "remotion": "4.0.496",
31
34
  "recast": "0.23.11",
32
- "@remotion/bundler": "4.0.494",
33
- "@remotion/renderer": "4.0.494",
34
- "@remotion/studio-shared": "4.0.494",
35
+ "@remotion/bundler": "4.0.496",
36
+ "@remotion/renderer": "4.0.496",
37
+ "@remotion/studio-shared": "4.0.496",
35
38
  "memfs": "3.4.3",
36
39
  "open": "8.4.2"
37
40
  },
@@ -39,7 +42,7 @@
39
42
  "ast-types": "0.16.1",
40
43
  "react": "19.2.3",
41
44
  "@types/semver": "7.5.3",
42
- "@remotion/eslint-config-internal": "4.0.494",
45
+ "@remotion/eslint-config-internal": "4.0.496",
43
46
  "eslint": "9.19.0",
44
47
  "@types/node": "20.12.14",
45
48
  "@typescript/native-preview": "7.0.0-dev.20260217.1"