@remotion/studio-server 4.0.539 → 4.0.541
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/get-node-path-remappings.d.ts +5 -2
- package/dist/codemods/get-node-path-remappings.js +7 -1
- package/dist/file-watcher.d.ts +7 -1
- package/dist/file-watcher.js +33 -5
- package/dist/index.d.ts +6 -2
- package/dist/index.js +4 -0
- package/dist/preview-server/api-routes.js +4 -0
- package/dist/preview-server/commit-node-codemod.d.ts +27 -0
- package/dist/preview-server/commit-node-codemod.js +68 -0
- package/dist/preview-server/hot-middleware/index.js +11 -7
- package/dist/preview-server/live-events.js +8 -1
- package/dist/preview-server/prerendered-scene.d.ts +25 -0
- package/dist/preview-server/prerendered-scene.js +86 -0
- package/dist/preview-server/resolve-compiled-sequence-paths.d.ts +12 -0
- package/dist/preview-server/resolve-compiled-sequence-paths.js +155 -0
- package/dist/preview-server/routes/add-effect-keyframe.js +1 -1
- package/dist/preview-server/routes/add-keyframes.js +17 -9
- package/dist/preview-server/routes/add-render.js +28 -2
- package/dist/preview-server/routes/add-sequence-keyframe.js +1 -1
- package/dist/preview-server/routes/can-update-sequence-props.js +17 -4
- package/dist/preview-server/routes/delete-keyframes.d.ts +2 -2
- package/dist/preview-server/routes/delete-keyframes.js +36 -4
- package/dist/preview-server/routes/delete-nodes.js +1 -1
- package/dist/preview-server/routes/duplicate-nodes.js +3 -1
- package/dist/preview-server/routes/get-keyframe-mutation-results.d.ts +7 -0
- package/dist/preview-server/routes/get-keyframe-mutation-results.js +24 -0
- package/dist/preview-server/routes/invalidate-bundle.js +1 -1
- package/dist/preview-server/routes/move-keyframes.d.ts +2 -2
- package/dist/preview-server/routes/move-keyframes.js +36 -4
- package/dist/preview-server/routes/precompose-jsx-nodes.js +14 -10
- package/dist/preview-server/routes/prerendered-scene-info.d.ts +3 -0
- package/dist/preview-server/routes/prerendered-scene-info.js +31 -0
- package/dist/preview-server/routes/reorder-sequence.js +1 -1
- package/dist/preview-server/routes/replace-video-source.js +25 -78
- package/dist/preview-server/routes/restore-prerendered-scene.d.ts +3 -0
- package/dist/preview-server/routes/restore-prerendered-scene.js +38 -0
- package/dist/preview-server/routes/save-effect-props.js +1 -1
- package/dist/preview-server/routes/save-sequence-props.js +3 -1
- package/dist/preview-server/routes/split-sequences.js +10 -2
- package/dist/preview-server/routes/split-video-from-audio.js +1 -1
- package/dist/preview-server/routes/subscribe-to-sequence-props.js +50 -15
- package/dist/preview-server/routes/unwrap-node.js +1 -1
- package/dist/preview-server/routes/update-effect-keyframe-settings.js +1 -1
- package/dist/preview-server/routes/update-sequence-keyframe-settings.js +1 -1
- package/dist/preview-server/routes/wrap-node.js +1 -1
- package/dist/preview-server/sequence-node-path-mutation-build.d.ts +2 -0
- package/dist/preview-server/sequence-node-path-mutation-build.js +221 -0
- package/dist/preview-server/sequence-node-path-mutation.d.ts +2 -1
- package/dist/preview-server/sequence-node-path-mutation.js +14 -2
- package/dist/preview-server/sequence-props-watchers.d.ts +2 -1
- package/dist/preview-server/sequence-props-watchers.js +11 -4
- package/dist/preview-server/serve-static.js +3 -0
- package/dist/preview-server/undo-stack.d.ts +1 -1
- package/dist/preview-server/undo-stack.js +14 -2
- package/dist/preview-server/watch-ignore-next-change.d.ts +1 -1
- package/dist/preview-server/watch-ignore-next-change.js +3 -3
- package/dist/remotion-skill-names.d.ts +1 -1
- package/dist/remotion-skill-names.js +1 -0
- package/dist/routes.js +91 -28
- package/package.json +10 -10
- package/dist/canvas-capture/generate-canvas-capture-composition.d.ts +0 -14
- package/dist/canvas-capture/generate-canvas-capture-composition.js +0 -239
- package/dist/codemods/add-effect.d.ts +0 -1
- package/dist/codemods/add-effect.js +0 -8
- package/dist/codemods/apply-codemod-to-file.d.ts +0 -7
- package/dist/codemods/apply-codemod-to-file.js +0 -171
- package/dist/codemods/apply-visual-control.d.ts +0 -8
- package/dist/codemods/apply-visual-control.js +0 -89
- package/dist/codemods/delete-effect.d.ts +0 -1
- package/dist/codemods/delete-effect.js +0 -6
- package/dist/codemods/delete-jsx-node.d.ts +0 -22
- package/dist/codemods/delete-jsx-node.js +0 -17
- package/dist/codemods/delete-jsx-nodes.d.ts +0 -13
- package/dist/codemods/delete-jsx-nodes.js +0 -10
- package/dist/codemods/duplicate-composition.d.ts +0 -2
- package/dist/codemods/duplicate-composition.js +0 -64
- package/dist/codemods/duplicate-effect.d.ts +0 -1
- package/dist/codemods/duplicate-effect.js +0 -6
- package/dist/codemods/duplicate-jsx-node.d.ts +0 -25
- package/dist/codemods/duplicate-jsx-node.js +0 -26
- package/dist/codemods/format-file-content.d.ts +0 -7
- package/dist/codemods/format-file-content.js +0 -80
- package/dist/codemods/format-inline-content.d.ts +0 -18
- package/dist/codemods/format-inline-content.js +0 -78
- package/dist/codemods/insert-video-layers.d.ts +0 -11
- package/dist/codemods/insert-video-layers.js +0 -5
- package/dist/codemods/recast-mods.d.ts +0 -13
- package/dist/codemods/recast-mods.js +0 -902
- package/dist/codemods/reorder-effect.d.ts +0 -1
- package/dist/codemods/reorder-effect.js +0 -5
- package/dist/codemods/reorder-sequence.d.ts +0 -1
- package/dist/codemods/reorder-sequence.js +0 -5
- package/dist/codemods/simple-diff.d.ts +0 -5
- package/dist/codemods/simple-diff.js +0 -39
- package/dist/codemods/split-jsx-sequence.d.ts +0 -27
- package/dist/codemods/split-jsx-sequence.js +0 -19
- package/dist/codemods/split-video-from-audio.d.ts +0 -1
- package/dist/codemods/split-video-from-audio.js +0 -5
- package/dist/codemods/update-default-props.d.ts +0 -1
- package/dist/codemods/update-default-props.js +0 -6
- package/dist/codemods/update-inline-caption-patches.d.ts +0 -1
- package/dist/codemods/update-inline-caption-patches.js +0 -5
- package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.d.ts +0 -1
- package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.js +0 -7
- package/dist/open-browser-shortcut.d.ts +0 -9
- package/dist/open-browser-shortcut.js +0 -121
- package/dist/preview-server/hot-middleware/types.d.ts +0 -2
- package/dist/preview-server/hot-middleware/types.js +0 -2
- package/dist/preview-server/routes/apply-codemod.d.ts +0 -4
- package/dist/preview-server/routes/apply-codemod.js +0 -272
- package/dist/preview-server/routes/delete-jsx-node.d.ts +0 -3
- package/dist/preview-server/routes/delete-jsx-node.js +0 -126
- package/dist/preview-server/routes/delete-jsx-nodes.d.ts +0 -3
- package/dist/preview-server/routes/delete-jsx-nodes.js +0 -137
- package/dist/preview-server/routes/duplicate-jsx-node.d.ts +0 -3
- package/dist/preview-server/routes/duplicate-jsx-node.js +0 -118
- package/dist/preview-server/routes/insert-jsx-element.d.ts +0 -3
- package/dist/preview-server/routes/insert-jsx-element.js +0 -231
- package/dist/preview-server/routes/insert-video-layers.d.ts +0 -3
- package/dist/preview-server/routes/insert-video-layers.js +0 -68
- package/dist/preview-server/routes/split-jsx-sequence.d.ts +0 -3
- package/dist/preview-server/routes/split-jsx-sequence.js +0 -117
- package/dist/preview-server/routes/update-public-license.d.ts +0 -11
- package/dist/preview-server/routes/update-public-license.js +0 -97
- package/dist/preview-server/routes/wrap-jsx-node.d.ts +0 -3
- package/dist/preview-server/routes/wrap-jsx-node.js +0 -97
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type { File } from '@babel/types';
|
|
2
1
|
import type { SequenceNodePath } from 'remotion';
|
|
3
2
|
export type CapturedJsxNodePath = {
|
|
4
3
|
nodePath: SequenceNodePath;
|
|
4
|
+
location: {
|
|
5
|
+
line: number;
|
|
6
|
+
column: number;
|
|
7
|
+
} | null;
|
|
5
8
|
};
|
|
6
|
-
export declare const captureJsxNodePaths: (
|
|
9
|
+
export declare const captureJsxNodePaths: (source: string) => CapturedJsxNodePath[];
|
|
@@ -34,14 +34,20 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.captureJsxNodePaths = void 0;
|
|
37
|
+
const codemods_1 = require("@remotion/codemods");
|
|
37
38
|
const recast = __importStar(require("recast"));
|
|
38
39
|
const can_update_sequence_props_1 = require("../preview-server/routes/can-update-sequence-props");
|
|
39
|
-
const
|
|
40
|
+
const parse_ast_1 = require("./parse-ast");
|
|
41
|
+
const captureJsxNodePaths = (source) => {
|
|
42
|
+
const ast = (0, parse_ast_1.parseAst)(source);
|
|
40
43
|
const captured = [];
|
|
41
44
|
recast.visit(ast, {
|
|
42
45
|
visitJSXOpeningElement(path) {
|
|
43
46
|
captured.push({
|
|
44
47
|
nodePath: (0, can_update_sequence_props_1.getNodePathForRecastPath)(path, ast),
|
|
48
|
+
location: path.node.loc
|
|
49
|
+
? codemods_1.CodemodsInternals.getJsxSourceLocation(source, path.node.loc.start)
|
|
50
|
+
: null,
|
|
45
51
|
});
|
|
46
52
|
return this.traverse(path);
|
|
47
53
|
},
|
package/dist/file-watcher.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SourceFileVersion } from '@remotion/studio-shared';
|
|
1
2
|
export type FileChangeMetadata = {
|
|
2
3
|
skipSequencePropsUpdate: boolean;
|
|
3
4
|
};
|
|
@@ -11,6 +12,7 @@ export type FileChangeEvent = {
|
|
|
11
12
|
type: 'created';
|
|
12
13
|
content: string;
|
|
13
14
|
originatorClientId: string | undefined;
|
|
15
|
+
sourceVersion: SourceFileVersion | null;
|
|
14
16
|
} | {
|
|
15
17
|
type: 'deleted';
|
|
16
18
|
} | {
|
|
@@ -18,9 +20,12 @@ export type FileChangeEvent = {
|
|
|
18
20
|
content: string;
|
|
19
21
|
originatorClientId: string | undefined;
|
|
20
22
|
skipSequencePropsUpdate: boolean;
|
|
23
|
+
sourceVersion: SourceFileVersion | null;
|
|
21
24
|
};
|
|
22
25
|
type OnChange = (event: FileChangeEvent) => void;
|
|
26
|
+
export declare const subscribeToStudioSourceWrites: (listener: (file: string, contents: string) => void) => () => boolean;
|
|
23
27
|
export type FileWatcherRegistry = {
|
|
28
|
+
readonly sourceVersionSessionId: string;
|
|
24
29
|
installFileWatcher: (options: {
|
|
25
30
|
file: string;
|
|
26
31
|
onChange: OnChange;
|
|
@@ -35,9 +40,10 @@ export type FileWatcherRegistry = {
|
|
|
35
40
|
exists: boolean;
|
|
36
41
|
unwatch: () => void;
|
|
37
42
|
};
|
|
38
|
-
writeFileAndNotifyFileWatchers: (options: WriteFileAndNotifyFileWatchersOptions) =>
|
|
43
|
+
writeFileAndNotifyFileWatchers: (options: WriteFileAndNotifyFileWatchersOptions) => SourceFileVersion | null;
|
|
39
44
|
};
|
|
40
45
|
export declare const createFileWatcherRegistry: () => FileWatcherRegistry;
|
|
46
|
+
export declare const getSourceVersionSessionId: () => string | null;
|
|
41
47
|
export declare const setFileWatcherRegistry: (registry: FileWatcherRegistry) => (() => void);
|
|
42
48
|
export declare const getFileWatcherRegistry: () => FileWatcherRegistry;
|
|
43
49
|
export declare const installFileWatcher: FileWatcherRegistry['installFileWatcher'];
|
package/dist/file-watcher.js
CHANGED
|
@@ -33,12 +33,25 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.writeFileAndNotifyFileWatchers = exports.installFileWatcher = exports.getFileWatcherRegistry = exports.setFileWatcherRegistry = exports.createFileWatcherRegistry = void 0;
|
|
36
|
+
exports.writeFileAndNotifyFileWatchers = exports.installFileWatcher = exports.getFileWatcherRegistry = exports.setFileWatcherRegistry = exports.getSourceVersionSessionId = exports.createFileWatcherRegistry = exports.subscribeToStudioSourceWrites = void 0;
|
|
37
|
+
const node_crypto_1 = require("node:crypto");
|
|
37
38
|
const node_fs_1 = __importStar(require("node:fs"));
|
|
38
39
|
const watch_ignore_next_change_1 = require("./preview-server/watch-ignore-next-change");
|
|
40
|
+
const sourceWriteListeners = new Set();
|
|
41
|
+
const subscribeToStudioSourceWrites = (listener) => {
|
|
42
|
+
sourceWriteListeners.add(listener);
|
|
43
|
+
return () => sourceWriteListeners.delete(listener);
|
|
44
|
+
};
|
|
45
|
+
exports.subscribeToStudioSourceWrites = subscribeToStudioSourceWrites;
|
|
39
46
|
const getRegistryKey = (file, existenceOnly) => existenceOnly ? `${file}\0existence-only` : file;
|
|
40
47
|
const createFileWatcherRegistry = () => {
|
|
41
48
|
const sharedWatchers = new Map();
|
|
49
|
+
const sessionId = (0, node_crypto_1.randomUUID)();
|
|
50
|
+
let revision = 0;
|
|
51
|
+
const nextSourceVersion = () => ({
|
|
52
|
+
sessionId,
|
|
53
|
+
revision: ++revision,
|
|
54
|
+
});
|
|
42
55
|
const _installFileWatcher = ({ file, onChange, existenceOnly, }) => {
|
|
43
56
|
const registryKey = getRegistryKey(file, existenceOnly);
|
|
44
57
|
const existing = sharedWatchers.get(registryKey);
|
|
@@ -74,6 +87,7 @@ const createFileWatcherRegistry = () => {
|
|
|
74
87
|
type: 'created',
|
|
75
88
|
content: '',
|
|
76
89
|
originatorClientId: undefined,
|
|
90
|
+
sourceVersion: null,
|
|
77
91
|
};
|
|
78
92
|
}
|
|
79
93
|
else if (shared.existedBefore && !existsNow) {
|
|
@@ -85,7 +99,12 @@ const createFileWatcherRegistry = () => {
|
|
|
85
99
|
const content = (0, node_fs_1.readFileSync)(file, 'utf-8');
|
|
86
100
|
shared.existedBefore = true;
|
|
87
101
|
shared.lastKnownContent = content;
|
|
88
|
-
event = {
|
|
102
|
+
event = {
|
|
103
|
+
type: 'created',
|
|
104
|
+
content,
|
|
105
|
+
originatorClientId: undefined,
|
|
106
|
+
sourceVersion: nextSourceVersion(),
|
|
107
|
+
};
|
|
89
108
|
}
|
|
90
109
|
else if (shared.existedBefore && !existsNow) {
|
|
91
110
|
shared.existedBefore = false;
|
|
@@ -107,6 +126,7 @@ const createFileWatcherRegistry = () => {
|
|
|
107
126
|
content,
|
|
108
127
|
originatorClientId: undefined,
|
|
109
128
|
skipSequencePropsUpdate: false,
|
|
129
|
+
sourceVersion: nextSourceVersion(),
|
|
110
130
|
};
|
|
111
131
|
}
|
|
112
132
|
if (!event) {
|
|
@@ -133,9 +153,12 @@ const createFileWatcherRegistry = () => {
|
|
|
133
153
|
var _a;
|
|
134
154
|
(0, watch_ignore_next_change_1.prepareBundlerForFileWrite)(file);
|
|
135
155
|
(0, node_fs_1.writeFileSync)(file, content);
|
|
156
|
+
const sourceVersion = nextSourceVersion();
|
|
157
|
+
for (const listener of sourceWriteListeners)
|
|
158
|
+
listener(file, content);
|
|
136
159
|
const shared = sharedWatchers.get(getRegistryKey(file, false));
|
|
137
160
|
if (!shared) {
|
|
138
|
-
return;
|
|
161
|
+
return sourceVersion;
|
|
139
162
|
}
|
|
140
163
|
shared.lastKnownContent = content;
|
|
141
164
|
shared.existedBefore = true;
|
|
@@ -145,16 +168,21 @@ const createFileWatcherRegistry = () => {
|
|
|
145
168
|
content,
|
|
146
169
|
originatorClientId,
|
|
147
170
|
skipSequencePropsUpdate: (_a = metadata === null || metadata === void 0 ? void 0 : metadata.skipSequencePropsUpdate) !== null && _a !== void 0 ? _a : false,
|
|
171
|
+
sourceVersion,
|
|
148
172
|
});
|
|
149
173
|
}
|
|
174
|
+
return sourceVersion;
|
|
150
175
|
};
|
|
151
176
|
return {
|
|
177
|
+
sourceVersionSessionId: sessionId,
|
|
152
178
|
installFileWatcher: _installFileWatcher,
|
|
153
179
|
writeFileAndNotifyFileWatchers: _writeFileAndNotifyFileWatchers,
|
|
154
180
|
};
|
|
155
181
|
};
|
|
156
182
|
exports.createFileWatcherRegistry = createFileWatcherRegistry;
|
|
157
183
|
let currentRegistry = null;
|
|
184
|
+
const getSourceVersionSessionId = () => { var _a; return (_a = currentRegistry === null || currentRegistry === void 0 ? void 0 : currentRegistry.sourceVersionSessionId) !== null && _a !== void 0 ? _a : null; };
|
|
185
|
+
exports.getSourceVersionSessionId = getSourceVersionSessionId;
|
|
158
186
|
const setFileWatcherRegistry = (registry) => {
|
|
159
187
|
currentRegistry = registry;
|
|
160
188
|
return () => {
|
|
@@ -181,8 +209,8 @@ const installFileWatcher = (options) => {
|
|
|
181
209
|
exports.installFileWatcher = installFileWatcher;
|
|
182
210
|
const writeFileAndNotifyFileWatchers = (options) => {
|
|
183
211
|
if (!currentRegistry) {
|
|
184
|
-
return;
|
|
212
|
+
return null;
|
|
185
213
|
}
|
|
186
|
-
(0, exports.getFileWatcherRegistry)().writeFileAndNotifyFileWatchers(options);
|
|
214
|
+
return (0, exports.getFileWatcherRegistry)().writeFileAndNotifyFileWatchers(options);
|
|
187
215
|
};
|
|
188
216
|
exports.writeFileAndNotifyFileWatchers = writeFileAndNotifyFileWatchers;
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,9 @@ import { getPackageManagerSpawnOptions } from './helpers/package-manager-spawn-o
|
|
|
12
12
|
import { getConfiguredMaxTimelineTracks, getMaxTimelineTracks, resetMaxTimelineTracks, setMaxTimelineTracks } from './max-timeline-tracks';
|
|
13
13
|
import { getPackageManager } from './preview-server/get-package-manager';
|
|
14
14
|
import { waitForLiveEventsListener } from './preview-server/live-events';
|
|
15
|
+
import { replaceWithPrerenderedVideo } from './preview-server/prerendered-scene';
|
|
15
16
|
import { getEditorName } from './preview-server/routes/open-in-editor';
|
|
17
|
+
import { subscribeToSequenceNodePathMutations } from './preview-server/sequence-node-path-mutation';
|
|
16
18
|
import { getRemotionVersion } from './preview-server/update-available';
|
|
17
19
|
import { remotionSkillNames } from './remotion-skill-names';
|
|
18
20
|
import { startStudio } from './start-studio';
|
|
@@ -48,7 +50,7 @@ export declare const StudioServerInternals: {
|
|
|
48
50
|
content: string;
|
|
49
51
|
originatorClientId: string | undefined;
|
|
50
52
|
metadata: import("./file-watcher").FileChangeMetadata | null;
|
|
51
|
-
}) =>
|
|
53
|
+
}) => import("@remotion/studio-shared").SourceFileVersion | null;
|
|
52
54
|
createFileWatcherRegistry: typeof createFileWatcherRegistry;
|
|
53
55
|
setFileWatcherRegistry: typeof setFileWatcherRegistry;
|
|
54
56
|
AnsiDiff: typeof AnsiDiff;
|
|
@@ -69,6 +71,8 @@ export declare const StudioServerInternals: {
|
|
|
69
71
|
removeCompletedClientRender: typeof removeCompletedClientRender;
|
|
70
72
|
detectOutdatedRemotionSkills: typeof detectOutdatedRemotionSkills;
|
|
71
73
|
parseRemotionSkillVersion: typeof parseRemotionSkillVersion;
|
|
72
|
-
remotionSkillNames: readonly ["remotion-best-practices", "remotion-captions", "remotion-create", "remotion-docs", "remotion-interactivity", "remotion-maps", "remotion-markup", "remotion-multimedia", "remotion-render", "remotion-saas", "remotion-studio", "remotion-upgrade"];
|
|
74
|
+
remotionSkillNames: readonly ["remotion-best-practices", "remotion-captions", "remotion-create", "remotion-docs", "remotion-interactivity", "remotion-license", "remotion-maps", "remotion-markup", "remotion-multimedia", "remotion-render", "remotion-saas", "remotion-studio", "remotion-upgrade"];
|
|
73
75
|
getEditorName: typeof getEditorName;
|
|
76
|
+
replaceWithPrerenderedVideo: typeof replaceWithPrerenderedVideo;
|
|
77
|
+
subscribeToSequenceNodePathMutations: typeof subscribeToSequenceNodePathMutations;
|
|
74
78
|
};
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,9 @@ const package_manager_spawn_options_1 = require("./helpers/package-manager-spawn
|
|
|
18
18
|
const max_timeline_tracks_1 = require("./max-timeline-tracks");
|
|
19
19
|
const get_package_manager_1 = require("./preview-server/get-package-manager");
|
|
20
20
|
const live_events_1 = require("./preview-server/live-events");
|
|
21
|
+
const prerendered_scene_1 = require("./preview-server/prerendered-scene");
|
|
21
22
|
const open_in_editor_1 = require("./preview-server/routes/open-in-editor");
|
|
23
|
+
const sequence_node_path_mutation_1 = require("./preview-server/sequence-node-path-mutation");
|
|
22
24
|
const update_available_1 = require("./preview-server/update-available");
|
|
23
25
|
const remotion_skill_names_1 = require("./remotion-skill-names");
|
|
24
26
|
Object.defineProperty(exports, "remotionSkillNames", { enumerable: true, get: function () { return remotion_skill_names_1.remotionSkillNames; } });
|
|
@@ -53,4 +55,6 @@ exports.StudioServerInternals = {
|
|
|
53
55
|
parseRemotionSkillVersion: detect_outdated_remotion_skills_1.parseRemotionSkillVersion,
|
|
54
56
|
remotionSkillNames: remotion_skill_names_1.remotionSkillNames,
|
|
55
57
|
getEditorName: open_in_editor_1.getEditorName,
|
|
58
|
+
replaceWithPrerenderedVideo: prerendered_scene_1.replaceWithPrerenderedVideo,
|
|
59
|
+
subscribeToSequenceNodePathMutations: sequence_node_path_mutation_1.subscribeToSequenceNodePathMutations,
|
|
56
60
|
};
|
|
@@ -42,6 +42,7 @@ const open_in_terminal_1 = require("./routes/open-in-terminal");
|
|
|
42
42
|
const paste_effects_1 = require("./routes/paste-effects");
|
|
43
43
|
const precompose_jsx_nodes_1 = require("./routes/precompose-jsx-nodes");
|
|
44
44
|
const prepare_element_install_1 = require("./routes/prepare-element-install");
|
|
45
|
+
const prerendered_scene_info_1 = require("./routes/prerendered-scene-info");
|
|
45
46
|
const project_info_1 = require("./routes/project-info");
|
|
46
47
|
const redo_1 = require("./routes/redo");
|
|
47
48
|
const register_client_render_1 = require("./routes/register-client-render");
|
|
@@ -55,6 +56,7 @@ const reorder_effect_1 = require("./routes/reorder-effect");
|
|
|
55
56
|
const reorder_sequence_1 = require("./routes/reorder-sequence");
|
|
56
57
|
const replace_video_source_1 = require("./routes/replace-video-source");
|
|
57
58
|
const restart_studio_1 = require("./routes/restart-studio");
|
|
59
|
+
const restore_prerendered_scene_1 = require("./routes/restore-prerendered-scene");
|
|
58
60
|
const save_effect_props_1 = require("./routes/save-effect-props");
|
|
59
61
|
const save_multiple_effect_props_1 = require("./routes/save-multiple-effect-props");
|
|
60
62
|
const save_sequence_props_1 = require("./routes/save-sequence-props");
|
|
@@ -141,6 +143,8 @@ exports.allApiRoutes = {
|
|
|
141
143
|
'/api/split-video-from-audio': split_video_from_audio_1.splitVideoFromAudioHandler,
|
|
142
144
|
'/api/insert-basic-captions': insert_basic_captions_1.insertBasicCaptionsHandler,
|
|
143
145
|
'/api/replace-video-source': replace_video_source_1.replaceVideoSourceHandler,
|
|
146
|
+
'/api/prerendered-scene-info': prerendered_scene_info_1.prerenderedSceneInfoHandler,
|
|
147
|
+
'/api/restore-prerendered-scene': restore_prerendered_scene_1.restorePrerenderedSceneHandler,
|
|
144
148
|
'/api/update-available': update_available_1.handleUpdate,
|
|
145
149
|
'/api/release-notes': release_notes_1.getReleaseNotesHandler,
|
|
146
150
|
'/api/remotion-skills-info': remotion_skills_info_1.remotionSkillsInfoHandler,
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CodemodProject, NodeReference } from '@remotion/codemods';
|
|
2
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
3
|
+
import type { SequenceNodePathRemapping } from '@remotion/studio-shared';
|
|
4
|
+
import type { SequenceNodePath } from 'remotion';
|
|
5
|
+
import { type UndoEntryType } from './undo-stack';
|
|
6
|
+
export declare const commitNodeCodemod: <Result extends {
|
|
7
|
+
changes: {
|
|
8
|
+
nextContents: string | null;
|
|
9
|
+
}[];
|
|
10
|
+
nodePathRemappings: SequenceNodePathRemapping[];
|
|
11
|
+
logLine: number;
|
|
12
|
+
}>({ remotionRoot, logLevel, fileName, nodePath, codemod, label, entryType, }: {
|
|
13
|
+
remotionRoot: string;
|
|
14
|
+
logLevel: LogLevel;
|
|
15
|
+
fileName: string;
|
|
16
|
+
nodePath: SequenceNodePath;
|
|
17
|
+
codemod: (options: {
|
|
18
|
+
project: CodemodProject;
|
|
19
|
+
node: NodeReference;
|
|
20
|
+
}) => Result;
|
|
21
|
+
label: string;
|
|
22
|
+
entryType: UndoEntryType;
|
|
23
|
+
}) => Promise<{
|
|
24
|
+
absolutePath: string;
|
|
25
|
+
nodePathMutation: import("@remotion/studio-shared").SequenceNodePathMutation;
|
|
26
|
+
result: Result;
|
|
27
|
+
}>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.commitNodeCodemod = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const renderer_1 = require("@remotion/renderer");
|
|
6
|
+
const file_watcher_1 = require("../file-watcher");
|
|
7
|
+
const resolve_file_inside_project_1 = require("../helpers/resolve-file-inside-project");
|
|
8
|
+
const format_log_file_location_1 = require("./format-log-file-location");
|
|
9
|
+
const source_file_write_queue_1 = require("./routes/source-file-write-queue");
|
|
10
|
+
const sequence_node_path_mutation_1 = require("./sequence-node-path-mutation");
|
|
11
|
+
const undo_stack_1 = require("./undo-stack");
|
|
12
|
+
const commitNodeCodemod = ({ remotionRoot, logLevel, fileName, nodePath, codemod, label, entryType, }) => (0, source_file_write_queue_1.withSourceFileWriteQueue)(() => {
|
|
13
|
+
var _a;
|
|
14
|
+
var _b;
|
|
15
|
+
const { absolutePath } = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
|
|
16
|
+
remotionRoot,
|
|
17
|
+
fileName,
|
|
18
|
+
action: 'modify',
|
|
19
|
+
});
|
|
20
|
+
const fileContents = (0, node_fs_1.readFileSync)(absolutePath, 'utf-8');
|
|
21
|
+
const result = codemod({
|
|
22
|
+
project: {
|
|
23
|
+
files: { [absolutePath]: fileContents },
|
|
24
|
+
rootDir: remotionRoot,
|
|
25
|
+
},
|
|
26
|
+
node: { filePath: absolutePath, nodePath },
|
|
27
|
+
});
|
|
28
|
+
const output = (_b = (_a = result.changes[0]) === null || _a === void 0 ? void 0 : _a.nextContents) !== null && _b !== void 0 ? _b : fileContents;
|
|
29
|
+
const { logLine } = result;
|
|
30
|
+
const nodePathRemappings = result.nodePathRemappings.map(({ oldNodePath, newNodePath, oldJsxName, newJsxName }) => ({
|
|
31
|
+
oldNodePath,
|
|
32
|
+
newNodePath,
|
|
33
|
+
oldJsxName,
|
|
34
|
+
newJsxName,
|
|
35
|
+
}));
|
|
36
|
+
const nodePathMutation = (0, sequence_node_path_mutation_1.broadcastSequenceNodePathMutation)([{ absolutePath, remappings: nodePathRemappings }], null);
|
|
37
|
+
(0, undo_stack_1.pushToUndoStack)({
|
|
38
|
+
filePath: absolutePath,
|
|
39
|
+
oldContents: fileContents,
|
|
40
|
+
newContents: output,
|
|
41
|
+
logLevel,
|
|
42
|
+
remotionRoot,
|
|
43
|
+
logLine,
|
|
44
|
+
description: {
|
|
45
|
+
undoMessage: `↩️ ${label}`,
|
|
46
|
+
redoMessage: `↪️ ${label}`,
|
|
47
|
+
},
|
|
48
|
+
entryType,
|
|
49
|
+
suppressHmrOnFileRestore: false,
|
|
50
|
+
nodePathRemappings,
|
|
51
|
+
});
|
|
52
|
+
(0, undo_stack_1.suppressUndoStackInvalidation)(absolutePath);
|
|
53
|
+
(0, file_watcher_1.writeFileAndNotifyFileWatchers)({
|
|
54
|
+
file: absolutePath,
|
|
55
|
+
content: output,
|
|
56
|
+
originatorClientId: undefined,
|
|
57
|
+
metadata: { skipSequencePropsUpdate: true },
|
|
58
|
+
});
|
|
59
|
+
const locationLabel = (0, format_log_file_location_1.formatLogFileLocation)({
|
|
60
|
+
remotionRoot,
|
|
61
|
+
absolutePath,
|
|
62
|
+
line: logLine,
|
|
63
|
+
});
|
|
64
|
+
renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `${(0, source_file_write_queue_1.getCodemodTimingPrefix)(logLevel)}${renderer_1.RenderInternals.chalk.blueBright(locationLabel)} ${label}`);
|
|
65
|
+
(0, undo_stack_1.printUndoHint)(logLevel);
|
|
66
|
+
return { absolutePath, nodePathMutation, result };
|
|
67
|
+
});
|
|
68
|
+
exports.commitNodeCodemod = commitNodeCodemod;
|
|
@@ -8,8 +8,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
8
8
|
exports.setupWebpackHmr = void 0;
|
|
9
9
|
const renderer_1 = require("@remotion/renderer");
|
|
10
10
|
const hmr_timing_1 = require("../hmr-timing");
|
|
11
|
+
const sequence_node_path_mutation_build_1 = require("../sequence-node-path-mutation-build");
|
|
11
12
|
const setupWebpackHmr = (compiler, logLevel, liveEventsServer) => {
|
|
12
|
-
let
|
|
13
|
+
let latestBuild = null;
|
|
14
|
+
const getSourceMutationId = (0, sequence_node_path_mutation_build_1.trackSequenceNodePathMutationBuilds)(compiler);
|
|
13
15
|
const publishHmr = (hmrEvent) => {
|
|
14
16
|
liveEventsServer.sendEventToClient({ type: 'hmr', hmrEvent });
|
|
15
17
|
};
|
|
@@ -24,7 +26,7 @@ const setupWebpackHmr = (compiler, logLevel, liveEventsServer) => {
|
|
|
24
26
|
logLevel,
|
|
25
27
|
stage: 'compiler-invalid',
|
|
26
28
|
});
|
|
27
|
-
|
|
29
|
+
latestBuild = null;
|
|
28
30
|
renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, 'Building...');
|
|
29
31
|
publishHmr({
|
|
30
32
|
action: 'building',
|
|
@@ -36,19 +38,20 @@ const setupWebpackHmr = (compiler, logLevel, liveEventsServer) => {
|
|
|
36
38
|
logLevel,
|
|
37
39
|
stage: 'compiler-done',
|
|
38
40
|
});
|
|
41
|
+
const sourceMutationId = getSourceMutationId(statsResult);
|
|
39
42
|
// Keep hold of latest stats so they can be propagated to new clients
|
|
40
|
-
|
|
41
|
-
publishStats('built',
|
|
43
|
+
latestBuild = { stats: statsResult, sourceMutationId };
|
|
44
|
+
publishStats('built', statsResult, sourceMutationId, publishHmr);
|
|
42
45
|
(0, hmr_timing_1.logHmrTiming)({ detail: null, logLevel, stage: 'hmr-stats-published' });
|
|
43
46
|
}
|
|
44
47
|
liveEventsServer.addNewClientListener(() => {
|
|
45
|
-
if (
|
|
46
|
-
publishStats('sync',
|
|
48
|
+
if (latestBuild) {
|
|
49
|
+
publishStats('sync', latestBuild.stats, latestBuild.sourceMutationId, publishHmr);
|
|
47
50
|
}
|
|
48
51
|
});
|
|
49
52
|
};
|
|
50
53
|
exports.setupWebpackHmr = setupWebpackHmr;
|
|
51
|
-
function publishStats(action, statsResult, publishHmr) {
|
|
54
|
+
function publishStats(action, statsResult, sourceMutationId, publishHmr) {
|
|
52
55
|
var _a;
|
|
53
56
|
// Studio uses a single compiler. Child compilations must not replace the
|
|
54
57
|
// parent compilation's hash in the HMR message.
|
|
@@ -57,6 +60,7 @@ function publishStats(action, statsResult, publishHmr) {
|
|
|
57
60
|
action,
|
|
58
61
|
time: statsResult.endTime - statsResult.startTime,
|
|
59
62
|
hash: statsResult.hash,
|
|
63
|
+
sourceMutationId,
|
|
60
64
|
// Build diagnostics are printed by the dev middleware.
|
|
61
65
|
warnings: [],
|
|
62
66
|
errors: [],
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.setLiveEventsListener = exports.getLiveEventsListener = exports.waitForLiveEventsListener = exports.makeLiveEventsRouter = exports.clearPrintPortMessageTimeout = exports.subscribeToConfigChanges = void 0;
|
|
4
|
+
const file_watcher_1 = require("../file-watcher");
|
|
4
5
|
const server_ready_1 = require("../server-ready");
|
|
5
6
|
const default_props_watchers_1 = require("./default-props-watchers");
|
|
6
7
|
const file_existence_watchers_1 = require("./file-existence-watchers");
|
|
@@ -41,7 +42,13 @@ const makeLiveEventsRouter = (logLevel, getInitialUndoRedoState) => {
|
|
|
41
42
|
}
|
|
42
43
|
const clientId = String(Math.random());
|
|
43
44
|
const { undoFile, redoFile } = getInitialUndoRedoState();
|
|
44
|
-
response.write(serializeMessage({
|
|
45
|
+
response.write(serializeMessage({
|
|
46
|
+
type: 'init',
|
|
47
|
+
clientId,
|
|
48
|
+
undoFile,
|
|
49
|
+
redoFile,
|
|
50
|
+
sourceVersionSessionId: (0, file_watcher_1.getSourceVersionSessionId)(),
|
|
51
|
+
}));
|
|
45
52
|
const newClient = {
|
|
46
53
|
id: clientId,
|
|
47
54
|
response,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
2
|
+
import type { SequenceNodePath } from 'remotion';
|
|
3
|
+
type PrerenderedSceneSidecar = {
|
|
4
|
+
compositionId: string;
|
|
5
|
+
source: string;
|
|
6
|
+
importStatements: string[];
|
|
7
|
+
sceneFile: string | null;
|
|
8
|
+
sceneFileHash: string | null;
|
|
9
|
+
};
|
|
10
|
+
export declare const getPrerenderedSceneSidecarFile: (videoFile: string) => string;
|
|
11
|
+
export declare const readPrerenderedSceneSidecar: ({ publicDir, src, }: {
|
|
12
|
+
publicDir: string;
|
|
13
|
+
src: string;
|
|
14
|
+
}) => PrerenderedSceneSidecar | null;
|
|
15
|
+
export declare const hashSceneFile: (file: string) => string;
|
|
16
|
+
export declare const replaceWithPrerenderedVideo: ({ remotionRoot, logLevel, fileName, nodePath, src, videoFile, compositionId, }: {
|
|
17
|
+
remotionRoot: string;
|
|
18
|
+
logLevel: LogLevel;
|
|
19
|
+
fileName: string;
|
|
20
|
+
nodePath: SequenceNodePath;
|
|
21
|
+
src: string;
|
|
22
|
+
videoFile: string;
|
|
23
|
+
compositionId: string;
|
|
24
|
+
}) => Promise<void>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
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.replaceWithPrerenderedVideo = exports.hashSceneFile = exports.readPrerenderedSceneSidecar = exports.getPrerenderedSceneSidecarFile = void 0;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const codemods_1 = require("@remotion/codemods");
|
|
11
|
+
const commit_node_codemod_1 = require("./commit-node-codemod");
|
|
12
|
+
const getPrerenderedSceneSidecarFile = (videoFile) => `${videoFile}.json`;
|
|
13
|
+
exports.getPrerenderedSceneSidecarFile = getPrerenderedSceneSidecarFile;
|
|
14
|
+
const readPrerenderedSceneSidecar = ({ publicDir, src, }) => {
|
|
15
|
+
const videoFile = node_path_1.default.resolve(publicDir, src);
|
|
16
|
+
const relativeToPublicDir = node_path_1.default.relative(publicDir, videoFile);
|
|
17
|
+
if (relativeToPublicDir.startsWith('..') ||
|
|
18
|
+
node_path_1.default.isAbsolute(relativeToPublicDir)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const sidecarFile = (0, exports.getPrerenderedSceneSidecarFile)(videoFile);
|
|
22
|
+
if (!(0, node_fs_1.existsSync)(sidecarFile)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse((0, node_fs_1.readFileSync)(sidecarFile, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
catch (_a) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
exports.readPrerenderedSceneSidecar = readPrerenderedSceneSidecar;
|
|
33
|
+
const hashSceneFile = (file) => (0, node_crypto_1.createHash)('sha256')
|
|
34
|
+
.update((0, node_fs_1.readFileSync)(file, 'utf-8'))
|
|
35
|
+
.digest('hex')
|
|
36
|
+
.slice(0, 16);
|
|
37
|
+
exports.hashSceneFile = hashSceneFile;
|
|
38
|
+
const resolveSceneFile = (importingFile, importSource) => {
|
|
39
|
+
var _a;
|
|
40
|
+
if (!importSource.startsWith('.')) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const base = node_path_1.default.resolve(node_path_1.default.dirname(importingFile), importSource);
|
|
44
|
+
const extensions = ['.tsx', '.ts', '.jsx', '.js', '.mjs'];
|
|
45
|
+
return ((_a = [
|
|
46
|
+
base,
|
|
47
|
+
...extensions.map((extension) => base + extension),
|
|
48
|
+
...extensions.map((extension) => node_path_1.default.join(base, `index${extension}`)),
|
|
49
|
+
].find((file) => (0, node_fs_1.existsSync)(file) && (0, node_fs_1.statSync)(file).isFile())) !== null && _a !== void 0 ? _a : null);
|
|
50
|
+
};
|
|
51
|
+
const replaceWithPrerenderedVideo = async ({ remotionRoot, logLevel, fileName, nodePath, src, videoFile, compositionId, }) => {
|
|
52
|
+
const { absolutePath, result } = await (0, commit_node_codemod_1.commitNodeCodemod)({
|
|
53
|
+
remotionRoot,
|
|
54
|
+
logLevel,
|
|
55
|
+
fileName,
|
|
56
|
+
nodePath,
|
|
57
|
+
codemod: ({ project, node }) => codemods_1.CodemodsInternals.replaceNodeChild({
|
|
58
|
+
project,
|
|
59
|
+
node,
|
|
60
|
+
element: (0, codemods_1.createElement)({
|
|
61
|
+
component: 'Video',
|
|
62
|
+
importPath: '@remotion/media',
|
|
63
|
+
props: { src: (0, codemods_1.staticFileValue)(src) },
|
|
64
|
+
}),
|
|
65
|
+
}),
|
|
66
|
+
label: 'Rendered and replaced scene',
|
|
67
|
+
entryType: 'prerender',
|
|
68
|
+
});
|
|
69
|
+
const sceneFile = result.sceneImportSource === null
|
|
70
|
+
? null
|
|
71
|
+
: resolveSceneFile(absolutePath, result.sceneImportSource);
|
|
72
|
+
const sidecar = {
|
|
73
|
+
compositionId,
|
|
74
|
+
source: result.replacedSource,
|
|
75
|
+
importStatements: result.replacedImports,
|
|
76
|
+
sceneFile: sceneFile === null
|
|
77
|
+
? null
|
|
78
|
+
: node_path_1.default.relative(remotionRoot, sceneFile).split(node_path_1.default.sep).join('/'),
|
|
79
|
+
sceneFileHash: sceneFile === null ? null : (0, exports.hashSceneFile)(sceneFile),
|
|
80
|
+
};
|
|
81
|
+
// Written atomically so that a partially written sidecar is never read
|
|
82
|
+
const sidecarFile = (0, exports.getPrerenderedSceneSidecarFile)(videoFile);
|
|
83
|
+
(0, node_fs_1.writeFileSync)(`${sidecarFile}.tmp`, JSON.stringify(sidecar, null, 2) + '\n');
|
|
84
|
+
(0, node_fs_1.renameSync)(`${sidecarFile}.tmp`, sidecarFile);
|
|
85
|
+
};
|
|
86
|
+
exports.replaceWithPrerenderedVideo = replaceWithPrerenderedVideo;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SequenceNodePath } from 'remotion';
|
|
2
|
+
export declare const resolveCompiledSequencePaths: ({ fileName, remotionRoot, fileContentsCache, targets, }: {
|
|
3
|
+
fileName: string;
|
|
4
|
+
remotionRoot: string;
|
|
5
|
+
fileContentsCache: Map<string, string>;
|
|
6
|
+
targets: {
|
|
7
|
+
index: number;
|
|
8
|
+
hash: string;
|
|
9
|
+
line: number;
|
|
10
|
+
column: number;
|
|
11
|
+
}[];
|
|
12
|
+
}) => Map<number, SequenceNodePath | null>;
|