@remotion/studio-server 4.0.527 → 4.0.528

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 (47) hide show
  1. package/dist/codemods/apply-codemod-to-file.d.ts +2 -1
  2. package/dist/codemods/apply-codemod-to-file.js +141 -8
  3. package/dist/codemods/update-effect-props/update-effect-props.d.ts +6 -33
  4. package/dist/codemods/update-effect-props/update-effect-props.js +16 -6
  5. package/dist/codemods/update-keyframes/update-keyframes.d.ts +24 -65
  6. package/dist/codemods/update-keyframes/update-keyframes.js +23 -5
  7. package/dist/codemods/update-sequence-props/update-sequence-props.d.ts +2 -17
  8. package/dist/codemods/update-sequence-props/update-sequence-props.js +15 -8
  9. package/dist/helpers/open-file-for-writing-without-symlinks.d.ts +6 -1
  10. package/dist/helpers/open-file-for-writing-without-symlinks.js +9 -6
  11. package/dist/index.d.ts +0 -22
  12. package/dist/index.js +0 -7
  13. package/dist/preview-server/api-routes.js +4 -0
  14. package/dist/preview-server/hot-middleware/index.js +13 -46
  15. package/dist/preview-server/routes/add-effect.js +16 -8
  16. package/dist/preview-server/routes/apply-codemod.d.ts +0 -19
  17. package/dist/preview-server/routes/apply-codemod.js +22 -25
  18. package/dist/preview-server/routes/apply-visual-control-change.js +12 -65
  19. package/dist/preview-server/routes/can-update-sequence-props.d.ts +0 -10
  20. package/dist/preview-server/routes/can-update-sequence-props.js +39 -505
  21. package/dist/preview-server/routes/delete-effect.js +14 -13
  22. package/dist/preview-server/routes/delete-jsx-nodes.js +15 -4
  23. package/dist/preview-server/routes/download-remote-asset.d.ts +5 -0
  24. package/dist/preview-server/routes/download-remote-asset.js +25 -20
  25. package/dist/preview-server/routes/duplicate-effect.js +11 -4
  26. package/dist/preview-server/routes/duplicate-jsx-node.js +14 -4
  27. package/dist/preview-server/routes/insert-element.js +399 -280
  28. package/dist/preview-server/routes/install-dependency.js +14 -4
  29. package/dist/preview-server/routes/prepare-element-install.js +3 -0
  30. package/dist/preview-server/routes/reorder-effect.js +11 -5
  31. package/dist/preview-server/routes/reorder-sequence.js +9 -5
  32. package/dist/preview-server/routes/replace-video-source.d.ts +3 -0
  33. package/dist/preview-server/routes/replace-video-source.js +81 -0
  34. package/dist/preview-server/routes/save-sequence-props.js +5 -26
  35. package/dist/preview-server/routes/split-jsx-sequence.js +13 -5
  36. package/dist/preview-server/routes/split-video-from-audio.js +8 -4
  37. package/dist/preview-server/routes/subscribe-to-sequence-props.js +6 -10
  38. package/dist/preview-server/routes/update-config.js +38 -2
  39. package/dist/preview-server/routes/update-default-props.js +11 -8
  40. package/dist/preview-server/routes/wrap-jsx-node.d.ts +3 -0
  41. package/dist/preview-server/routes/wrap-jsx-node.js +97 -0
  42. package/dist/preview-server/studio-protocol/handle-discovery.js +1 -1
  43. package/dist/preview-server/studio-protocol/handle-element-library.js +3 -3
  44. package/dist/preview-server/undo-stack.d.ts +2 -1
  45. package/dist/preview-server/undo-stack.js +19 -0
  46. package/dist/routes.js +2 -0
  47. package/package.json +8 -8
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deleteJsxNodesHandler = void 0;
4
4
  const node_fs_1 = require("node:fs");
5
+ const codemods_1 = require("@remotion/codemods");
5
6
  const renderer_1 = require("@remotion/renderer");
6
- const delete_jsx_nodes_1 = require("../../codemods/delete-jsx-nodes");
7
7
  const file_watcher_1 = require("../../file-watcher");
8
8
  const resolve_file_inside_project_1 = require("../../helpers/resolve-file-inside-project");
9
9
  const format_log_file_location_1 = require("../format-log-file-location");
@@ -37,16 +37,27 @@ const deleteJsxNodesHandler = ({ input: { nodes }, remotionRoot, logLevel }) =>
37
37
  itemsByFileName.set(item.fileName, fileItems);
38
38
  }
39
39
  const updates = await Promise.all([...itemsByFileName.entries()].map(async ([fileName, fileItems]) => {
40
+ var _a;
41
+ var _b;
40
42
  const { absolutePath, fileRelativeToRoot } = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
41
43
  remotionRoot,
42
44
  fileName,
43
45
  action: 'modify',
44
46
  });
45
47
  const fileContents = (0, node_fs_1.readFileSync)(absolutePath, 'utf-8');
46
- const { output, nodeLabels, logLines, nodePathRemappings } = await (0, delete_jsx_nodes_1.deleteJsxNodes)({
47
- input: fileContents,
48
- nodePaths: fileItems.map((item) => item.nodePath),
48
+ const result = await (0, codemods_1.deleteJsxNodes)({
49
+ project: {
50
+ files: { [absolutePath]: fileContents },
51
+ rootDir: remotionRoot,
52
+ },
53
+ nodes: fileItems.map((item) => ({
54
+ filePath: absolutePath,
55
+ nodePath: item.nodePath,
56
+ })),
49
57
  });
58
+ const output = (_b = (_a = result.changes[0]) === null || _a === void 0 ? void 0 : _a.nextContents) !== null && _b !== void 0 ? _b : fileContents;
59
+ const { nodeLabels, logLines } = result.editDetails[0];
60
+ const nodePathRemappings = result.nodePathRemappings.map(({ oldNodePath, newNodePath }) => ({ oldNodePath, newNodePath }));
50
61
  return {
51
62
  absolutePath,
52
63
  fileRelativeToRoot,
@@ -1,4 +1,9 @@
1
1
  import { getRemoteAssetFilename, type DownloadRemoteAssetRequest, type DownloadRemoteAssetResponse } from '@remotion/studio-shared';
2
2
  import type { ApiHandler } from '../api-types';
3
3
  export { getRemoteAssetFilename };
4
+ export declare const downloadRemoteAssetBytes: ({ acceptHeader, maxSize, url, }: {
5
+ acceptHeader: string | null;
6
+ maxSize: number;
7
+ url: URL;
8
+ }) => Promise<Uint8Array<ArrayBuffer>>;
4
9
  export declare const downloadRemoteAssetHandler: ApiHandler<DownloadRemoteAssetRequest, DownloadRemoteAssetResponse>;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.downloadRemoteAssetHandler = exports.getRemoteAssetFilename = void 0;
6
+ exports.downloadRemoteAssetHandler = exports.downloadRemoteAssetBytes = exports.getRemoteAssetFilename = void 0;
7
7
  const promises_1 = require("node:dns/promises");
8
8
  const node_fs_1 = require("node:fs");
9
9
  const node_net_1 = require("node:net");
@@ -75,15 +75,13 @@ const ensureRemoteUrlIsAllowed = async (url) => {
75
75
  }
76
76
  }
77
77
  };
78
- const fetchRemoteAsset = async ({ signal, url, }) => {
78
+ const fetchRemoteAsset = async ({ acceptHeader, signal, url, }) => {
79
79
  var _a;
80
80
  let currentUrl = url;
81
81
  for (let redirects = 0; redirects <= maxRemoteAssetRedirects; redirects++) {
82
82
  await ensureRemoteUrlIsAllowed(currentUrl);
83
83
  const response = await fetch(currentUrl, {
84
- headers: {
85
- accept: studio_shared_1.remoteAssetAcceptHeader,
86
- },
84
+ headers: acceptHeader === null ? undefined : { accept: acceptHeader },
87
85
  redirect: 'manual',
88
86
  signal,
89
87
  });
@@ -102,15 +100,15 @@ const fetchRemoteAsset = async ({ signal, url, }) => {
102
100
  }
103
101
  throw new Error('Remote asset redirected too many times');
104
102
  };
105
- const readRemoteAsset = async ({ response, abort, }) => {
103
+ const readRemoteAsset = async ({ response, abort, maxSize, }) => {
106
104
  const contentLength = response.headers.get('content-length');
107
- if (contentLength !== null && Number(contentLength) > studio_shared_1.maxRemoteAssetSize) {
105
+ if (contentLength !== null && Number(contentLength) > maxSize) {
108
106
  abort();
109
107
  throw new Error('Remote asset exceeds the 50MB size limit');
110
108
  }
111
109
  if (!response.body) {
112
110
  const buffer = await response.arrayBuffer();
113
- if (buffer.byteLength > studio_shared_1.maxRemoteAssetSize) {
111
+ if (buffer.byteLength > maxSize) {
114
112
  throw new Error('Remote asset exceeds the 50MB size limit');
115
113
  }
116
114
  return new Uint8Array(buffer);
@@ -127,7 +125,7 @@ const readRemoteAsset = async ({ response, abort, }) => {
127
125
  continue;
128
126
  }
129
127
  size += value.byteLength;
130
- if (size > studio_shared_1.maxRemoteAssetSize) {
128
+ if (size > maxSize) {
131
129
  abort();
132
130
  await reader.cancel();
133
131
  throw new Error('Remote asset exceeds the 50MB size limit');
@@ -142,31 +140,25 @@ const readRemoteAsset = async ({ response, abort, }) => {
142
140
  }
143
141
  return result;
144
142
  };
145
- const downloadRemoteAssetHandler = async ({ input, publicDir, request }) => {
146
- (0, validate_same_origin_1.validateSameOrigin)(request);
147
- if (typeof input.url !== 'string') {
148
- throw new Error('No `url` provided');
149
- }
143
+ const downloadRemoteAssetBytes = async ({ acceptHeader, maxSize, url, }) => {
150
144
  if (typeof fetch !== 'function') {
151
145
  throw new Error('Downloading remote assets requires Node.js 18 or newer. Drag a local file instead.');
152
146
  }
153
- const url = new URL(input.url);
154
147
  const controller = new AbortController();
155
- const timeout = setTimeout(() => {
156
- controller.abort();
157
- }, studio_shared_1.remoteAssetDownloadTimeout);
158
- let contents;
148
+ const timeout = setTimeout(() => controller.abort(), studio_shared_1.remoteAssetDownloadTimeout);
159
149
  try {
160
150
  const response = await fetchRemoteAsset({
151
+ acceptHeader,
161
152
  signal: controller.signal,
162
153
  url,
163
154
  });
164
155
  if (!response.ok) {
165
156
  throw new Error(`Could not download remote asset: ${response.status}`);
166
157
  }
167
- contents = await readRemoteAsset({
158
+ return await readRemoteAsset({
168
159
  response,
169
160
  abort: () => controller.abort(),
161
+ maxSize,
170
162
  });
171
163
  }
172
164
  catch (err) {
@@ -178,6 +170,19 @@ const downloadRemoteAssetHandler = async ({ input, publicDir, request }) => {
178
170
  finally {
179
171
  clearTimeout(timeout);
180
172
  }
173
+ };
174
+ exports.downloadRemoteAssetBytes = downloadRemoteAssetBytes;
175
+ const downloadRemoteAssetHandler = async ({ input, publicDir, request }) => {
176
+ (0, validate_same_origin_1.validateSameOrigin)(request);
177
+ if (typeof input.url !== 'string') {
178
+ throw new Error('No `url` provided');
179
+ }
180
+ const url = new URL(input.url);
181
+ const contents = await (0, exports.downloadRemoteAssetBytes)({
182
+ acceptHeader: studio_shared_1.remoteAssetAcceptHeader,
183
+ maxSize: studio_shared_1.maxRemoteAssetSize,
184
+ url,
185
+ });
181
186
  const fileType = (0, studio_shared_1.detectFileType)(contents);
182
187
  if (!(0, studio_shared_1.isImageFileType)(fileType)) {
183
188
  throw new Error('Remote asset is not a supported image');
@@ -11,7 +11,6 @@ const undo_stack_1 = require("../undo-stack");
11
11
  const formatting_1 = require("./log-updates/formatting");
12
12
  const log_update_1 = require("./log-updates/log-update");
13
13
  const source_file_write_queue_1 = require("./source-file-write-queue");
14
- const { duplicateEffects } = codemods_1.CodemodsInternals;
15
14
  const getDuplicatedEffectDescription = (effectLabels) => {
16
15
  if (effectLabels.length === 1) {
17
16
  return effectLabels[0];
@@ -33,19 +32,27 @@ const duplicateEffectHandler = ({ input: effects, remotionRoot, logLevel }) => {
33
32
  itemsByFileName.set(item.fileName, fileItems);
34
33
  }
35
34
  const updates = await Promise.all([...itemsByFileName.entries()].map(async ([fileName, fileItems]) => {
35
+ var _a;
36
+ var _b;
36
37
  const { absolutePath, fileRelativeToRoot } = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
37
38
  remotionRoot,
38
39
  fileName,
39
40
  action: 'modify',
40
41
  });
41
42
  const fileContents = (0, node_fs_1.readFileSync)(absolutePath, 'utf-8');
42
- const { output, formatted, effectLabels, logLines } = await duplicateEffects({
43
- input: fileContents,
43
+ const result = await (0, codemods_1.duplicateEffects)({
44
+ project: {
45
+ files: { [absolutePath]: fileContents },
46
+ rootDir: remotionRoot,
47
+ },
44
48
  effects: fileItems.map((item) => ({
45
- sequenceNodePath: item.sequenceNodePath.nodePath,
49
+ filePath: absolutePath,
50
+ nodePath: item.sequenceNodePath.nodePath,
46
51
  effectIndex: item.effectIndex,
47
52
  })),
48
53
  });
54
+ const output = (_b = (_a = result.changes[0]) === null || _a === void 0 ? void 0 : _a.nextContents) !== null && _b !== void 0 ? _b : fileContents;
55
+ const { formatted, effectLabels, logLines } = result.editDetails[0];
49
56
  return {
50
57
  absolutePath,
51
58
  fileRelativeToRoot,
@@ -10,7 +10,6 @@ const format_log_file_location_1 = require("../format-log-file-location");
10
10
  const sequence_node_path_mutation_1 = require("../sequence-node-path-mutation");
11
11
  const undo_stack_1 = require("../undo-stack");
12
12
  const source_file_write_queue_1 = require("./source-file-write-queue");
13
- const { duplicateJsxNodes } = codemods_1.CodemodsInternals;
14
13
  const duplicateJsxNodeHandler = ({ input: { nodes }, remotionRoot, logLevel }) => {
15
14
  return (0, source_file_write_queue_1.withSourceFileWriteQueue)(async () => {
16
15
  var _a;
@@ -26,16 +25,27 @@ const duplicateJsxNodeHandler = ({ input: { nodes }, remotionRoot, logLevel }) =
26
25
  itemsByFileName.set(item.fileName, fileItems);
27
26
  }
28
27
  const updates = await Promise.all([...itemsByFileName.entries()].map(async ([fileName, fileItems]) => {
28
+ var _a;
29
+ var _b;
29
30
  const { absolutePath, fileRelativeToRoot } = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
30
31
  remotionRoot,
31
32
  fileName,
32
33
  action: 'modify',
33
34
  });
34
35
  const fileContents = (0, node_fs_1.readFileSync)(absolutePath, 'utf-8');
35
- const { output, nodeLabels, logLines, nodePathRemappings } = await duplicateJsxNodes({
36
- input: fileContents,
37
- nodePaths: fileItems.map((item) => item.nodePath),
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
+ })),
38
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 }));
39
49
  return {
40
50
  absolutePath,
41
51
  fileRelativeToRoot,