@remotion/studio-server 4.0.528 → 4.0.530

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/codemods/add-composition-to-file.d.ts +7 -0
  2. package/dist/codemods/add-composition-to-file.js +63 -0
  3. package/dist/codemods/apply-codemod-to-file.js +6 -1
  4. package/dist/codemods/effect-param-expression.d.ts +1 -1
  5. package/dist/codemods/effect-param-expression.js +3 -2
  6. package/dist/codemods/update-keyframes/update-keyframes.d.ts +3 -3
  7. package/dist/codemods/update-keyframes/update-keyframes.js +1 -1
  8. package/dist/codemods/update-sequence-props/update-sequence-props.js +1 -1
  9. package/dist/helpers/get-local-package-override.d.ts +5 -0
  10. package/dist/helpers/get-local-package-override.js +39 -0
  11. package/dist/helpers/resolve-composition-component.d.ts +2 -1
  12. package/dist/helpers/resolve-composition-component.js +66 -15
  13. package/dist/index.d.ts +5 -0
  14. package/dist/index.js +3 -0
  15. package/dist/preview-server/api-routes.js +32 -12
  16. package/dist/preview-server/element-install-state.js +10 -2
  17. package/dist/preview-server/routes/add-composition.d.ts +3 -0
  18. package/dist/preview-server/routes/add-composition.js +97 -0
  19. package/dist/preview-server/routes/add-folder.d.ts +3 -0
  20. package/dist/preview-server/routes/add-folder.js +107 -0
  21. package/dist/preview-server/routes/add-keyframes.d.ts +2 -2
  22. package/dist/preview-server/routes/add-keyframes.js +49 -6
  23. package/dist/preview-server/routes/can-update-sequence-props.js +40 -11
  24. package/dist/preview-server/routes/delete-composition.d.ts +3 -0
  25. package/dist/preview-server/routes/delete-composition.js +104 -0
  26. package/dist/preview-server/routes/delete-nodes.d.ts +3 -0
  27. package/dist/preview-server/routes/delete-nodes.js +142 -0
  28. package/dist/preview-server/routes/duplicate-composition.d.ts +3 -0
  29. package/dist/preview-server/routes/duplicate-composition.js +114 -0
  30. package/dist/preview-server/routes/duplicate-nodes.d.ts +3 -0
  31. package/dist/preview-server/routes/duplicate-nodes.js +123 -0
  32. package/dist/preview-server/routes/insert-basic-captions.js +2 -1
  33. package/dist/preview-server/routes/insert-composition-element.d.ts +3 -0
  34. package/dist/preview-server/routes/insert-composition-element.js +236 -0
  35. package/dist/preview-server/routes/insert-element.js +26 -19
  36. package/dist/preview-server/routes/install-dependency.js +10 -1
  37. package/dist/preview-server/routes/move-composition.d.ts +3 -0
  38. package/dist/preview-server/routes/move-composition.js +148 -0
  39. package/dist/preview-server/routes/move-folder.d.ts +3 -0
  40. package/dist/preview-server/routes/move-folder.js +151 -0
  41. package/dist/preview-server/routes/precompose-jsx-nodes.d.ts +3 -0
  42. package/dist/preview-server/routes/precompose-jsx-nodes.js +209 -0
  43. package/dist/preview-server/routes/rename-composition.d.ts +3 -0
  44. package/dist/preview-server/routes/rename-composition.js +105 -0
  45. package/dist/preview-server/routes/rename-folder.d.ts +3 -0
  46. package/dist/preview-server/routes/rename-folder.js +111 -0
  47. package/dist/preview-server/routes/reorder-sequence.js +7 -2
  48. package/dist/preview-server/routes/replace-video-source.js +7 -2
  49. package/dist/preview-server/routes/save-sequence-props.js +6 -3
  50. package/dist/preview-server/routes/split-sequences.d.ts +3 -0
  51. package/dist/preview-server/routes/split-sequences.js +122 -0
  52. package/dist/preview-server/routes/split-video-from-audio.js +6 -1
  53. package/dist/preview-server/routes/unwrap-folder.d.ts +3 -0
  54. package/dist/preview-server/routes/unwrap-folder.js +107 -0
  55. package/dist/preview-server/routes/update-composition-metadata.d.ts +3 -0
  56. package/dist/preview-server/routes/update-composition-metadata.js +110 -0
  57. package/dist/preview-server/routes/wrap-node.d.ts +3 -0
  58. package/dist/preview-server/routes/wrap-node.js +108 -0
  59. package/dist/preview-server/studio-protocol/handle-discovery.js +3 -10
  60. package/dist/preview-server/studio-protocol/handle-install.js +0 -3
  61. package/dist/preview-server/undo-stack.d.ts +1 -1
  62. package/dist/preview-server/undo-stack.js +6 -0
  63. package/dist/start-studio.js +1 -1
  64. package/package.json +8 -8
@@ -0,0 +1,7 @@
1
+ import { type CodemodResult } from '@remotion/codemods';
2
+ import type { NewCompositionOptions } from '@remotion/studio-shared';
3
+ export declare const addCompositionToFile: ({ filePath, options, remotionRoot, }: {
4
+ filePath: string;
5
+ options: NewCompositionOptions;
6
+ remotionRoot: string;
7
+ }) => Promise<CodemodResult>;
@@ -0,0 +1,63 @@
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.addCompositionToFile = void 0;
7
+ const node_fs_1 = require("node:fs");
8
+ const promises_1 = require("node:fs/promises");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const codemods_1 = require("@remotion/codemods");
11
+ const studio_shared_1 = require("@remotion/studio-shared");
12
+ const can_update_default_props_1 = require("../preview-server/routes/can-update-default-props");
13
+ const addCompositionToFile = async ({ filePath, options, remotionRoot, }) => {
14
+ (0, can_update_default_props_1.checkIfTypeScriptFile)(filePath);
15
+ const input = await (0, promises_1.readFile)(filePath, 'utf-8');
16
+ const componentFilePath = node_path_1.default.join(node_path_1.default.dirname(filePath), `${options.componentName}.tsx`);
17
+ if ((0, node_fs_1.existsSync)(componentFilePath)) {
18
+ throw new Error(`Cannot create ${node_path_1.default.relative(remotionRoot, componentFilePath)} because it already exists`);
19
+ }
20
+ const composition = {
21
+ project: { files: { [filePath]: input }, rootDir: node_path_1.default.dirname(filePath) },
22
+ compositionFile: filePath,
23
+ compositionId: options.newId,
24
+ component: {
25
+ filePath: componentFilePath,
26
+ importName: options.componentName,
27
+ importPath: options.componentImportPath,
28
+ },
29
+ metadata: {
30
+ width: options.newWidth,
31
+ height: options.newHeight,
32
+ fps: options.newFps,
33
+ durationInFrames: options.newDurationInFrames,
34
+ },
35
+ folder: options.folderName === null
36
+ ? undefined
37
+ : { name: options.folderName, parentName: options.parentName },
38
+ };
39
+ if (options.canvasCapture !== null) {
40
+ return (0, codemods_1.addCanvasCaptureComposition)({
41
+ ...composition,
42
+ capture: options.canvasCapture,
43
+ });
44
+ }
45
+ const result = (0, codemods_1.addComposition)(composition);
46
+ return {
47
+ ...result,
48
+ changes: [
49
+ ...result.changes,
50
+ {
51
+ filePath: componentFilePath,
52
+ previousContents: null,
53
+ nextContents: options.asset === null
54
+ ? (0, studio_shared_1.emptyCompositionComponent)(options.componentName)
55
+ : (0, studio_shared_1.assetCompositionComponent)({
56
+ asset: options.asset,
57
+ componentName: options.componentName,
58
+ }),
59
+ },
60
+ ],
61
+ };
62
+ };
63
+ exports.addCompositionToFile = addCompositionToFile;
@@ -78,7 +78,12 @@ const applyCodemodToFile = async ({ filePath, codeMod, }) => {
78
78
  {
79
79
  filePath: componentFilePath,
80
80
  previousContents: null,
81
- nextContents: (0, studio_shared_1.emptyCompositionComponent)(codeMod.componentName),
81
+ nextContents: codeMod.asset === null
82
+ ? (0, studio_shared_1.emptyCompositionComponent)(codeMod.componentName)
83
+ : (0, studio_shared_1.assetCompositionComponent)({
84
+ asset: codeMod.asset,
85
+ componentName: codeMod.componentName,
86
+ }),
82
87
  },
83
88
  ],
84
89
  };
@@ -1,7 +1,7 @@
1
1
  import type { File } from '@babel/types';
2
2
  import type { EffectClipboardParam, EffectClipboardSnapshot } from '@remotion/studio-shared';
3
3
  import type { ExpressionKind } from 'ast-types/lib/gen/kinds';
4
- export type RemotionImportName = 'Easing' | 'interpolate' | 'interpolateColors' | 'useCurrentFrame';
4
+ export type RemotionImportName = 'Easing' | 'interpolate' | 'interpolateColors' | 'interpolatePaths' | 'useCurrentFrame';
5
5
  export type RemotionLocalNames = Partial<Record<RemotionImportName, string>>;
6
6
  export declare const getRequiredRemotionImportsForEffectParams: (params: Iterable<EffectClipboardParam>) => Set<RemotionImportName>;
7
7
  export declare const getRequiredRemotionImports: (effects: EffectClipboardSnapshot[]) => Set<RemotionImportName>;
@@ -65,7 +65,7 @@ const ensureRemotionImportLocalNames = ({ ast, requiredImports, }) => {
65
65
  localNames[importedName] = (0, imports_1.ensureNamedImport)({
66
66
  ast,
67
67
  importedName,
68
- sourcePath: 'remotion',
68
+ sourcePath: importedName === 'interpolatePaths' ? '@remotion/paths' : 'remotion',
69
69
  localName: importedName,
70
70
  });
71
71
  }
@@ -113,7 +113,8 @@ const makeKeyframedOptions = ({ param, remotionLocalNames, }) => {
113
113
  if (param.clamping.right !== 'extend') {
114
114
  properties.push(b.objectProperty(b.identifier('extrapolateRight'), b.stringLiteral(param.clamping.right)));
115
115
  }
116
- if (param.output === 'perceptual-scale') {
116
+ if (param.interpolationFunction === 'interpolate' &&
117
+ param.output === 'perceptual-scale') {
117
118
  properties.push(b.objectProperty(b.identifier('output'), b.stringLiteral(param.output)));
118
119
  }
119
120
  }
@@ -12,13 +12,13 @@ export declare const updateSequenceKeyframes: ({ input, nodePath, videoConfigVal
12
12
  nodePath: SequenceNodePath;
13
13
  }) => Promise<{
14
14
  changes: import("@remotion/codemods").CodemodFileChange[];
15
- nodePathRemappings: import("@remotion/codemods").JsxNodePathRemapping[];
15
+ nodePathRemappings: import("@remotion/codemods").NodePathRemapping[];
16
16
  formatted: boolean;
17
17
  oldValueStrings: string[];
18
18
  newValueStrings: string[];
19
19
  logLine: number;
20
20
  updatedNodePath: SequenceNodePath;
21
- updatedNode: import("@remotion/codemods").JsxNodeReference;
21
+ updatedNode: import("@remotion/codemods").NodeReference;
22
22
  output: string;
23
23
  }>;
24
24
  export declare const updateEffectKeyframes: ({ input, sequenceNodePath, effectIndex, videoConfigValues, ...options }: KeyframeInput & {
@@ -26,7 +26,7 @@ export declare const updateEffectKeyframes: ({ input, sequenceNodePath, effectIn
26
26
  effectIndex: number;
27
27
  }) => Promise<{
28
28
  changes: import("@remotion/codemods").CodemodFileChange[];
29
- nodePathRemappings: import("@remotion/codemods").JsxNodePathRemapping[];
29
+ nodePathRemappings: import("@remotion/codemods").NodePathRemapping[];
30
30
  formatted: boolean;
31
31
  oldValueStrings: string[];
32
32
  newValueStrings: string[];
@@ -5,7 +5,7 @@ const codemods_1 = require("@remotion/codemods");
5
5
  const updateSequenceKeyframes = async ({ input, nodePath, videoConfigValues, ...options }) => {
6
6
  var _a;
7
7
  var _b;
8
- const result = await (0, codemods_1.updateJsxNodeKeyframes)({
8
+ const result = await (0, codemods_1.updateNodeKeyframes)({
9
9
  project: { files: { 'source.tsx': input }, rootDir: '/' },
10
10
  node: { filePath: 'source.tsx', nodePath },
11
11
  videoConfig: videoConfigValues !== null && videoConfigValues !== void 0 ? videoConfigValues : undefined,
@@ -6,7 +6,7 @@ const updateMultipleSequenceProps = ({ input, changes, prettierConfigOverride, }
6
6
  return Promise.resolve().then(() => {
7
7
  var _a;
8
8
  var _b;
9
- const result = (0, codemods_1.updateMultipleJsxNodeProps)({
9
+ const result = (0, codemods_1.updateMultipleNodeProps)({
10
10
  project: { files: { 'source.tsx': input }, rootDir: '/' },
11
11
  changes: changes.map(({ nodePath, updates, schema, videoConfigValues }) => ({
12
12
  node: { filePath: 'source.tsx', nodePath },
@@ -0,0 +1,5 @@
1
+ export declare const localPackageRootKey = "_remotionInternalPackageRoot";
2
+ export declare const getLocalPackageOverride: ({ remotionRoot, packageName, }: {
3
+ remotionRoot: string;
4
+ packageName: string;
5
+ }) => string | null;
@@ -0,0 +1,39 @@
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.getLocalPackageOverride = exports.localPackageRootKey = void 0;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_url_1 = require("node:url");
10
+ exports.localPackageRootKey = '_remotionInternalPackageRoot';
11
+ const getLocalPackageOverride = ({ remotionRoot, packageName, }) => {
12
+ const packageJsonPath = node_path_1.default.join(remotionRoot, 'package.json');
13
+ if (!node_fs_1.default.existsSync(packageJsonPath)) {
14
+ return null;
15
+ }
16
+ const packageJson = JSON.parse(node_fs_1.default.readFileSync(packageJsonPath, 'utf-8'));
17
+ const localPackageRoot = packageJson[exports.localPackageRootKey];
18
+ if (typeof localPackageRoot !== 'string') {
19
+ return null;
20
+ }
21
+ const packagesRoot = node_path_1.default.join(localPackageRoot, 'packages');
22
+ if (!node_fs_1.default.existsSync(packagesRoot)) {
23
+ return null;
24
+ }
25
+ for (const directory of node_fs_1.default.readdirSync(packagesRoot)) {
26
+ const packageDirectory = node_path_1.default.join(packagesRoot, directory);
27
+ const candidatePackageJsonPath = node_path_1.default.join(packageDirectory, 'package.json');
28
+ if (!node_fs_1.default.existsSync(candidatePackageJsonPath)) {
29
+ continue;
30
+ }
31
+ const candidatePackageJson = JSON.parse(node_fs_1.default.readFileSync(candidatePackageJsonPath, 'utf-8'));
32
+ if (candidatePackageJson.name === packageName &&
33
+ !candidatePackageJson.private) {
34
+ return (0, node_url_1.pathToFileURL)(packageDirectory).href;
35
+ }
36
+ }
37
+ return null;
38
+ };
39
+ exports.getLocalPackageOverride = getLocalPackageOverride;
@@ -12,12 +12,13 @@ export declare const resolveCompositionComponent: ({ remotionRoot, compositionFi
12
12
  compositionFile: string;
13
13
  compositionId: string;
14
14
  }) => Promise<ResolvedCompositionComponent>;
15
- export declare const insertJsxElementIntoComposition: ({ remotionRoot, compositionFile, compositionId, element, from, prettierConfigOverride, wrapInSequence, sourceFileOverrides, }: {
15
+ export declare const insertJsxElementIntoComposition: ({ remotionRoot, compositionFile, compositionId, element, from, premountFor, prettierConfigOverride, wrapInSequence, sourceFileOverrides, }: {
16
16
  remotionRoot: string;
17
17
  compositionFile: string;
18
18
  compositionId: string;
19
19
  element: InsertableCompositionElement;
20
20
  from: number | null;
21
+ premountFor: number | null;
21
22
  prettierConfigOverride: Record<string, unknown> | null;
22
23
  wrapInSequence?: {
23
24
  dimensions: {
@@ -8,7 +8,7 @@ const node_fs_1 = __importDefault(require("node:fs"));
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const codemods_1 = require("@remotion/codemods");
10
10
  const svg_to_jsx_1 = require("./svg-to-jsx");
11
- const { insertJsxElementIntoComposition: insertJsxElementIntoCompositionCodemod, resolveCompositionComponent: resolveCompositionComponentCodemod, resolveCompositionComponentWithFile: resolveCompositionComponentWithFileCodemod, } = codemods_1.CodemodsInternals;
11
+ const { createElementFromInsertable, insertJsxElementIntoComposition: insertJsxElementIntoCompositionCodemod, resolveCompositionComponent: resolveCompositionComponentCodemod, resolveCompositionComponentWithFile: resolveCompositionComponentWithFileCodemod, } = codemods_1.CodemodsInternals;
12
12
  const makeCodemodEnvironment = (remotionRoot, sourceFileOverrides) => ({
13
13
  dirname: node_path_1.default.dirname,
14
14
  extname: node_path_1.default.extname,
@@ -40,24 +40,75 @@ const resolveCompositionComponent = ({ remotionRoot, compositionFile, compositio
40
40
  environment: makeCodemodEnvironment(remotionRoot, null),
41
41
  });
42
42
  exports.resolveCompositionComponent = resolveCompositionComponent;
43
- const insertJsxElementIntoComposition = ({ remotionRoot, compositionFile, compositionId, element, from, prettierConfigOverride, wrapInSequence = null, sourceFileOverrides, }) => {
43
+ const insertJsxElementIntoComposition = async ({ remotionRoot, compositionFile, compositionId, element, from, premountFor, prettierConfigOverride, wrapInSequence = null, sourceFileOverrides, }) => {
44
44
  var _a;
45
- return insertJsxElementIntoCompositionCodemod({
46
- compositionFile,
47
- compositionId,
45
+ var _b, _c;
46
+ const environment = makeCodemodEnvironment(remotionRoot, sourceFileOverrides);
47
+ const sequence = wrapInSequence === null
48
+ ? null
49
+ : {
50
+ dimensions: wrapInSequence.dimensions,
51
+ durationInFrames: (_b = wrapInSequence.durationInFrames) !== null && _b !== void 0 ? _b : null,
52
+ from: wrapInSequence.from,
53
+ name: wrapInSequence.name,
54
+ position: wrapInSequence.position,
55
+ };
56
+ // SVG markup and compositions need the file-system aware pipeline.
57
+ if (element.type === 'svg' || element.type === 'composition') {
58
+ return insertJsxElementIntoCompositionCodemod({
59
+ compositionFile,
60
+ compositionId,
61
+ element,
62
+ environment,
63
+ from,
64
+ premountFor,
65
+ prettierConfigOverride,
66
+ wrapInSequence: sequence,
67
+ });
68
+ }
69
+ const codemodElement = createElementFromInsertable({
48
70
  element,
49
- environment: makeCodemodEnvironment(remotionRoot, sourceFileOverrides),
50
71
  from,
72
+ premountFor,
73
+ wrapInSequence: sequence,
74
+ });
75
+ const location = await resolveCompositionComponentWithFileCodemod({
76
+ compositionFile,
77
+ compositionId,
78
+ environment,
79
+ });
80
+ if (!location.canAddSequence) {
81
+ throw new Error('Cannot insert JSX element into this composition component');
82
+ }
83
+ const oldContents = await environment.readFile(location.fileName);
84
+ const project = {
85
+ rootDir: remotionRoot,
86
+ files: { [location.fileName]: oldContents },
87
+ };
88
+ const result = (0, codemods_1.addElement)({
89
+ project,
90
+ element: codemodElement,
91
+ target: {
92
+ type: 'component',
93
+ filePath: location.fileName,
94
+ exportName: location.exportName,
95
+ },
51
96
  prettierConfigOverride,
52
- wrapInSequence: wrapInSequence === null
53
- ? null
54
- : {
55
- dimensions: wrapInSequence.dimensions,
56
- durationInFrames: (_a = wrapInSequence.durationInFrames) !== null && _a !== void 0 ? _a : null,
57
- from: wrapInSequence.from,
58
- name: wrapInSequence.name,
59
- position: wrapInSequence.position,
60
- },
61
97
  });
98
+ const nextProject = (0, codemods_1.applyCodemodChanges)(project, result.changes);
99
+ const insertedNode = (0, codemods_1.getNodes)({
100
+ project: nextProject,
101
+ filePath: location.fileName,
102
+ }).find((node) => JSON.stringify(node.nodePath) ===
103
+ JSON.stringify(result.insertedNode.nodePath));
104
+ return {
105
+ fileName: location.fileName,
106
+ source: location.source,
107
+ oldContents,
108
+ output: nextProject.files[location.fileName],
109
+ logLine: (_c = (_a = insertedNode === null || insertedNode === void 0 ? void 0 : insertedNode.location) === null || _a === void 0 ? void 0 : _a.line) !== null && _c !== void 0 ? _c : 1,
110
+ nodePathRemappings: result.nodePathRemappings.map(({ oldNodePath, newNodePath }) => ({ oldNodePath, newNodePath })),
111
+ insertedNodePath: result.insertedNode.nodePath,
112
+ };
62
113
  };
63
114
  exports.insertJsxElementIntoComposition = insertJsxElementIntoComposition;
package/dist/index.d.ts CHANGED
@@ -106,6 +106,11 @@ export declare const StudioServerInternals: {
106
106
  version: string;
107
107
  additionalArgs: string[];
108
108
  }) => string[];
109
+ getLocalPackageOverride: ({ remotionRoot, packageName, }: {
110
+ remotionRoot: string;
111
+ packageName: string;
112
+ }) => string | null;
113
+ localPackageRootKey: string;
109
114
  getPackageManagerSpawnOptions: () => Pick<import("child_process").SpawnOptionsWithoutStdio, "shell">;
110
115
  addCompletedClientRender: ({ render, remotionRoot, }: {
111
116
  render: import("@remotion/studio-shared").CompletedClientRender;
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "parseRemotionSkillVersion", { enumerable: true,
12
12
  const file_watcher_1 = require("./file-watcher");
13
13
  const get_latest_remotion_version_1 = require("./get-latest-remotion-version");
14
14
  const get_installed_dependencies_1 = require("./helpers/get-installed-dependencies");
15
+ const get_local_package_override_1 = require("./helpers/get-local-package-override");
15
16
  const install_command_1 = require("./helpers/install-command");
16
17
  const package_manager_spawn_options_1 = require("./helpers/package-manager-spawn-options");
17
18
  const max_timeline_tracks_1 = require("./max-timeline-tracks");
@@ -42,6 +43,8 @@ exports.StudioServerInternals = {
42
43
  getInstalledDependencies: get_installed_dependencies_1.getInstalledDependencies,
43
44
  getInstalledDependenciesWithVersions: get_installed_dependencies_1.getInstalledDependenciesWithVersions,
44
45
  getInstallCommand: install_command_1.getInstallCommand,
46
+ getLocalPackageOverride: get_local_package_override_1.getLocalPackageOverride,
47
+ localPackageRootKey: get_local_package_override_1.localPackageRootKey,
45
48
  getPackageManagerSpawnOptions: package_manager_spawn_options_1.getPackageManagerSpawnOptions,
46
49
  addCompletedClientRender: client_render_queue_1.addCompletedClientRender,
47
50
  getCompletedClientRenders: client_render_queue_1.getCompletedClientRenders,
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.allApiRoutes = void 0;
4
+ const add_composition_1 = require("./routes/add-composition");
4
5
  const add_effect_1 = require("./routes/add-effect");
5
6
  const add_effect_keyframe_1 = require("./routes/add-effect-keyframe");
7
+ const add_folder_1 = require("./routes/add-folder");
6
8
  const add_keyframes_1 = require("./routes/add-keyframes");
7
9
  const add_render_1 = require("./routes/add-render");
8
10
  const add_sequence_keyframe_1 = require("./routes/add-sequence-keyframe");
9
- const apply_codemod_1 = require("./routes/apply-codemod");
10
11
  const apply_visual_control_change_1 = require("./routes/apply-visual-control-change");
11
12
  const batch_update_keyframe_settings_1 = require("./routes/batch-update-keyframe-settings");
12
13
  const cancel_render_1 = require("./routes/cancel-render");
@@ -15,26 +16,31 @@ const convert_figma_clipboard_to_svg_1 = require("./routes/convert-figma-clipboa
15
16
  const copy_render_output_to_asset_1 = require("./routes/copy-render-output-to-asset");
16
17
  const default_coding_agent_1 = require("./routes/default-coding-agent");
17
18
  const default_editor_1 = require("./routes/default-editor");
19
+ const delete_composition_1 = require("./routes/delete-composition");
18
20
  const delete_effect_1 = require("./routes/delete-effect");
19
- const delete_jsx_nodes_1 = require("./routes/delete-jsx-nodes");
20
21
  const delete_keyframes_1 = require("./routes/delete-keyframes");
22
+ const delete_nodes_1 = require("./routes/delete-nodes");
21
23
  const delete_static_file_1 = require("./routes/delete-static-file");
22
24
  const download_remote_asset_1 = require("./routes/download-remote-asset");
25
+ const duplicate_composition_1 = require("./routes/duplicate-composition");
23
26
  const duplicate_effect_1 = require("./routes/duplicate-effect");
24
- const duplicate_jsx_node_1 = require("./routes/duplicate-jsx-node");
27
+ const duplicate_nodes_1 = require("./routes/duplicate-nodes");
25
28
  const find_in_file_1 = require("./routes/find-in-file");
26
29
  const insert_basic_captions_1 = require("./routes/insert-basic-captions");
30
+ const insert_composition_element_1 = require("./routes/insert-composition-element");
27
31
  const insert_element_1 = require("./routes/insert-element");
28
- const insert_jsx_element_1 = require("./routes/insert-jsx-element");
29
32
  const install_remotion_skill_1 = require("./routes/install-remotion-skill");
30
33
  const invalidate_bundle_1 = require("./routes/invalidate-bundle");
31
34
  const log_studio_error_1 = require("./routes/log-studio-error");
35
+ const move_composition_1 = require("./routes/move-composition");
36
+ const move_folder_1 = require("./routes/move-folder");
32
37
  const move_keyframes_1 = require("./routes/move-keyframes");
33
38
  const open_in_editor_1 = require("./routes/open-in-editor");
34
39
  const open_in_file_explorer_1 = require("./routes/open-in-file-explorer");
35
40
  const open_in_git_client_1 = require("./routes/open-in-git-client");
36
41
  const open_in_terminal_1 = require("./routes/open-in-terminal");
37
42
  const paste_effects_1 = require("./routes/paste-effects");
43
+ const precompose_jsx_nodes_1 = require("./routes/precompose-jsx-nodes");
38
44
  const prepare_element_install_1 = require("./routes/prepare-element-install");
39
45
  const project_info_1 = require("./routes/project-info");
40
46
  const redo_1 = require("./routes/redo");
@@ -42,6 +48,8 @@ const register_client_render_1 = require("./routes/register-client-render");
42
48
  const release_notes_1 = require("./routes/release-notes");
43
49
  const remotion_skills_info_1 = require("./routes/remotion-skills-info");
44
50
  const remove_render_1 = require("./routes/remove-render");
51
+ const rename_composition_1 = require("./routes/rename-composition");
52
+ const rename_folder_1 = require("./routes/rename-folder");
45
53
  const rename_static_file_1 = require("./routes/rename-static-file");
46
54
  const reorder_effect_1 = require("./routes/reorder-effect");
47
55
  const reorder_sequence_1 = require("./routes/reorder-sequence");
@@ -51,7 +59,7 @@ const save_effect_props_1 = require("./routes/save-effect-props");
51
59
  const save_multiple_effect_props_1 = require("./routes/save-multiple-effect-props");
52
60
  const save_sequence_props_1 = require("./routes/save-sequence-props");
53
61
  const shutdown_studio_1 = require("./routes/shutdown-studio");
54
- const split_jsx_sequence_1 = require("./routes/split-jsx-sequence");
62
+ const split_sequences_1 = require("./routes/split-sequences");
55
63
  const split_video_from_audio_1 = require("./routes/split-video-from-audio");
56
64
  const subscribe_to_default_props_1 = require("./routes/subscribe-to-default-props");
57
65
  const subscribe_to_file_existence_1 = require("./routes/subscribe-to-file-existence");
@@ -61,13 +69,15 @@ const unregister_client_render_1 = require("./routes/unregister-client-render");
61
69
  const unsubscribe_from_default_props_1 = require("./routes/unsubscribe-from-default-props");
62
70
  const unsubscribe_from_file_existence_1 = require("./routes/unsubscribe-from-file-existence");
63
71
  const unsubscribe_from_sequence_props_1 = require("./routes/unsubscribe-from-sequence-props");
72
+ const unwrap_folder_1 = require("./routes/unwrap-folder");
64
73
  const update_available_1 = require("./routes/update-available");
74
+ const update_composition_metadata_1 = require("./routes/update-composition-metadata");
65
75
  const update_default_props_1 = require("./routes/update-default-props");
66
76
  const update_effect_keyframe_settings_1 = require("./routes/update-effect-keyframe-settings");
67
77
  const update_element_install_target_1 = require("./routes/update-element-install-target");
68
78
  const update_sequence_keyframe_settings_1 = require("./routes/update-sequence-keyframe-settings");
69
79
  const upgrade_remotion_1 = require("./routes/upgrade-remotion");
70
- const wrap_jsx_node_1 = require("./routes/wrap-jsx-node");
80
+ const wrap_node_1 = require("./routes/wrap-node");
71
81
  exports.allApiRoutes = {
72
82
  '/api/invalidate-bundle': invalidate_bundle_1.invalidateBundleHandler,
73
83
  '/api/composition-component-info': composition_component_info_1.compositionComponentInfoHandler,
@@ -88,7 +98,16 @@ exports.allApiRoutes = {
88
98
  '/api/unregister-client-render': unregister_client_render_1.unregisterClientRenderHandler,
89
99
  '/api/update-default-props': update_default_props_1.updateDefaultPropsHandler,
90
100
  '/api/apply-visual-control-change': apply_visual_control_change_1.applyVisualControlHandler,
91
- '/api/apply-codemod': apply_codemod_1.applyCodemodHandler,
101
+ '/api/add-composition': add_composition_1.addCompositionHandler,
102
+ '/api/duplicate-composition': duplicate_composition_1.duplicateCompositionHandler,
103
+ '/api/rename-composition': rename_composition_1.renameCompositionHandler,
104
+ '/api/update-composition-metadata': update_composition_metadata_1.updateCompositionMetadataHandler,
105
+ '/api/delete-composition': delete_composition_1.deleteCompositionHandler,
106
+ '/api/move-composition': move_composition_1.moveCompositionHandler,
107
+ '/api/add-folder': add_folder_1.addFolderHandler,
108
+ '/api/rename-folder': rename_folder_1.renameFolderHandler,
109
+ '/api/unwrap-folder': unwrap_folder_1.unwrapFolderHandler,
110
+ '/api/move-folder': move_folder_1.moveFolderHandler,
92
111
  '/api/subscribe-to-default-props': subscribe_to_default_props_1.subscribeToDefaultProps,
93
112
  '/api/unsubscribe-from-default-props': unsubscribe_from_default_props_1.unsubscribeFromDefaultProps,
94
113
  '/api/subscribe-to-sequence-props': subscribe_to_sequence_props_1.subscribeToSequenceProps,
@@ -110,10 +129,11 @@ exports.allApiRoutes = {
110
129
  '/api/batch-update-keyframe-settings': batch_update_keyframe_settings_1.batchUpdateKeyframeSettingsHandler,
111
130
  '/api/delete-effect': delete_effect_1.deleteEffectHandler,
112
131
  '/api/paste-effects': paste_effects_1.pasteEffectsHandler,
113
- '/api/delete-jsx-nodes': delete_jsx_nodes_1.deleteJsxNodesHandler,
114
- '/api/duplicate-jsx-node': duplicate_jsx_node_1.duplicateJsxNodeHandler,
115
- '/api/wrap-jsx-node': wrap_jsx_node_1.wrapJsxNodeHandler,
116
- '/api/split-jsx-sequence': split_jsx_sequence_1.splitJsxSequenceHandler,
132
+ '/api/delete-nodes': delete_nodes_1.deleteNodesHandler,
133
+ '/api/duplicate-nodes': duplicate_nodes_1.duplicateNodesHandler,
134
+ '/api/wrap-node': wrap_node_1.wrapNodeHandler,
135
+ '/api/precompose-jsx-nodes': precompose_jsx_nodes_1.precomposeJsxNodesHandler,
136
+ '/api/split-sequences': split_sequences_1.splitSequencesHandler,
117
137
  '/api/split-video-from-audio': split_video_from_audio_1.splitVideoFromAudioHandler,
118
138
  '/api/insert-basic-captions': insert_basic_captions_1.insertBasicCaptionsHandler,
119
139
  '/api/replace-video-source': replace_video_source_1.replaceVideoSourceHandler,
@@ -130,7 +150,7 @@ exports.allApiRoutes = {
130
150
  '/api/restart-studio': restart_studio_1.handleRestartStudio,
131
151
  '/api/default-coding-agent-info': default_coding_agent_1.getDefaultCodingAgentInfoHandler,
132
152
  '/api/default-editor-info': default_editor_1.getDefaultEditorInfoHandler,
133
- '/api/insert-jsx-element': insert_jsx_element_1.insertJsxElementHandler,
153
+ '/api/insert-composition-element': insert_composition_element_1.insertCompositionElementHandler,
134
154
  '/api/insert-element': insert_element_1.insertElementHandler,
135
155
  '/api/prepare-element-install': prepare_element_install_1.prepareElementInstallHandler,
136
156
  '/api/update-element-install-target': update_element_install_target_1.updateElementInstallTargetHandler,
@@ -30,19 +30,27 @@ exports.getElementInstallTargetByClientId = getElementInstallTargetByClientId;
30
30
  const getElementInstallTarget = (requestId) => {
31
31
  const now = Date.now();
32
32
  let bestTarget = null;
33
+ let unfocusedTarget = null;
34
+ let multipleUnfocusedTargets = false;
33
35
  for (const [clientId, currentTarget] of targetsByClientId) {
34
36
  if (now - currentTarget.updatedAt >= exports.ELEMENT_INSTALL_TARGET_MAX_AGE) {
35
37
  targetsByClientId.delete(clientId);
36
38
  continue;
37
39
  }
38
- if (requestId !== null && currentTarget.requestId !== requestId) {
40
+ if ((requestId !== null && currentTarget.requestId !== requestId) ||
41
+ currentTarget.readOnly) {
42
+ continue;
43
+ }
44
+ if (currentTarget.lastFocusedAt === null) {
45
+ multipleUnfocusedTargets || (multipleUnfocusedTargets = unfocusedTarget !== null);
46
+ unfocusedTarget = currentTarget;
39
47
  continue;
40
48
  }
41
49
  if (bestTarget === null || compareTargets(currentTarget, bestTarget) > 0) {
42
50
  bestTarget = currentTarget;
43
51
  }
44
52
  }
45
- return bestTarget;
53
+ return bestTarget !== null && bestTarget !== void 0 ? bestTarget : (multipleUnfocusedTargets ? null : unfocusedTarget);
46
54
  };
47
55
  exports.getElementInstallTarget = getElementInstallTarget;
48
56
  const issueStudioProtocolTarget = ({ now, origin, purpose, target, }) => {
@@ -0,0 +1,3 @@
1
+ import type { AddCompositionRequest, CompositionEditResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const addCompositionHandler: ApiHandler<AddCompositionRequest, CompositionEditResponse>;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addCompositionHandler = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const renderer_1 = require("@remotion/renderer");
6
+ const add_composition_to_file_1 = require("../../codemods/add-composition-to-file");
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 project_info_1 = require("../project-info");
11
+ const undo_stack_1 = require("../undo-stack");
12
+ const can_update_default_props_1 = require("./can-update-default-props");
13
+ const source_file_write_queue_1 = require("./source-file-write-queue");
14
+ const addCompositionHandler = ({ input: request, logLevel, remotionRoot, entryPoint }) => (0, source_file_write_queue_1.withSourceFileWriteQueue)(async () => {
15
+ var _a, _b;
16
+ var _c, _d;
17
+ try {
18
+ let filePath;
19
+ if ((_a = request.symbolicatedStack) === null || _a === void 0 ? void 0 : _a.originalFileName) {
20
+ filePath = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
21
+ remotionRoot,
22
+ fileName: request.symbolicatedStack.originalFileName,
23
+ action: 'add a composition to',
24
+ }).absolutePath;
25
+ }
26
+ else {
27
+ const { rootFile } = await (0, project_info_1.getProjectInfo)(remotionRoot, entryPoint);
28
+ if (rootFile === null) {
29
+ throw new Error('Cannot find the Remotion root file');
30
+ }
31
+ filePath = rootFile;
32
+ }
33
+ (0, can_update_default_props_1.checkIfTypeScriptFile)(filePath);
34
+ const result = await (0, add_composition_to_file_1.addCompositionToFile)({
35
+ filePath,
36
+ options: request.options,
37
+ remotionRoot,
38
+ });
39
+ for (const change of result.changes) {
40
+ const currentContents = (0, node_fs_1.existsSync)(change.filePath)
41
+ ? (0, node_fs_1.readFileSync)(change.filePath, 'utf-8')
42
+ : null;
43
+ if (currentContents !== change.previousContents) {
44
+ throw new Error(`Source changed before adding composition: ${change.filePath}`);
45
+ }
46
+ }
47
+ if (result.changes.length > 0) {
48
+ const logLine = (_c = (_b = request.symbolicatedStack) === null || _b === void 0 ? void 0 : _b.originalLineNumber) !== null && _c !== void 0 ? _c : 1;
49
+ (0, undo_stack_1.pushTransactionToUndoStack)({
50
+ snapshots: result.changes.map((change) => ({
51
+ filePath: change.filePath,
52
+ oldContents: change.previousContents,
53
+ newContents: change.nextContents,
54
+ logLine: change.filePath === filePath ? logLine : 1,
55
+ nodePathRemappings: null,
56
+ })),
57
+ logLevel,
58
+ remotionRoot,
59
+ description: {
60
+ undoMessage: `↩️ Creation of composition "${request.options.newId}"`,
61
+ redoMessage: `↪️ Creation of composition "${request.options.newId}"`,
62
+ },
63
+ entryType: 'new-composition',
64
+ suppressHmrOnFileRestore: false,
65
+ undoRedoNavigation: request.undoRedoNavigation,
66
+ });
67
+ for (const change of result.changes) {
68
+ if (change.nextContents === null) {
69
+ throw new Error('Adding a composition cannot remove source files');
70
+ }
71
+ (0, undo_stack_1.suppressUndoStackInvalidation)(change.filePath);
72
+ (0, file_watcher_1.writeFileAndNotifyFileWatchers)({
73
+ file: change.filePath,
74
+ content: change.nextContents,
75
+ originatorClientId: undefined,
76
+ metadata: null,
77
+ });
78
+ }
79
+ const locationLabel = (0, format_log_file_location_1.formatLogFileLocation)({
80
+ remotionRoot,
81
+ absolutePath: filePath,
82
+ line: logLine,
83
+ });
84
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `${(0, source_file_write_queue_1.getCodemodTimingPrefix)(logLevel)}${renderer_1.RenderInternals.chalk.blueBright(locationLabel)} Created composition "${request.options.newId}"`);
85
+ (0, undo_stack_1.printUndoHint)(logLevel);
86
+ }
87
+ return { success: true, nodePathMutation: null };
88
+ }
89
+ catch (error) {
90
+ return {
91
+ success: false,
92
+ reason: error instanceof Error ? error.message : String(error),
93
+ stack: error instanceof Error ? ((_d = error.stack) !== null && _d !== void 0 ? _d : '') : '',
94
+ };
95
+ }
96
+ });
97
+ exports.addCompositionHandler = addCompositionHandler;
@@ -0,0 +1,3 @@
1
+ import type { AddFolderRequest, CompositionEditResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const addFolderHandler: ApiHandler<AddFolderRequest, CompositionEditResponse>;