@remotion/studio-server 4.0.494 → 4.0.495
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/codemods/update-keyframes/update-keyframes.js +61 -6
- package/dist/figma/figma-clipboard.d.ts +6 -0
- package/dist/figma/figma-clipboard.js +312 -0
- package/dist/figma/figma-to-svg.d.ts +116 -0
- package/dist/figma/figma-to-svg.js +1300 -0
- package/dist/helpers/resolve-composition-component.js +71 -4
- package/dist/helpers/svg-to-jsx.d.ts +2 -0
- package/dist/helpers/svg-to-jsx.js +70 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.js +1 -0
- package/dist/max-timeline-tracks.d.ts +1 -0
- package/dist/max-timeline-tracks.js +5 -1
- package/dist/preview-server/api-routes.js +2 -0
- package/dist/preview-server/dev-middleware/middleware.js +6 -4
- package/dist/preview-server/routes/convert-figma-clipboard-to-svg.d.ts +3 -0
- package/dist/preview-server/routes/convert-figma-clipboard-to-svg.js +18 -0
- package/dist/preview-server/routes/delete-keyframes.js +2 -0
- package/dist/preview-server/routes/insert-jsx-element.js +10 -1
- package/dist/preview-server/start-server.d.ts +3 -3
- package/dist/preview-server/start-server.js +3 -3
- package/dist/routes.d.ts +4 -4
- package/dist/routes.js +9 -9
- package/dist/start-studio.d.ts +4 -4
- package/dist/start-studio.js +4 -4
- package/package.json +9 -6
|
@@ -46,6 +46,7 @@ const format_file_content_1 = require("../codemods/format-file-content");
|
|
|
46
46
|
const parse_ast_1 = require("../codemods/parse-ast");
|
|
47
47
|
const update_nested_prop_1 = require("../codemods/update-nested-prop");
|
|
48
48
|
const imports_1 = require("./imports");
|
|
49
|
+
const svg_to_jsx_1 = require("./svg-to-jsx");
|
|
49
50
|
const allowedFileExtensions = new Set(['.tsx', '.ts', '.jsx', '.js']);
|
|
50
51
|
const extensionsToProbe = ['.tsx', '.ts', '.jsx', '.js'];
|
|
51
52
|
const isInRemotionRoot = ({ remotionRoot, fileName, }) => {
|
|
@@ -609,6 +610,35 @@ const createAssetElement = ({ addPositionStyle, localName, staticFileLocalName,
|
|
|
609
610
|
: []),
|
|
610
611
|
], true), null, []);
|
|
611
612
|
};
|
|
613
|
+
const createSvgElement = async ({ interactiveLocalName, markup, position, }) => {
|
|
614
|
+
var _a;
|
|
615
|
+
var _b;
|
|
616
|
+
const svgElement = await (0, svg_to_jsx_1.svgMarkupToJsx)(markup);
|
|
617
|
+
const attributes = (_b = svgElement.openingElement.attributes) !== null && _b !== void 0 ? _b : [];
|
|
618
|
+
svgElement.openingElement.attributes = attributes;
|
|
619
|
+
const styleAttribute = attributes.find((attribute) => attribute.type === 'JSXAttribute' &&
|
|
620
|
+
attribute.name.type === 'JSXIdentifier' &&
|
|
621
|
+
attribute.name.name === 'style');
|
|
622
|
+
const positionProperties = getPositionStyleProperties(position);
|
|
623
|
+
if (styleAttribute === undefined) {
|
|
624
|
+
attributes.push(createStyleAttribute(positionProperties));
|
|
625
|
+
}
|
|
626
|
+
else if (styleAttribute.type === 'JSXAttribute' &&
|
|
627
|
+
((_a = styleAttribute.value) === null || _a === void 0 ? void 0 : _a.type) === 'JSXExpressionContainer' &&
|
|
628
|
+
styleAttribute.value.expression.type === 'ObjectExpression') {
|
|
629
|
+
styleAttribute.value.expression.properties.push(...positionProperties);
|
|
630
|
+
}
|
|
631
|
+
else {
|
|
632
|
+
throw new Error('Could not convert the root SVG style to JSX');
|
|
633
|
+
}
|
|
634
|
+
const interactiveSvgName = () => recast.types.builders.jsxMemberExpression(recast.types.builders.jsxIdentifier(interactiveLocalName), recast.types.builders.jsxIdentifier('Svg'));
|
|
635
|
+
svgElement.openingElement.name = interactiveSvgName();
|
|
636
|
+
if (svgElement.closingElement !== null &&
|
|
637
|
+
svgElement.closingElement !== undefined) {
|
|
638
|
+
svgElement.closingElement.name = interactiveSvgName();
|
|
639
|
+
}
|
|
640
|
+
return svgElement;
|
|
641
|
+
};
|
|
612
642
|
const createFragmentWithElement = (element) => {
|
|
613
643
|
return recast.types.builders.jsxFragment(recast.types.builders.jsxOpeningFragment(), recast.types.builders.jsxClosingFragment(), [element]);
|
|
614
644
|
};
|
|
@@ -732,6 +762,36 @@ const ensureSequenceImport = (ast) => {
|
|
|
732
762
|
localName: getAvailableSequenceLocalName(ast),
|
|
733
763
|
});
|
|
734
764
|
};
|
|
765
|
+
const ensureInteractiveImport = (ast) => {
|
|
766
|
+
var _a;
|
|
767
|
+
var _b, _c;
|
|
768
|
+
for (const statement of ast.program.body) {
|
|
769
|
+
if (statement.type !== 'ImportDeclaration' ||
|
|
770
|
+
statement.source.type !== 'StringLiteral' ||
|
|
771
|
+
statement.source.value !== 'remotion') {
|
|
772
|
+
continue;
|
|
773
|
+
}
|
|
774
|
+
for (const specifier of (_b = statement.specifiers) !== null && _b !== void 0 ? _b : []) {
|
|
775
|
+
if (specifier.type === 'ImportSpecifier' &&
|
|
776
|
+
(0, imports_1.getImportedName)(specifier) === 'Interactive') {
|
|
777
|
+
return (_c = (_a = specifier.local) === null || _a === void 0 ? void 0 : _a.name) !== null && _c !== void 0 ? _c : 'Interactive';
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
const candidates = ['Interactive', 'RemotionInteractive'];
|
|
782
|
+
const localName = candidates.find((candidate) => {
|
|
783
|
+
return !hasTopLevelBinding({ ast, name: candidate });
|
|
784
|
+
});
|
|
785
|
+
if (localName === undefined) {
|
|
786
|
+
throw new Error('Cannot add <Interactive.Svg> because Interactive is already defined');
|
|
787
|
+
}
|
|
788
|
+
return (0, imports_1.ensureNamedImport)({
|
|
789
|
+
ast,
|
|
790
|
+
importedName: 'Interactive',
|
|
791
|
+
sourcePath: 'remotion',
|
|
792
|
+
localName,
|
|
793
|
+
});
|
|
794
|
+
};
|
|
735
795
|
const getImportDeclarations = ({ ast, sourcePath, }) => {
|
|
736
796
|
return ast.program.body.filter((node) => node.type === 'ImportDeclaration' &&
|
|
737
797
|
node.source.type === 'StringLiteral' &&
|
|
@@ -785,12 +845,12 @@ const ensureStaticFileImport = (ast) => {
|
|
|
785
845
|
label: 'staticFile()',
|
|
786
846
|
});
|
|
787
847
|
};
|
|
788
|
-
const
|
|
848
|
+
const ensureCanvasImageImport = (ast) => {
|
|
789
849
|
return ensureOfficialNamedImport({
|
|
790
850
|
ast,
|
|
791
|
-
importedName: '
|
|
851
|
+
importedName: 'CanvasImage',
|
|
792
852
|
sourcePath: 'remotion',
|
|
793
|
-
label: '<
|
|
853
|
+
label: '<CanvasImage>',
|
|
794
854
|
});
|
|
795
855
|
};
|
|
796
856
|
const ensureAnimatedImageImport = (ast) => {
|
|
@@ -1280,6 +1340,13 @@ const createInsertableJsxElement = ({ addPositionStyleToComponent, ast, destinat
|
|
|
1280
1340
|
position: element.position,
|
|
1281
1341
|
});
|
|
1282
1342
|
}
|
|
1343
|
+
if (element.type === 'svg') {
|
|
1344
|
+
return createSvgElement({
|
|
1345
|
+
interactiveLocalName: ensureInteractiveImport(ast),
|
|
1346
|
+
markup: element.markup,
|
|
1347
|
+
position: element.position,
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1283
1350
|
if (element.type === 'composition') {
|
|
1284
1351
|
return Promise.resolve(ensureCompositionComponentImport({
|
|
1285
1352
|
ast,
|
|
@@ -1302,7 +1369,7 @@ const createInsertableJsxElement = ({ addPositionStyleToComponent, ast, destinat
|
|
|
1302
1369
|
const staticFileLocalName = element.srcType === 'remote' ? null : ensureStaticFileImport(ast);
|
|
1303
1370
|
let localName;
|
|
1304
1371
|
if (element.assetType === 'image') {
|
|
1305
|
-
localName =
|
|
1372
|
+
localName = ensureCanvasImageImport(ast);
|
|
1306
1373
|
}
|
|
1307
1374
|
else if (element.assetType === 'video') {
|
|
1308
1375
|
localName = ensureVideoImport(ast);
|
|
@@ -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,
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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,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(
|
|
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
|
|
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 : '/'
|
|
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 '<
|
|
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
|
-
|
|
34
|
+
getNumberOfAudioTags: () => number;
|
|
35
35
|
queueMethods: QueueMethods;
|
|
36
36
|
gitSource: GitSource | null;
|
|
37
37
|
binariesDirectory: string | null;
|
|
38
38
|
forceIPv4: boolean;
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
100
|
+
getNumberOfAudioTags: options.getNumberOfAudioTags,
|
|
101
101
|
queueMethods: options.queueMethods,
|
|
102
102
|
gitSource: options.gitSource,
|
|
103
103
|
binariesDirectory: options.binariesDirectory,
|
|
104
|
-
|
|
105
|
-
|
|
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,
|
|
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
|
-
|
|
21
|
+
getNumberOfAudioTags: () => number;
|
|
22
22
|
queueMethods: QueueMethods;
|
|
23
23
|
gitSource: GitSource | null;
|
|
24
24
|
binariesDirectory: string | null;
|
|
25
|
-
|
|
26
|
-
|
|
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,
|
|
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:
|
|
293
|
-
sampleRate:
|
|
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,
|
|
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
|
-
|
|
509
|
+
getNumberOfAudioTags,
|
|
510
510
|
gitSource,
|
|
511
511
|
logLevel,
|
|
512
|
-
|
|
513
|
-
|
|
512
|
+
getAudioLatencyHint,
|
|
513
|
+
getPreviewSampleRate,
|
|
514
514
|
enableCrossSiteIsolation,
|
|
515
515
|
getStudioRuntimeConfig,
|
|
516
516
|
});
|
package/dist/start-studio.d.ts
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
getNumberOfAudioTags: () => number;
|
|
28
|
+
getAudioLatencyHint: () => AudioContextLatencyCategory | null;
|
|
29
|
+
getPreviewSampleRate: () => number | null;
|
|
30
30
|
enableCrossSiteIsolation: boolean;
|
|
31
31
|
queueMethods: QueueMethods;
|
|
32
32
|
previewEntry: string;
|
package/dist/start-studio.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
85
|
+
getNumberOfAudioTags,
|
|
86
86
|
queueMethods,
|
|
87
87
|
gitSource,
|
|
88
88
|
bufferStateDelayInMilliseconds,
|
|
89
89
|
binariesDirectory,
|
|
90
90
|
forceIPv4,
|
|
91
|
-
|
|
92
|
-
|
|
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.
|
|
6
|
+
"version": "4.0.495",
|
|
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.
|
|
33
|
+
"remotion": "4.0.495",
|
|
31
34
|
"recast": "0.23.11",
|
|
32
|
-
"@remotion/bundler": "4.0.
|
|
33
|
-
"@remotion/renderer": "4.0.
|
|
34
|
-
"@remotion/studio-shared": "4.0.
|
|
35
|
+
"@remotion/bundler": "4.0.495",
|
|
36
|
+
"@remotion/renderer": "4.0.495",
|
|
37
|
+
"@remotion/studio-shared": "4.0.495",
|
|
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.
|
|
45
|
+
"@remotion/eslint-config-internal": "4.0.495",
|
|
43
46
|
"eslint": "9.19.0",
|
|
44
47
|
"@types/node": "20.12.14",
|
|
45
48
|
"@typescript/native-preview": "7.0.0-dev.20260217.1"
|