@remotion/studio-server 4.0.537 → 4.0.539
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/ansi-diff.js +3 -19
- package/dist/better-opn/index.d.ts +4 -2
- package/dist/canvas-capture/generate-canvas-capture-composition.d.ts +14 -0
- package/dist/canvas-capture/generate-canvas-capture-composition.js +239 -0
- package/dist/codemods/add-effect.d.ts +1 -0
- package/dist/codemods/add-effect.js +8 -0
- package/dist/codemods/apply-codemod-to-file.d.ts +7 -0
- package/dist/codemods/apply-codemod-to-file.js +171 -0
- package/dist/codemods/apply-visual-control.d.ts +8 -0
- package/dist/codemods/apply-visual-control.js +89 -0
- package/dist/codemods/delete-effect.d.ts +1 -0
- package/dist/codemods/delete-effect.js +6 -0
- package/dist/codemods/delete-jsx-node.d.ts +22 -0
- package/dist/codemods/delete-jsx-node.js +17 -0
- package/dist/codemods/delete-jsx-nodes.d.ts +13 -0
- package/dist/codemods/delete-jsx-nodes.js +10 -0
- package/dist/codemods/duplicate-composition.d.ts +2 -0
- package/dist/codemods/duplicate-composition.js +64 -0
- package/dist/codemods/duplicate-effect.d.ts +1 -0
- package/dist/codemods/duplicate-effect.js +6 -0
- package/dist/codemods/duplicate-jsx-node.d.ts +25 -0
- package/dist/codemods/duplicate-jsx-node.js +26 -0
- package/dist/codemods/effect-param-expression.d.ts +2 -2
- package/dist/codemods/format-file-content.d.ts +7 -0
- package/dist/codemods/format-file-content.js +80 -0
- package/dist/codemods/format-inline-content.d.ts +18 -0
- package/dist/codemods/format-inline-content.js +78 -0
- package/dist/codemods/get-node-path-remappings.d.ts +1 -12
- package/dist/codemods/get-node-path-remappings.js +1 -51
- package/dist/codemods/insert-video-layers.d.ts +11 -0
- package/dist/codemods/insert-video-layers.js +5 -0
- package/dist/codemods/paste-effects.d.ts +2 -15
- package/dist/codemods/recast-mods.d.ts +13 -0
- package/dist/codemods/recast-mods.js +902 -0
- package/dist/codemods/reorder-effect.d.ts +1 -0
- package/dist/codemods/reorder-effect.js +5 -0
- package/dist/codemods/reorder-sequence.d.ts +1 -0
- package/dist/codemods/reorder-sequence.js +5 -0
- package/dist/codemods/simple-diff.d.ts +5 -0
- package/dist/codemods/simple-diff.js +39 -0
- package/dist/codemods/split-jsx-sequence.d.ts +27 -0
- package/dist/codemods/split-jsx-sequence.js +19 -0
- package/dist/codemods/split-video-from-audio.d.ts +1 -0
- package/dist/codemods/split-video-from-audio.js +5 -0
- package/dist/codemods/update-default-props.d.ts +1 -0
- package/dist/codemods/update-default-props.js +6 -0
- package/dist/codemods/update-effect-props/update-effect-props.d.ts +2 -2
- package/dist/codemods/update-inline-caption-patches.d.ts +1 -0
- package/dist/codemods/update-inline-caption-patches.js +5 -0
- package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.d.ts +1 -0
- package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.js +7 -0
- package/dist/codemods/update-keyframes/update-keyframes.d.ts +3 -3
- package/dist/codemods/update-nested-prop.d.ts +1 -1
- package/dist/detect-outdated-remotion-skills.d.ts +3 -3
- package/dist/figma/figma-to-svg.d.ts +1 -1
- package/dist/file-watcher.d.ts +1 -1
- package/dist/helpers/coding-agent-registry.d.ts +3 -3
- package/dist/helpers/css-shorthand-properties.d.ts +8 -7
- package/dist/helpers/custom-editor.d.ts +2 -2
- package/dist/helpers/editor-registry.d.ts +2 -2
- package/dist/helpers/get-ast-node-path.d.ts +2 -1
- package/dist/helpers/import-agnostic-node-path.js +22 -13
- package/dist/helpers/open-in-app.d.ts +3 -3
- package/dist/helpers/open-in-editor.d.ts +2 -2
- package/dist/helpers/package-manager-spawn-options.d.ts +1 -1
- package/dist/helpers/read-source-file.d.ts +4 -0
- package/dist/helpers/read-source-file.js +14 -0
- package/dist/helpers/recently-used-apps.d.ts +2 -2
- package/dist/helpers/resolve-composition-component.d.ts +2 -2
- package/dist/helpers/resolve-editor.d.ts +3 -3
- package/dist/helpers/terminal-artwork.d.ts +4 -4
- package/dist/helpers/video-config-values.d.ts +4 -0
- package/dist/helpers/video-config-values.js +11 -3
- package/dist/index.d.ts +39 -100
- package/dist/index.js +1 -1
- package/dist/maybe-open-browser.d.ts +2 -1
- package/dist/open-browser-shortcut.d.ts +9 -0
- package/dist/open-browser-shortcut.js +121 -0
- package/dist/preview-server/api-types.d.ts +1 -1
- package/dist/preview-server/dev-middleware/index.d.ts +2 -1
- package/dist/preview-server/dev-middleware/middleware.d.ts +1 -1
- package/dist/preview-server/dev-middleware/middleware.js +14 -17
- package/dist/preview-server/element-install-state.d.ts +1 -1
- package/dist/preview-server/get-package-manager.d.ts +3 -2
- package/dist/preview-server/handler.d.ts +4 -4
- package/dist/preview-server/hmr-timing.d.ts +2 -1
- package/dist/preview-server/hot-middleware/index.d.ts +2 -1
- package/dist/preview-server/hot-middleware/types.d.ts +2 -0
- package/dist/preview-server/hot-middleware/types.js +2 -0
- package/dist/preview-server/jsx-component-identity.d.ts +4 -3
- package/dist/preview-server/live-events.d.ts +3 -2
- package/dist/preview-server/public-folder.js +11 -2
- package/dist/preview-server/routes/add-keyframes.d.ts +2 -1
- package/dist/preview-server/routes/app-icon.d.ts +1 -1
- package/dist/preview-server/routes/apply-codemod.d.ts +4 -0
- package/dist/preview-server/routes/apply-codemod.js +272 -0
- package/dist/preview-server/routes/apply-visual-control-change.js +1 -4
- package/dist/preview-server/routes/batch-update-keyframe-settings.d.ts +2 -1
- package/dist/preview-server/routes/can-update-default-props.d.ts +2 -1
- package/dist/preview-server/routes/can-update-effect-props.d.ts +2 -6
- package/dist/preview-server/routes/can-update-sequence-props.d.ts +17 -13
- package/dist/preview-server/routes/can-update-sequence-props.js +21 -25
- package/dist/preview-server/routes/delete-jsx-node.d.ts +3 -0
- package/dist/preview-server/routes/delete-jsx-node.js +126 -0
- package/dist/preview-server/routes/delete-jsx-nodes.d.ts +3 -0
- package/dist/preview-server/routes/delete-jsx-nodes.js +137 -0
- package/dist/preview-server/routes/delete-keyframes.d.ts +4 -6
- package/dist/preview-server/routes/delete-keyframes.js +4 -66
- package/dist/preview-server/routes/duplicate-jsx-node.d.ts +3 -0
- package/dist/preview-server/routes/duplicate-jsx-node.js +118 -0
- package/dist/preview-server/routes/element-install-plan.d.ts +3 -3
- package/dist/preview-server/routes/find-in-file.d.ts +2 -9
- package/dist/preview-server/routes/insert-element.js +1 -4
- package/dist/preview-server/routes/insert-jsx-element.d.ts +3 -0
- package/dist/preview-server/routes/insert-jsx-element.js +231 -0
- package/dist/preview-server/routes/insert-video-layers.d.ts +3 -0
- package/dist/preview-server/routes/insert-video-layers.js +68 -0
- package/dist/preview-server/routes/install-dependency.d.ts +2 -14
- package/dist/preview-server/routes/log-updates/log-effect-update.d.ts +2 -1
- package/dist/preview-server/routes/log-updates/log-update.d.ts +3 -2
- package/dist/preview-server/routes/move-keyframes.d.ts +2 -1
- package/dist/preview-server/routes/open-in-editor.d.ts +2 -2
- package/dist/preview-server/routes/remotion-skills-info.d.ts +1 -1
- package/dist/preview-server/routes/save-multiple-effect-props.js +25 -8
- package/dist/preview-server/routes/save-sequence-props.d.ts +2 -2
- package/dist/preview-server/routes/source-file-write-queue.d.ts +3 -2
- package/dist/preview-server/routes/split-jsx-sequence.d.ts +3 -0
- package/dist/preview-server/routes/split-jsx-sequence.js +117 -0
- package/dist/preview-server/routes/subscribe-to-sequence-props.js +55 -34
- package/dist/preview-server/routes/update-public-license.d.ts +11 -0
- package/dist/preview-server/routes/update-public-license.js +97 -0
- package/dist/preview-server/routes/wrap-jsx-node.d.ts +3 -0
- package/dist/preview-server/routes/wrap-jsx-node.js +97 -0
- package/dist/preview-server/sequence-node-path-mutation.d.ts +2 -6
- package/dist/preview-server/sequence-props-watchers.d.ts +7 -5
- package/dist/preview-server/sequence-props-watchers.js +7 -2
- package/dist/preview-server/serve-static.d.ts +1 -1
- package/dist/preview-server/serve-static.js +18 -1
- package/dist/preview-server/start-server.d.ts +3 -3
- package/dist/preview-server/studio-protocol/handle-discovery.d.ts +1 -1
- package/dist/preview-server/studio-protocol/handle-element-library.d.ts +1 -1
- package/dist/preview-server/studio-protocol/handle-install.d.ts +1 -1
- package/dist/preview-server/studio-protocol/handle-license-key.d.ts +1 -1
- package/dist/preview-server/studio-protocol/origin-policy.d.ts +2 -2
- package/dist/preview-server/studio-protocol/protocol-response.d.ts +1 -1
- package/dist/preview-server/undo-stack.d.ts +3 -3
- package/dist/preview-server/undo-stack.js +9 -0
- package/dist/preview-server/update-available.d.ts +3 -2
- package/dist/preview-server/validate-same-origin.js +2 -1
- package/dist/remotion-skill-names.d.ts +1 -1
- package/dist/routes.d.ts +4 -4
- package/dist/server-ready.d.ts +2 -1
- package/dist/start-studio.d.ts +3 -3
- package/dist/studio-shortcuts.d.ts +3 -3
- package/package.json +10 -10
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.duplicateJsxNodeHandler = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const codemods_1 = require("@remotion/codemods");
|
|
6
|
+
const renderer_1 = require("@remotion/renderer");
|
|
7
|
+
const file_watcher_1 = require("../../file-watcher");
|
|
8
|
+
const resolve_file_inside_project_1 = require("../../helpers/resolve-file-inside-project");
|
|
9
|
+
const format_log_file_location_1 = require("../format-log-file-location");
|
|
10
|
+
const sequence_node_path_mutation_1 = require("../sequence-node-path-mutation");
|
|
11
|
+
const undo_stack_1 = require("../undo-stack");
|
|
12
|
+
const source_file_write_queue_1 = require("./source-file-write-queue");
|
|
13
|
+
const duplicateJsxNodeHandler = ({ input: { nodes }, remotionRoot, logLevel }) => {
|
|
14
|
+
return (0, source_file_write_queue_1.withSourceFileWriteQueue)(async () => {
|
|
15
|
+
var _a;
|
|
16
|
+
try {
|
|
17
|
+
if (nodes.length === 0) {
|
|
18
|
+
throw new Error('No JSX nodes were specified for duplication');
|
|
19
|
+
}
|
|
20
|
+
renderer_1.RenderInternals.Log.trace({ indent: false, logLevel }, `[duplicate-jsx-node] Received request to duplicate ${nodes.length} JSX node${nodes.length === 1 ? '' : 's'}`);
|
|
21
|
+
const itemsByFileName = new Map();
|
|
22
|
+
for (const item of nodes) {
|
|
23
|
+
const fileItems = (_a = itemsByFileName.get(item.fileName)) !== null && _a !== void 0 ? _a : [];
|
|
24
|
+
fileItems.push(item);
|
|
25
|
+
itemsByFileName.set(item.fileName, fileItems);
|
|
26
|
+
}
|
|
27
|
+
const updates = await Promise.all([...itemsByFileName.entries()].map(async ([fileName, fileItems]) => {
|
|
28
|
+
var _a;
|
|
29
|
+
var _b;
|
|
30
|
+
const { absolutePath, fileRelativeToRoot } = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
|
|
31
|
+
remotionRoot,
|
|
32
|
+
fileName,
|
|
33
|
+
action: 'modify',
|
|
34
|
+
});
|
|
35
|
+
const fileContents = (0, node_fs_1.readFileSync)(absolutePath, 'utf-8');
|
|
36
|
+
const result = await (0, codemods_1.duplicateJsxNodes)({
|
|
37
|
+
project: {
|
|
38
|
+
files: { [absolutePath]: fileContents },
|
|
39
|
+
rootDir: remotionRoot,
|
|
40
|
+
},
|
|
41
|
+
nodes: fileItems.map((item) => ({
|
|
42
|
+
filePath: absolutePath,
|
|
43
|
+
nodePath: item.nodePath,
|
|
44
|
+
})),
|
|
45
|
+
});
|
|
46
|
+
const output = (_b = (_a = result.changes[0]) === null || _a === void 0 ? void 0 : _a.nextContents) !== null && _b !== void 0 ? _b : fileContents;
|
|
47
|
+
const { nodeLabels, logLines } = result.editDetails[0];
|
|
48
|
+
const nodePathRemappings = result.nodePathRemappings.map(({ oldNodePath, newNodePath }) => ({ oldNodePath, newNodePath }));
|
|
49
|
+
return {
|
|
50
|
+
absolutePath,
|
|
51
|
+
fileRelativeToRoot,
|
|
52
|
+
fileContents,
|
|
53
|
+
logLine: Math.min(...logLines),
|
|
54
|
+
nodeLabels,
|
|
55
|
+
nodePathRemappings,
|
|
56
|
+
output,
|
|
57
|
+
};
|
|
58
|
+
}));
|
|
59
|
+
const nodePathMutation = (0, sequence_node_path_mutation_1.broadcastSequenceNodePathMutation)(updates.map((update) => ({
|
|
60
|
+
absolutePath: update.absolutePath,
|
|
61
|
+
remappings: update.nodePathRemappings,
|
|
62
|
+
})), null);
|
|
63
|
+
const duplicatedNodeDescription = nodes.length === 1
|
|
64
|
+
? updates[0].nodeLabels[0]
|
|
65
|
+
: `${nodes.length} JSX nodes`;
|
|
66
|
+
(0, undo_stack_1.pushTransactionToUndoStack)({
|
|
67
|
+
snapshots: updates.map((update) => ({
|
|
68
|
+
filePath: update.absolutePath,
|
|
69
|
+
oldContents: update.fileContents,
|
|
70
|
+
newContents: null,
|
|
71
|
+
logLine: update.logLine,
|
|
72
|
+
nodePathRemappings: update.nodePathRemappings,
|
|
73
|
+
})),
|
|
74
|
+
logLevel,
|
|
75
|
+
remotionRoot,
|
|
76
|
+
description: {
|
|
77
|
+
undoMessage: `↩️ Duplication of ${duplicatedNodeDescription}`,
|
|
78
|
+
redoMessage: `↪️ Duplication of ${duplicatedNodeDescription}`,
|
|
79
|
+
},
|
|
80
|
+
entryType: 'duplicate-jsx-node',
|
|
81
|
+
suppressHmrOnFileRestore: false,
|
|
82
|
+
undoRedoNavigation: null,
|
|
83
|
+
});
|
|
84
|
+
for (const update of updates) {
|
|
85
|
+
(0, undo_stack_1.suppressUndoStackInvalidation)(update.absolutePath);
|
|
86
|
+
(0, file_watcher_1.writeFileAndNotifyFileWatchers)({
|
|
87
|
+
file: update.absolutePath,
|
|
88
|
+
content: update.output,
|
|
89
|
+
originatorClientId: undefined,
|
|
90
|
+
metadata: { skipSequencePropsUpdate: true },
|
|
91
|
+
});
|
|
92
|
+
const locationLabel = (0, format_log_file_location_1.formatLogFileLocation)({
|
|
93
|
+
remotionRoot,
|
|
94
|
+
absolutePath: update.absolutePath,
|
|
95
|
+
line: update.logLine,
|
|
96
|
+
});
|
|
97
|
+
const fileDescription = update.nodeLabels.length === 1
|
|
98
|
+
? update.nodeLabels[0]
|
|
99
|
+
: `${update.nodeLabels.length} JSX nodes`;
|
|
100
|
+
renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `${(0, source_file_write_queue_1.getCodemodTimingPrefix)(logLevel)}${renderer_1.RenderInternals.chalk.blueBright(`${locationLabel}`)} Duplicated ${fileDescription}`);
|
|
101
|
+
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel }, `[duplicate-jsx-node] Wrote ${update.fileRelativeToRoot}`);
|
|
102
|
+
}
|
|
103
|
+
(0, undo_stack_1.printUndoHint)(logLevel);
|
|
104
|
+
return {
|
|
105
|
+
success: true,
|
|
106
|
+
nodePathMutation,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
return {
|
|
111
|
+
success: false,
|
|
112
|
+
reason: err.message,
|
|
113
|
+
stack: err.stack,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
exports.duplicateJsxNodeHandler = duplicateJsxNodeHandler;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { ElementInstallExpectedFileState, PrepareElementInstallRequest } from '@remotion/studio-shared';
|
|
1
|
+
import type { ElementInstallExpectedFileState, InsertElementRequest, PrepareElementInstallRequest } from '@remotion/studio-shared';
|
|
2
2
|
export declare const getElementSourceHash: (source: string) => string;
|
|
3
|
-
export declare const validateElementInstallPosition: (position:
|
|
4
|
-
export declare const validateElementForInstallation: (element:
|
|
3
|
+
export declare const validateElementInstallPosition: (position: InsertElementRequest['position']) => void;
|
|
4
|
+
export declare const validateElementForInstallation: (element: InsertElementRequest['element']) => void;
|
|
5
5
|
export declare const makeRelativeElementImportPath: ({ fromFile, toFile, }: {
|
|
6
6
|
fromFile: string;
|
|
7
7
|
toFile: string;
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
+
import { CodemodsInternals } from '@remotion/codemods';
|
|
1
2
|
import type { FindInFileRequest, FindInFileResponse } from '@remotion/studio-shared';
|
|
2
3
|
import type { ApiHandler } from '../api-types';
|
|
3
|
-
export declare const
|
|
4
|
-
contents: string;
|
|
5
|
-
lineNumber: number;
|
|
6
|
-
columnNumber: number;
|
|
7
|
-
search: string;
|
|
8
|
-
}) => {
|
|
9
|
-
lineNumber: number;
|
|
10
|
-
columnNumber: number;
|
|
11
|
-
};
|
|
4
|
+
export declare const { findSearchPosition }: typeof CodemodsInternals;
|
|
12
5
|
export declare const findInFileHandler: ApiHandler<FindInFileRequest, FindInFileResponse>;
|
|
@@ -79,10 +79,7 @@ const insertElementHandler = async ({ input: { compositionFile, compositionId, c
|
|
|
79
79
|
const componentOwnsSequence = installationMode === 'component-owned-sequence';
|
|
80
80
|
if (componentOwnsSequence &&
|
|
81
81
|
element.initialProps !== null &&
|
|
82
|
-
['from', 'durationInFrames', 'name'].some((prop) => {
|
|
83
|
-
var _a;
|
|
84
|
-
return Object.hasOwn((_a = element.initialProps) !== null && _a !== void 0 ? _a : {}, prop);
|
|
85
|
-
})) {
|
|
82
|
+
['from', 'durationInFrames', 'name'].some((prop) => { var _a; return Object.hasOwn((_a = element.initialProps) !== null && _a !== void 0 ? _a : {}, prop); })) {
|
|
86
83
|
throw new Error('Component-owned Element initial props must not override from, durationInFrames, or name');
|
|
87
84
|
}
|
|
88
85
|
if (componentOwnsSequence &&
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.insertJsxElementHandler = void 0;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const renderer_1 = require("@remotion/renderer");
|
|
9
|
+
const studio_protocol_1 = require("@remotion/studio-protocol");
|
|
10
|
+
const studio_shared_1 = require("@remotion/studio-shared");
|
|
11
|
+
const file_watcher_1 = require("../../file-watcher");
|
|
12
|
+
const resolve_composition_component_1 = require("../../helpers/resolve-composition-component");
|
|
13
|
+
const format_log_file_location_1 = require("../format-log-file-location");
|
|
14
|
+
const sequence_node_path_mutation_1 = require("../sequence-node-path-mutation");
|
|
15
|
+
const undo_stack_1 = require("../undo-stack");
|
|
16
|
+
const source_file_write_queue_1 = require("./source-file-write-queue");
|
|
17
|
+
const validateDimension = (name, value) => {
|
|
18
|
+
if (!Number.isFinite(value) || value < 1) {
|
|
19
|
+
throw new Error(`${name} must be a positive number`);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const validatePosition = (position) => {
|
|
23
|
+
if (position === null) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (!Number.isFinite(position.x) || !Number.isFinite(position.y)) {
|
|
27
|
+
throw new Error('Position must be finite');
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const isInsideRemotionRoot = ({ fileName, remotionRoot, }) => {
|
|
31
|
+
const relativePath = node_path_1.default.relative(remotionRoot, fileName);
|
|
32
|
+
return !relativePath.startsWith('..') && !node_path_1.default.isAbsolute(relativePath);
|
|
33
|
+
};
|
|
34
|
+
const hasParentDirectorySegment = (fileName) => {
|
|
35
|
+
return fileName.split('/').includes('..');
|
|
36
|
+
};
|
|
37
|
+
const validateCompositionFile = ({ compositionFile, remotionRoot, }) => {
|
|
38
|
+
if (!compositionFile ||
|
|
39
|
+
compositionFile.includes('\0') ||
|
|
40
|
+
compositionFile.includes('\\') ||
|
|
41
|
+
compositionFile.startsWith('/') ||
|
|
42
|
+
hasParentDirectorySegment(compositionFile)) {
|
|
43
|
+
throw new Error('Unsupported composition file');
|
|
44
|
+
}
|
|
45
|
+
const resolved = node_path_1.default.resolve(remotionRoot, compositionFile);
|
|
46
|
+
if (!isInsideRemotionRoot({ fileName: resolved, remotionRoot })) {
|
|
47
|
+
throw new Error('Unsupported composition file');
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const validateElement = (element, remotionRoot) => {
|
|
51
|
+
validatePosition(element.position);
|
|
52
|
+
if (element.type === 'solid') {
|
|
53
|
+
validateDimension('width', element.width);
|
|
54
|
+
validateDimension('height', element.height);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (element.type === 'svg') {
|
|
58
|
+
if (typeof element.markup !== 'string' || element.markup.trim() === '') {
|
|
59
|
+
throw new Error('SVG markup must be a non-empty string');
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (element.type === 'asset') {
|
|
64
|
+
if (element.srcType === 'remote') {
|
|
65
|
+
if (!(0, studio_shared_1.isUrl)(element.src)) {
|
|
66
|
+
throw new Error('Remote asset source must be a URL');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (!element.src || element.src.includes('\\')) {
|
|
70
|
+
throw new Error('Asset path must be a static file path');
|
|
71
|
+
}
|
|
72
|
+
if (element.dimensions) {
|
|
73
|
+
validateDimension('width', element.dimensions.width);
|
|
74
|
+
validateDimension('height', element.dimensions.height);
|
|
75
|
+
}
|
|
76
|
+
if (element.durationInFrames !== null) {
|
|
77
|
+
validateDimension('durationInFrames', element.durationInFrames);
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (element.type === 'component') {
|
|
82
|
+
if (!studio_protocol_1.StudioProtocolInternals.isComponentIdentifier(element.componentName)) {
|
|
83
|
+
throw new Error('Unsupported component name');
|
|
84
|
+
}
|
|
85
|
+
if (!studio_protocol_1.StudioProtocolInternals.isComponentIdentifier(element.importName)) {
|
|
86
|
+
throw new Error('Unsupported component import name');
|
|
87
|
+
}
|
|
88
|
+
if (!studio_protocol_1.StudioProtocolInternals.isComponentImportPath(element.importPath)) {
|
|
89
|
+
throw new Error('Unsupported component import path');
|
|
90
|
+
}
|
|
91
|
+
if (!studio_protocol_1.StudioProtocolInternals.areComponentProps(element.props)) {
|
|
92
|
+
throw new Error('Unsupported component props');
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (element.type === 'composition') {
|
|
97
|
+
if (typeof element.compositionId !== 'string' || !element.compositionId) {
|
|
98
|
+
throw new Error('Unsupported composition ID');
|
|
99
|
+
}
|
|
100
|
+
if (typeof element.compositionFile !== 'string') {
|
|
101
|
+
throw new Error('Unsupported composition file');
|
|
102
|
+
}
|
|
103
|
+
validateCompositionFile({
|
|
104
|
+
compositionFile: element.compositionFile,
|
|
105
|
+
remotionRoot,
|
|
106
|
+
});
|
|
107
|
+
validateDimension('width', element.width);
|
|
108
|
+
validateDimension('height', element.height);
|
|
109
|
+
validateDimension('durationInFrames', element.durationInFrames);
|
|
110
|
+
const parsedProps = JSON.parse(element.serializedResolvedPropsWithCustomSchema);
|
|
111
|
+
if (typeof parsedProps !== 'object' ||
|
|
112
|
+
parsedProps === null ||
|
|
113
|
+
Array.isArray(parsedProps)) {
|
|
114
|
+
throw new Error('Resolved composition props must be an object');
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
throw new Error('Unsupported element type');
|
|
119
|
+
};
|
|
120
|
+
const getElementLabel = (element) => {
|
|
121
|
+
if (element.type === 'solid') {
|
|
122
|
+
return '<Solid>';
|
|
123
|
+
}
|
|
124
|
+
if (element.type === 'svg') {
|
|
125
|
+
return '<Interactive.Svg>';
|
|
126
|
+
}
|
|
127
|
+
if (element.type === 'asset') {
|
|
128
|
+
if (element.assetType === 'image') {
|
|
129
|
+
return '<CanvasImage>';
|
|
130
|
+
}
|
|
131
|
+
if (element.assetType === 'video') {
|
|
132
|
+
return '<Video>';
|
|
133
|
+
}
|
|
134
|
+
if (element.assetType === 'gif') {
|
|
135
|
+
return '<Gif>';
|
|
136
|
+
}
|
|
137
|
+
if (element.assetType === 'animated-image') {
|
|
138
|
+
return '<AnimatedImage>';
|
|
139
|
+
}
|
|
140
|
+
if (element.assetType === 'audio') {
|
|
141
|
+
return '<Audio>';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (element.type === 'component') {
|
|
145
|
+
return `<${element.componentName}>`;
|
|
146
|
+
}
|
|
147
|
+
if (element.type === 'composition') {
|
|
148
|
+
return `composition "${element.compositionId}"`;
|
|
149
|
+
}
|
|
150
|
+
throw new Error('Unsupported element type');
|
|
151
|
+
};
|
|
152
|
+
const insertJsxElementHandler = ({ input: { compositionFile, compositionId, element, from }, remotionRoot, logLevel, }) => (0, source_file_write_queue_1.withSourceFileWriteQueue)(async () => {
|
|
153
|
+
try {
|
|
154
|
+
validateElement(element, remotionRoot);
|
|
155
|
+
if (from !== null &&
|
|
156
|
+
(!Number.isInteger(from) || !Number.isFinite(from) || from < 0)) {
|
|
157
|
+
throw new Error('from must be a non-negative integer');
|
|
158
|
+
}
|
|
159
|
+
const elementLabel = getElementLabel(element);
|
|
160
|
+
renderer_1.RenderInternals.Log.trace({ indent: false, logLevel }, `[insert-jsx-element] Received request for compositionFile="${compositionFile}" compositionId="${compositionId}" element="${element.type}"`);
|
|
161
|
+
const { fileName, source, oldContents, output, insertedNodePath, logLine, nodePathRemappings, } = await (0, resolve_composition_component_1.insertJsxElementIntoComposition)({
|
|
162
|
+
remotionRoot,
|
|
163
|
+
compositionFile,
|
|
164
|
+
compositionId,
|
|
165
|
+
element,
|
|
166
|
+
from,
|
|
167
|
+
prettierConfigOverride: null,
|
|
168
|
+
sourceFileOverrides: null,
|
|
169
|
+
});
|
|
170
|
+
const nodePathMutation = (0, sequence_node_path_mutation_1.broadcastSequenceNodePathMutation)([
|
|
171
|
+
{
|
|
172
|
+
absolutePath: fileName,
|
|
173
|
+
remappings: nodePathRemappings,
|
|
174
|
+
},
|
|
175
|
+
], insertedNodePath === null
|
|
176
|
+
? null
|
|
177
|
+
: {
|
|
178
|
+
absolutePath: fileName,
|
|
179
|
+
compositionId,
|
|
180
|
+
nodePath: insertedNodePath,
|
|
181
|
+
});
|
|
182
|
+
if (insertedNodePath === null) {
|
|
183
|
+
renderer_1.RenderInternals.Log.warn({ indent: false, logLevel }, 'Could not determine the inserted JSX element node path. Skipping automatic selection.');
|
|
184
|
+
}
|
|
185
|
+
(0, undo_stack_1.pushToUndoStack)({
|
|
186
|
+
filePath: fileName,
|
|
187
|
+
oldContents,
|
|
188
|
+
newContents: output,
|
|
189
|
+
logLevel,
|
|
190
|
+
remotionRoot,
|
|
191
|
+
logLine,
|
|
192
|
+
description: {
|
|
193
|
+
undoMessage: `↩️ Added ${elementLabel}`,
|
|
194
|
+
redoMessage: `↪️ Added ${elementLabel}`,
|
|
195
|
+
},
|
|
196
|
+
entryType: 'insert-jsx-element',
|
|
197
|
+
suppressHmrOnFileRestore: false,
|
|
198
|
+
nodePathRemappings,
|
|
199
|
+
});
|
|
200
|
+
(0, undo_stack_1.suppressUndoStackInvalidation)(fileName);
|
|
201
|
+
(0, file_watcher_1.writeFileAndNotifyFileWatchers)({
|
|
202
|
+
file: fileName,
|
|
203
|
+
content: output,
|
|
204
|
+
originatorClientId: undefined,
|
|
205
|
+
metadata: { skipSequencePropsUpdate: true },
|
|
206
|
+
});
|
|
207
|
+
const locationLabel = (0, format_log_file_location_1.formatLogFileLocation)({
|
|
208
|
+
remotionRoot,
|
|
209
|
+
absolutePath: fileName,
|
|
210
|
+
line: logLine,
|
|
211
|
+
});
|
|
212
|
+
renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `${(0, source_file_write_queue_1.getCodemodTimingPrefix)(logLevel)}${renderer_1.RenderInternals.chalk.blueBright(`${locationLabel}`)} Added ${elementLabel}`);
|
|
213
|
+
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel }, `[insert-jsx-element] Wrote ${source}`);
|
|
214
|
+
(0, undo_stack_1.printUndoHint)(logLevel);
|
|
215
|
+
return {
|
|
216
|
+
success: true,
|
|
217
|
+
insertedNodePath: insertedNodePath === null
|
|
218
|
+
? null
|
|
219
|
+
: { absolutePath: fileName, nodePath: insertedNodePath },
|
|
220
|
+
nodePathMutation,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
return {
|
|
225
|
+
success: false,
|
|
226
|
+
reason: err.message,
|
|
227
|
+
stack: err.stack,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
exports.insertJsxElementHandler = insertJsxElementHandler;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.insertVideoLayersHandler = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const renderer_1 = require("@remotion/renderer");
|
|
6
|
+
const insert_video_layers_1 = require("../../codemods/insert-video-layers");
|
|
7
|
+
const file_watcher_1 = require("../../file-watcher");
|
|
8
|
+
const resolve_file_inside_project_1 = require("../../helpers/resolve-file-inside-project");
|
|
9
|
+
const format_log_file_location_1 = require("../format-log-file-location");
|
|
10
|
+
const sequence_node_path_mutation_1 = require("../sequence-node-path-mutation");
|
|
11
|
+
const undo_stack_1 = require("../undo-stack");
|
|
12
|
+
const source_file_write_queue_1 = require("./source-file-write-queue");
|
|
13
|
+
const insertVideoLayersHandler = ({ input: { fileName, nodePath, baseSrc, foregroundSrc }, remotionRoot, logLevel, }) => (0, source_file_write_queue_1.withSourceFileWriteQueue)(() => {
|
|
14
|
+
var _a;
|
|
15
|
+
try {
|
|
16
|
+
const { absolutePath } = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
|
|
17
|
+
remotionRoot,
|
|
18
|
+
fileName,
|
|
19
|
+
action: 'modify',
|
|
20
|
+
});
|
|
21
|
+
const fileContents = (0, node_fs_1.readFileSync)(absolutePath, 'utf-8');
|
|
22
|
+
const { output, logLine, nodePathRemappings } = (0, insert_video_layers_1.insertVideoLayers)({
|
|
23
|
+
input: fileContents,
|
|
24
|
+
nodePath,
|
|
25
|
+
baseSrc,
|
|
26
|
+
foregroundSrc,
|
|
27
|
+
});
|
|
28
|
+
const nodePathMutation = (0, sequence_node_path_mutation_1.broadcastSequenceNodePathMutation)([{ absolutePath, remappings: nodePathRemappings }], null);
|
|
29
|
+
(0, undo_stack_1.pushToUndoStack)({
|
|
30
|
+
filePath: absolutePath,
|
|
31
|
+
oldContents: fileContents,
|
|
32
|
+
newContents: null,
|
|
33
|
+
logLevel,
|
|
34
|
+
remotionRoot,
|
|
35
|
+
logLine,
|
|
36
|
+
description: {
|
|
37
|
+
undoMessage: '↩️ Insertion of separated video layers',
|
|
38
|
+
redoMessage: '↪️ Insertion of separated video layers',
|
|
39
|
+
},
|
|
40
|
+
entryType: 'insert-video-layers',
|
|
41
|
+
suppressHmrOnFileRestore: false,
|
|
42
|
+
nodePathRemappings,
|
|
43
|
+
});
|
|
44
|
+
(0, undo_stack_1.suppressUndoStackInvalidation)(absolutePath);
|
|
45
|
+
(0, file_watcher_1.writeFileAndNotifyFileWatchers)({
|
|
46
|
+
file: absolutePath,
|
|
47
|
+
content: output,
|
|
48
|
+
originatorClientId: undefined,
|
|
49
|
+
metadata: { skipSequencePropsUpdate: true },
|
|
50
|
+
});
|
|
51
|
+
const locationLabel = (0, format_log_file_location_1.formatLogFileLocation)({
|
|
52
|
+
remotionRoot,
|
|
53
|
+
absolutePath,
|
|
54
|
+
line: logLine,
|
|
55
|
+
});
|
|
56
|
+
renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `${(0, source_file_write_queue_1.getCodemodTimingPrefix)(logLevel)}${renderer_1.RenderInternals.chalk.blueBright(locationLabel)} Inserted separated video layers`);
|
|
57
|
+
(0, undo_stack_1.printUndoHint)(logLevel);
|
|
58
|
+
return Promise.resolve({ success: true, nodePathMutation });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return Promise.resolve({
|
|
62
|
+
success: false,
|
|
63
|
+
reason: error.message,
|
|
64
|
+
stack: (_a = error.stack) !== null && _a !== void 0 ? _a : '',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
exports.insertVideoLayersHandler = insertVideoLayersHandler;
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import { type InstallPackageRequest, type InstallPackageResponse, type PackageInstallSpec } from '@remotion/studio-shared';
|
|
2
|
+
import type { ApiHandler } from '../api-types';
|
|
2
3
|
export declare const getPackageInstallSpec: (dependency: PackageInstallSpec) => string;
|
|
3
|
-
export declare const handleInstallPackage: ({ logLevel, remotionRoot, input: { dependencies }, invalidateBundle, }: {
|
|
4
|
-
input: InstallPackageRequest;
|
|
5
|
-
entryPoint: string;
|
|
6
|
-
remotionRoot: string;
|
|
7
|
-
request: import("http").IncomingMessage;
|
|
8
|
-
response: import("http").ServerResponse<import("http").IncomingMessage>;
|
|
9
|
-
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
|
|
10
|
-
methods: import("../api-types").QueueMethods;
|
|
11
|
-
publicDir: string;
|
|
12
|
-
binariesDirectory: string | null;
|
|
13
|
-
configFile: string | null;
|
|
14
|
-
getDefaultCodingAgent: () => "claude-code" | "codex" | "copilot" | "cursor" | null;
|
|
15
|
-
getDefaultEditor: () => import("@remotion/renderer").DefaultEditor | null;
|
|
16
|
-
} & {
|
|
4
|
+
export declare const handleInstallPackage: ({ logLevel, remotionRoot, input: { dependencies }, invalidateBundle, }: Parameters<ApiHandler<InstallPackageRequest, InstallPackageResponse>>[0] & {
|
|
17
5
|
readonly invalidateBundle: () => Promise<void>;
|
|
18
6
|
}) => Promise<InstallPackageResponse>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
1
2
|
import type { PropDelta } from './formatting';
|
|
2
3
|
export declare const logEffectUpdate: ({ fileRelativeToRoot, line, effectName, propKey, oldValueString, newValueString, defaultValueString, formatted, logLevel, removedProps, addedProps, }: {
|
|
3
4
|
fileRelativeToRoot: string;
|
|
@@ -8,7 +9,7 @@ export declare const logEffectUpdate: ({ fileRelativeToRoot, line, effectName, p
|
|
|
8
9
|
newValueString: string;
|
|
9
10
|
defaultValueString: string | null;
|
|
10
11
|
formatted: boolean;
|
|
11
|
-
logLevel:
|
|
12
|
+
logLevel: LogLevel;
|
|
12
13
|
removedProps: PropDelta[];
|
|
13
14
|
addedProps: PropDelta[];
|
|
14
15
|
}) => void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
1
2
|
import type { PropDelta } from './formatting';
|
|
2
|
-
export declare const warnAboutPrettierOnce: (logLevel:
|
|
3
|
+
export declare const warnAboutPrettierOnce: (logLevel: LogLevel) => void;
|
|
3
4
|
export declare const normalizeQuotes: (str: string) => string;
|
|
4
5
|
export declare const logUpdate: ({ fileRelativeToRoot, line, key, oldValueString, newValueString, defaultValueString, formatted, logLevel, removedProps, addedProps, }: {
|
|
5
6
|
fileRelativeToRoot: string;
|
|
@@ -9,7 +10,7 @@ export declare const logUpdate: ({ fileRelativeToRoot, line, key, oldValueString
|
|
|
9
10
|
newValueString: string;
|
|
10
11
|
defaultValueString: string | null;
|
|
11
12
|
formatted: boolean;
|
|
12
|
-
logLevel:
|
|
13
|
+
logLevel: LogLevel;
|
|
13
14
|
removedProps: PropDelta[];
|
|
14
15
|
addedProps: PropDelta[];
|
|
15
16
|
}) => void;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
1
2
|
import type { MoveKeyframesRequest, MoveKeyframesResponse } from '@remotion/studio-shared';
|
|
2
3
|
import type { ApiHandler } from '../api-types';
|
|
3
4
|
export declare const moveKeyframes: ({ sequenceKeyframes, effectKeyframes, clientId, remotionRoot, logLevel, }: MoveKeyframesRequest & {
|
|
4
5
|
remotionRoot: string;
|
|
5
|
-
logLevel:
|
|
6
|
+
logLevel: LogLevel;
|
|
6
7
|
}) => Promise<void>;
|
|
7
8
|
export declare const moveKeyframesHandler: ApiHandler<MoveKeyframesRequest, MoveKeyframesResponse>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { DefaultEditor } from '@remotion/renderer';
|
|
1
|
+
import type { DefaultEditor, LogLevel } from '@remotion/renderer';
|
|
2
2
|
import type { OpenInEditorRequest, OpenInEditorResponse } from '@remotion/studio-shared';
|
|
3
3
|
import type { ApiHandler } from '../api-types';
|
|
4
4
|
export declare const getEditorName: ({ getDefaultEditor, logLevel, }: {
|
|
5
5
|
getDefaultEditor: () => DefaultEditor | null;
|
|
6
|
-
logLevel:
|
|
6
|
+
logLevel: LogLevel;
|
|
7
7
|
}) => Promise<string | null>;
|
|
8
8
|
export declare const openInEditorHandler: ApiHandler<OpenInEditorRequest, OpenInEditorResponse>;
|
|
@@ -2,7 +2,7 @@ import type { GetRemotionSkillsInfoRequest, GetRemotionSkillsInfoResponse, OpenR
|
|
|
2
2
|
import type { ApiHandler } from '../api-types';
|
|
3
3
|
export declare const getRemotionSkillsInfo: ({ remotionRoot, homeDirectory, }: {
|
|
4
4
|
remotionRoot: string;
|
|
5
|
-
homeDirectory?: string
|
|
5
|
+
homeDirectory?: string;
|
|
6
6
|
}) => GetRemotionSkillsInfoResponse;
|
|
7
7
|
export declare const remotionSkillsInfoHandler: ApiHandler<GetRemotionSkillsInfoRequest, GetRemotionSkillsInfoResponse>;
|
|
8
8
|
export declare const openRemotionSkillHandler: ApiHandler<OpenRemotionSkillRequest, void>;
|
|
@@ -141,6 +141,9 @@ const saveMultipleEffectPropsHandler = ({ input: { edits, clientId, undoLabel, r
|
|
|
141
141
|
edit,
|
|
142
142
|
])).values(),
|
|
143
143
|
];
|
|
144
|
+
const statusAsts = new Map();
|
|
145
|
+
// Share binding analysis, but resolve each target's video configuration below.
|
|
146
|
+
const statusIdentifiers = new Map();
|
|
144
147
|
const results = statusTargets.map((edit) => {
|
|
145
148
|
const { absolutePath } = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
|
|
146
149
|
remotionRoot,
|
|
@@ -151,24 +154,38 @@ const saveMultipleEffectPropsHandler = ({ input: { edits, clientId, undoLabel, r
|
|
|
151
154
|
if (!output) {
|
|
152
155
|
throw new Error('Could not compute effect prop edit status');
|
|
153
156
|
}
|
|
154
|
-
|
|
157
|
+
let ast = statusAsts.get(absolutePath);
|
|
158
|
+
if (!ast) {
|
|
159
|
+
ast = (0, parse_ast_1.parseAst)(output);
|
|
160
|
+
statusAsts.set(absolutePath, ast);
|
|
161
|
+
}
|
|
155
162
|
const jsx = (0, can_update_sequence_props_1.findJsxElementAtNodePath)(ast, edit.sequenceNodePath.nodePath);
|
|
156
|
-
|
|
157
|
-
|
|
163
|
+
let status;
|
|
164
|
+
if (jsx) {
|
|
165
|
+
const keys = (0, studio_shared_1.getAllSchemaKeys)(edit.schema);
|
|
166
|
+
let identifiers = statusIdentifiers.get(absolutePath);
|
|
167
|
+
if (!identifiers) {
|
|
168
|
+
identifiers = (0, video_config_values_1.getVideoConfigIdentifiers)({ ast });
|
|
169
|
+
statusIdentifiers.set(absolutePath, identifiers);
|
|
170
|
+
}
|
|
171
|
+
status = (0, can_update_effect_props_1.computeEffectPropStatus)({
|
|
158
172
|
ast,
|
|
159
173
|
jsx,
|
|
160
174
|
effectIndex: edit.effectIndex,
|
|
161
|
-
keys
|
|
162
|
-
videoConfigValues: (0, video_config_values_1.
|
|
163
|
-
|
|
175
|
+
keys,
|
|
176
|
+
videoConfigValues: (0, video_config_values_1.resolveVideoConfigIdentifierValues)({
|
|
177
|
+
identifiers,
|
|
164
178
|
videoConfigValues: edit.sequenceNodePath.videoConfigValues,
|
|
165
179
|
}),
|
|
166
|
-
})
|
|
167
|
-
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
status = {
|
|
168
184
|
canUpdate: false,
|
|
169
185
|
effectIndex: edit.effectIndex,
|
|
170
186
|
reason: 'not-found',
|
|
171
187
|
};
|
|
188
|
+
}
|
|
172
189
|
return {
|
|
173
190
|
fileName: edit.fileName,
|
|
174
191
|
sequenceNodePath: edit.sequenceNodePath,
|
|
@@ -13,10 +13,10 @@ type ResolvedSequencePropEdit = {
|
|
|
13
13
|
schema: SaveSequencePropEdit['schema'];
|
|
14
14
|
sourceEdit: SaveSequencePropEdit['sourceEdit'];
|
|
15
15
|
};
|
|
16
|
-
export declare const convertSequencePropEditToCodemodChange: (edit: Pick<ResolvedSequencePropEdit,
|
|
16
|
+
export declare const convertSequencePropEditToCodemodChange: (edit: Pick<ResolvedSequencePropEdit, 'nodePath' | 'key' | 'value' | 'defaultValue' | 'schema' | 'sourceEdit'>) => SequencePropsNodeUpdate;
|
|
17
17
|
export declare const shouldSuppressHmrForSequencePropEdits: (edits: readonly {
|
|
18
18
|
key: string;
|
|
19
|
-
sourceEdit?:
|
|
19
|
+
sourceEdit?: SaveSequencePropEdit['sourceEdit'];
|
|
20
20
|
}[]) => boolean;
|
|
21
21
|
export declare const saveSequencePropsHandler: ApiHandler<SaveSequencePropsRequest, SaveSequencePropsResponse>;
|
|
22
22
|
export {};
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const
|
|
1
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
2
|
+
export declare const getCodemodTimingPrefix: (logLevel: LogLevel) => string;
|
|
3
|
+
export declare const withSourceFileWriteQueue: <T>(fn: () => Promise<T> | T) => Promise<T>;
|