@remotion/studio-server 4.0.530 → 4.0.531

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 (48) hide show
  1. package/dist/canvas-capture/generate-canvas-capture-composition.d.ts +14 -0
  2. package/dist/canvas-capture/generate-canvas-capture-composition.js +239 -0
  3. package/dist/codemods/add-effect.d.ts +1 -0
  4. package/dist/codemods/add-effect.js +8 -0
  5. package/dist/codemods/apply-visual-control.d.ts +8 -0
  6. package/dist/codemods/apply-visual-control.js +89 -0
  7. package/dist/codemods/delete-effect.d.ts +1 -0
  8. package/dist/codemods/delete-effect.js +6 -0
  9. package/dist/codemods/delete-jsx-node.d.ts +22 -0
  10. package/dist/codemods/delete-jsx-node.js +17 -0
  11. package/dist/codemods/duplicate-composition.d.ts +2 -0
  12. package/dist/codemods/duplicate-composition.js +64 -0
  13. package/dist/codemods/duplicate-effect.d.ts +1 -0
  14. package/dist/codemods/duplicate-effect.js +6 -0
  15. package/dist/codemods/duplicate-jsx-node.d.ts +25 -0
  16. package/dist/codemods/duplicate-jsx-node.js +26 -0
  17. package/dist/codemods/format-file-content.d.ts +7 -0
  18. package/dist/codemods/format-file-content.js +80 -0
  19. package/dist/codemods/format-inline-content.d.ts +18 -0
  20. package/dist/codemods/format-inline-content.js +78 -0
  21. package/dist/codemods/insert-video-layers.d.ts +11 -0
  22. package/dist/codemods/insert-video-layers.js +5 -0
  23. package/dist/codemods/recast-mods.d.ts +13 -0
  24. package/dist/codemods/recast-mods.js +902 -0
  25. package/dist/codemods/reorder-effect.d.ts +1 -0
  26. package/dist/codemods/reorder-effect.js +5 -0
  27. package/dist/codemods/reorder-sequence.d.ts +1 -0
  28. package/dist/codemods/reorder-sequence.js +5 -0
  29. package/dist/codemods/simple-diff.d.ts +5 -0
  30. package/dist/codemods/simple-diff.js +39 -0
  31. package/dist/codemods/split-video-from-audio.d.ts +1 -0
  32. package/dist/codemods/split-video-from-audio.js +5 -0
  33. package/dist/codemods/update-default-props.d.ts +1 -0
  34. package/dist/codemods/update-default-props.js +6 -0
  35. package/dist/codemods/update-inline-caption-patches.d.ts +1 -0
  36. package/dist/codemods/update-inline-caption-patches.js +5 -0
  37. package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.d.ts +1 -0
  38. package/dist/codemods/update-keyframes/ensure-imports-and-frame-hook.js +7 -0
  39. package/dist/helpers/get-file-source.js +6 -4
  40. package/dist/helpers/install-command.js +1 -0
  41. package/dist/open-directory-in-finder.js +11 -9
  42. package/dist/preview-server/routes/delete-jsx-node.d.ts +3 -0
  43. package/dist/preview-server/routes/delete-jsx-node.js +126 -0
  44. package/dist/preview-server/routes/insert-video-layers.d.ts +3 -0
  45. package/dist/preview-server/routes/insert-video-layers.js +68 -0
  46. package/dist/preview-server/routes/update-public-license.d.ts +11 -0
  47. package/dist/preview-server/routes/update-public-license.js +97 -0
  48. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ export { reorderEffect } from '@remotion/studio-codemods';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reorderEffect = void 0;
4
+ const studio_codemods_1 = require("@remotion/studio-codemods");
5
+ Object.defineProperty(exports, "reorderEffect", { enumerable: true, get: function () { return studio_codemods_1.reorderEffect; } });
@@ -0,0 +1 @@
1
+ export { reorderSequence } from '@remotion/studio-codemods';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reorderSequence = void 0;
4
+ const studio_codemods_1 = require("@remotion/studio-codemods");
5
+ Object.defineProperty(exports, "reorderSequence", { enumerable: true, get: function () { return studio_codemods_1.reorderSequence; } });
@@ -0,0 +1,5 @@
1
+ import type { SimpleDiff } from '@remotion/studio-shared';
2
+ export declare const simpleDiff: ({ oldLines, newLines, }: {
3
+ oldLines: string[];
4
+ newLines: string[];
5
+ }) => SimpleDiff;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.simpleDiff = void 0;
4
+ const findDeletions = ({ oldLines, newLines, }) => {
5
+ const linesChecked = [];
6
+ let totalDeletions = 0;
7
+ for (const line of oldLines) {
8
+ if (linesChecked.includes(line)) {
9
+ continue;
10
+ }
11
+ const timesInNewLines = newLines.filter((l) => l === line).length;
12
+ const timesInOldLines = oldLines.filter((l) => l === line).length;
13
+ const deletions = Math.max(0, timesInOldLines - timesInNewLines);
14
+ totalDeletions += deletions;
15
+ linesChecked.push(line);
16
+ }
17
+ return totalDeletions;
18
+ };
19
+ const findAdditions = ({ oldLines, newLines, }) => {
20
+ const linesChecked = [];
21
+ let totalAdditions = 0;
22
+ for (const line of newLines) {
23
+ if (linesChecked.includes(line)) {
24
+ continue;
25
+ }
26
+ const timesInNewLines = newLines.filter((l) => l === line).length;
27
+ const timesInOldLines = oldLines.filter((l) => l === line).length;
28
+ const additions = Math.max(0, timesInNewLines - timesInOldLines);
29
+ totalAdditions += additions;
30
+ linesChecked.push(line);
31
+ }
32
+ return totalAdditions;
33
+ };
34
+ const simpleDiff = ({ oldLines, newLines, }) => {
35
+ const deletions = findDeletions({ oldLines, newLines });
36
+ const additions = findAdditions({ oldLines, newLines });
37
+ return { deletions, additions };
38
+ };
39
+ exports.simpleDiff = simpleDiff;
@@ -0,0 +1 @@
1
+ export { splitVideoFromAudio } from '@remotion/studio-codemods';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.splitVideoFromAudio = void 0;
4
+ const studio_codemods_1 = require("@remotion/studio-codemods");
5
+ Object.defineProperty(exports, "splitVideoFromAudio", { enumerable: true, get: function () { return studio_codemods_1.splitVideoFromAudio; } });
@@ -0,0 +1 @@
1
+ export { getCompositionDefaultPropsLine, updateDefaultProps, } from '@remotion/studio-codemods';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateDefaultProps = exports.getCompositionDefaultPropsLine = void 0;
4
+ const studio_codemods_1 = require("@remotion/studio-codemods");
5
+ Object.defineProperty(exports, "getCompositionDefaultPropsLine", { enumerable: true, get: function () { return studio_codemods_1.getCompositionDefaultPropsLine; } });
6
+ Object.defineProperty(exports, "updateDefaultProps", { enumerable: true, get: function () { return studio_codemods_1.updateDefaultProps; } });
@@ -0,0 +1 @@
1
+ export { updateInlineCaptionPatches } from '@remotion/studio-codemods';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateInlineCaptionPatches = void 0;
4
+ const studio_codemods_1 = require("@remotion/studio-codemods");
5
+ Object.defineProperty(exports, "updateInlineCaptionPatches", { enumerable: true, get: function () { return studio_codemods_1.updateInlineCaptionPatches; } });
@@ -0,0 +1 @@
1
+ export { ensureRemotionImports, ensureUseCurrentFrameHook, findEnclosingFunctionPath, } from '@remotion/studio-codemods';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findEnclosingFunctionPath = exports.ensureUseCurrentFrameHook = exports.ensureRemotionImports = void 0;
4
+ const studio_codemods_1 = require("@remotion/studio-codemods");
5
+ Object.defineProperty(exports, "ensureRemotionImports", { enumerable: true, get: function () { return studio_codemods_1.ensureRemotionImports; } });
6
+ Object.defineProperty(exports, "ensureUseCurrentFrameHook", { enumerable: true, get: function () { return studio_codemods_1.ensureUseCurrentFrameHook; } });
7
+ Object.defineProperty(exports, "findEnclosingFunctionPath", { enumerable: true, get: function () { return studio_codemods_1.findEnclosingFunctionPath; } });
@@ -13,10 +13,12 @@ const getFileSource = (remotionRoot, p) => {
13
13
  return Promise.reject(new Error(`Not allowed to open ${p}`));
14
14
  }
15
15
  const resolved = node_path_1.default.resolve(remotionRoot, p);
16
- const relativeToProcessCwd = node_path_1.default.relative(remotionRoot, resolved);
17
- if (relativeToProcessCwd.startsWith('..')) {
18
- return Promise.reject(new Error(`Not allowed to open ${relativeToProcessCwd}`));
16
+ const relativeToRemotionRoot = node_path_1.default.relative(remotionRoot, resolved);
17
+ if (relativeToRemotionRoot === '..' ||
18
+ relativeToRemotionRoot.startsWith(`..${node_path_1.default.sep}`) ||
19
+ node_path_1.default.isAbsolute(relativeToRemotionRoot)) {
20
+ return Promise.reject(new Error(`Not allowed to open ${relativeToRemotionRoot}`));
19
21
  }
20
- return node_fs_1.default.promises.readFile(p, 'utf-8');
22
+ return node_fs_1.default.promises.readFile(resolved, 'utf-8');
21
23
  };
22
24
  exports.getFileSource = getFileSource;
@@ -9,6 +9,7 @@ const getInstallCommand = ({ manager, packages, version, additionalArgs, }) => {
9
9
  '--save-exact',
10
10
  '--no-fund',
11
11
  '--no-audit',
12
+ '--loglevel=error',
12
13
  ...additionalArgs,
13
14
  ...pkgList,
14
15
  ],
@@ -4,18 +4,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.openDirectoryInFinder = void 0;
7
- const node_child_process_1 = require("node:child_process");
8
- const node_os_1 = require("node:os");
7
+ const node_child_process_1 = __importDefault(require("node:child_process"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
9
  const node_path_1 = __importDefault(require("node:path"));
10
10
  const no_react_1 = require("remotion/no-react");
11
11
  const openDirectoryInFinder = (dirToOpen, allowedDirectory) => {
12
12
  const resolved = node_path_1.default.resolve(allowedDirectory, dirToOpen);
13
- const relativeToProcessCwd = node_path_1.default.relative(allowedDirectory, resolved);
14
- if (relativeToProcessCwd.startsWith('..')) {
15
- throw new Error(`Not allowed to open ${relativeToProcessCwd}`);
13
+ const relativeToAllowedDirectory = node_path_1.default.relative(allowedDirectory, resolved);
14
+ if (relativeToAllowedDirectory === '..' ||
15
+ relativeToAllowedDirectory.startsWith(`..${node_path_1.default.sep}`) ||
16
+ node_path_1.default.isAbsolute(relativeToAllowedDirectory)) {
17
+ throw new Error(`Not allowed to open ${relativeToAllowedDirectory}`);
16
18
  }
17
- if ((0, node_os_1.platform)() === 'win32') {
18
- const proc = (0, node_child_process_1.spawn)('explorer.exe', ['/select,', resolved]);
19
+ if (node_os_1.default.platform() === 'win32') {
20
+ const proc = node_child_process_1.default.spawn('explorer.exe', ['/select,', resolved]);
19
21
  return new Promise((resolve, reject) => {
20
22
  proc.on('exit', (code) => {
21
23
  // explorer.exe returns 1 even on success
@@ -32,8 +34,8 @@ const openDirectoryInFinder = (dirToOpen, allowedDirectory) => {
32
34
  });
33
35
  });
34
36
  }
35
- const command = (0, node_os_1.platform)() === 'darwin' ? 'open' : 'xdg-open';
36
- const p = (0, node_child_process_1.spawn)(command, [(0, node_os_1.platform)() === 'darwin' ? '-R' : null, dirToOpen].filter(no_react_1.NoReactInternals.truthy));
37
+ const command = node_os_1.default.platform() === 'darwin' ? 'open' : 'xdg-open';
38
+ const p = node_child_process_1.default.spawn(command, [node_os_1.default.platform() === 'darwin' ? '-R' : null, resolved].filter(no_react_1.NoReactInternals.truthy));
37
39
  const stderrChunks = [];
38
40
  p.stderr.on('data', (d) => stderrChunks.push(d));
39
41
  return new Promise((resolve, reject) => {
@@ -0,0 +1,3 @@
1
+ import type { DeleteJsxNodeRequest, DeleteJsxNodeResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const deleteJsxNodeHandler: ApiHandler<DeleteJsxNodeRequest, DeleteJsxNodeResponse>;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteJsxNodeHandler = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const renderer_1 = require("@remotion/renderer");
6
+ const delete_jsx_node_1 = require("../../codemods/delete-jsx-node");
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 hmr_timing_1 = require("../hmr-timing");
11
+ const sequence_node_path_mutation_1 = require("../sequence-node-path-mutation");
12
+ const undo_stack_1 = require("../undo-stack");
13
+ const source_file_write_queue_1 = require("./source-file-write-queue");
14
+ const getDeletedNodeDescription = (nodeLabels) => {
15
+ if (nodeLabels.length === 1) {
16
+ return nodeLabels[0];
17
+ }
18
+ return `${nodeLabels.length} JSX nodes`;
19
+ };
20
+ const deleteJsxNodeHandler = ({ input: { nodes }, remotionRoot, logLevel }) => {
21
+ return (0, source_file_write_queue_1.withSourceFileWriteQueue)(async () => {
22
+ var _a;
23
+ try {
24
+ (0, hmr_timing_1.logHmrTiming)({
25
+ detail: null,
26
+ logLevel,
27
+ stage: 'delete-jsx-node-request-start',
28
+ });
29
+ if (nodes.length === 0) {
30
+ throw new Error('No JSX nodes were specified for deletion');
31
+ }
32
+ renderer_1.RenderInternals.Log.trace({ indent: false, logLevel }, `[delete-jsx-node] Received request to delete ${nodes.length} JSX node${nodes.length === 1 ? '' : 's'}`);
33
+ const itemsByFileName = new Map();
34
+ for (const item of nodes) {
35
+ const fileItems = (_a = itemsByFileName.get(item.fileName)) !== null && _a !== void 0 ? _a : [];
36
+ fileItems.push(item);
37
+ itemsByFileName.set(item.fileName, fileItems);
38
+ }
39
+ const updates = await Promise.all([...itemsByFileName.entries()].map(async ([fileName, fileItems]) => {
40
+ const { absolutePath, fileRelativeToRoot } = (0, resolve_file_inside_project_1.resolveFileInsideProject)({
41
+ remotionRoot,
42
+ fileName,
43
+ action: 'modify',
44
+ });
45
+ const fileContents = (0, node_fs_1.readFileSync)(absolutePath, 'utf-8');
46
+ const { output, nodeLabels, logLines, nodePathRemappings } = await (0, delete_jsx_node_1.deleteJsxNodes)({
47
+ input: fileContents,
48
+ nodePaths: fileItems.map((item) => item.nodePath),
49
+ });
50
+ return {
51
+ absolutePath,
52
+ fileRelativeToRoot,
53
+ fileContents,
54
+ output,
55
+ nodeLabels,
56
+ nodePathRemappings,
57
+ logLine: Math.min(...logLines),
58
+ };
59
+ }));
60
+ (0, hmr_timing_1.logHmrTiming)({
61
+ detail: `files=${updates.length}`,
62
+ logLevel,
63
+ stage: 'delete-jsx-node-codemod-complete',
64
+ });
65
+ const nodePathMutation = (0, sequence_node_path_mutation_1.broadcastSequenceNodePathMutation)(updates.map((update) => ({
66
+ absolutePath: update.absolutePath,
67
+ remappings: update.nodePathRemappings,
68
+ })), null);
69
+ for (const update of updates) {
70
+ const deletedNodeDescription = getDeletedNodeDescription(update.nodeLabels);
71
+ (0, undo_stack_1.pushToUndoStack)({
72
+ filePath: update.absolutePath,
73
+ oldContents: update.fileContents,
74
+ newContents: null,
75
+ logLevel,
76
+ remotionRoot,
77
+ logLine: update.logLine,
78
+ description: {
79
+ undoMessage: `↩️ Deletion of ${deletedNodeDescription}`,
80
+ redoMessage: `↪️ Deletion of ${deletedNodeDescription}`,
81
+ },
82
+ entryType: 'delete-jsx-node',
83
+ suppressHmrOnFileRestore: false,
84
+ nodePathRemappings: update.nodePathRemappings,
85
+ });
86
+ (0, undo_stack_1.suppressUndoStackInvalidation)(update.absolutePath);
87
+ (0, hmr_timing_1.logHmrTiming)({
88
+ detail: `file=${update.fileRelativeToRoot}`,
89
+ logLevel,
90
+ stage: 'source-file-write-start',
91
+ });
92
+ (0, file_watcher_1.writeFileAndNotifyFileWatchers)({
93
+ file: update.absolutePath,
94
+ content: update.output,
95
+ originatorClientId: undefined,
96
+ metadata: { skipSequencePropsUpdate: true },
97
+ });
98
+ (0, hmr_timing_1.logHmrTiming)({
99
+ detail: `file=${update.fileRelativeToRoot}`,
100
+ logLevel,
101
+ stage: 'source-file-write-complete',
102
+ });
103
+ const locationLabel = (0, format_log_file_location_1.formatLogFileLocation)({
104
+ remotionRoot,
105
+ absolutePath: update.absolutePath,
106
+ line: update.logLine,
107
+ });
108
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel }, `${(0, source_file_write_queue_1.getCodemodTimingPrefix)(logLevel)}${renderer_1.RenderInternals.chalk.blueBright(`${locationLabel}`)} Deleted ${deletedNodeDescription}`);
109
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel }, `[delete-jsx-node] Wrote ${update.fileRelativeToRoot}`);
110
+ }
111
+ (0, undo_stack_1.printUndoHint)(logLevel);
112
+ return {
113
+ success: true,
114
+ nodePathMutation,
115
+ };
116
+ }
117
+ catch (err) {
118
+ return {
119
+ success: false,
120
+ reason: err.message,
121
+ stack: err.stack,
122
+ };
123
+ }
124
+ });
125
+ };
126
+ exports.deleteJsxNodeHandler = deleteJsxNodeHandler;
@@ -0,0 +1,3 @@
1
+ import type { InsertVideoLayersRequest, InsertVideoLayersResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const insertVideoLayersHandler: ApiHandler<InsertVideoLayersRequest, InsertVideoLayersResponse>;
@@ -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;
@@ -0,0 +1,11 @@
1
+ import type { UpdatePublicLicenseRequest, UpdatePublicLicenseResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const updatePublicLicenseInConfig: ({ configContents, publicLicenseKey, }: {
4
+ configContents: string;
5
+ publicLicenseKey: string;
6
+ }) => string;
7
+ export declare const setPublicLicenseKeyInConfigFile: ({ configFile, publicLicenseKey, }: {
8
+ readonly configFile: string;
9
+ readonly publicLicenseKey: string;
10
+ }) => void;
11
+ export declare const updatePublicLicenseHandler: ApiHandler<UpdatePublicLicenseRequest, UpdatePublicLicenseResponse>;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.updatePublicLicenseHandler = exports.setPublicLicenseKeyInConfigFile = exports.updatePublicLicenseInConfig = void 0;
37
+ const node_fs_1 = require("node:fs");
38
+ const recast = __importStar(require("recast"));
39
+ const parse_ast_1 = require("../../codemods/parse-ast");
40
+ const file_watcher_1 = require("../../file-watcher");
41
+ const updatePublicLicenseInConfig = ({ configContents, publicLicenseKey, }) => {
42
+ const ast = (0, parse_ast_1.parseAst)(configContents);
43
+ recast.types.visit(ast.program, {
44
+ visitExpressionStatement(path) {
45
+ const { expression } = path.node;
46
+ if (expression.type === 'CallExpression' &&
47
+ expression.callee.type === 'MemberExpression' &&
48
+ !expression.callee.computed &&
49
+ expression.callee.object.type === 'Identifier' &&
50
+ expression.callee.object.name === 'Config' &&
51
+ expression.callee.property.type === 'Identifier' &&
52
+ expression.callee.property.name === 'setPublicLicenseKey') {
53
+ path.prune();
54
+ return false;
55
+ }
56
+ this.traverse(path);
57
+ },
58
+ });
59
+ const configWithoutExistingCalls = recast.print(ast, {
60
+ lineTerminator: '\n',
61
+ }).code;
62
+ const separator = configWithoutExistingCalls.endsWith('\n') ? '' : '\n';
63
+ const escapedPublicLicenseKey = publicLicenseKey
64
+ .replaceAll('\\', '\\\\')
65
+ .replaceAll("'", "\\'")
66
+ .replaceAll('\r', '\\r')
67
+ .replaceAll('\n', '\\n')
68
+ .replaceAll('\u2028', '\\u2028')
69
+ .replaceAll('\u2029', '\\u2029');
70
+ return `${configWithoutExistingCalls}${separator}Config.setPublicLicenseKey('${escapedPublicLicenseKey}');\n`;
71
+ };
72
+ exports.updatePublicLicenseInConfig = updatePublicLicenseInConfig;
73
+ const setPublicLicenseKeyInConfigFile = ({ configFile, publicLicenseKey, }) => {
74
+ const configContents = (0, node_fs_1.readFileSync)(configFile, 'utf8');
75
+ (0, file_watcher_1.writeFileAndNotifyFileWatchers)(configFile, (0, exports.updatePublicLicenseInConfig)({ configContents, publicLicenseKey }), undefined);
76
+ };
77
+ exports.setPublicLicenseKeyInConfigFile = setPublicLicenseKeyInConfigFile;
78
+ const updatePublicLicenseHandler = ({ input, configFile }) => {
79
+ if (configFile === null || configFile === undefined) {
80
+ return Promise.resolve({
81
+ success: false,
82
+ reason: 'No Remotion config file was loaded.',
83
+ });
84
+ }
85
+ if (input.publicLicenseKey.length === 0) {
86
+ return Promise.resolve({
87
+ success: false,
88
+ reason: 'The public license key must not be empty.',
89
+ });
90
+ }
91
+ (0, exports.setPublicLicenseKeyInConfigFile)({
92
+ configFile,
93
+ publicLicenseKey: input.publicLicenseKey,
94
+ });
95
+ return Promise.resolve({ success: true });
96
+ };
97
+ exports.updatePublicLicenseHandler = updatePublicLicenseHandler;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio-server"
4
4
  },
5
5
  "name": "@remotion/studio-server",
6
- "version": "4.0.530",
6
+ "version": "4.0.531",
7
7
  "description": "Run a Remotion Studio with a server backend",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -23,7 +23,7 @@
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@remotion/studio-protocol": "4.0.530",
26
+ "@remotion/studio-protocol": "4.0.531",
27
27
  "@babel/types": "7.24.0",
28
28
  "@babel/parser": "7.24.1",
29
29
  "@svgr/core": "8.1.0",
@@ -31,12 +31,12 @@
31
31
  "kiwi-schema": "0.5.0",
32
32
  "semver": "7.5.3",
33
33
  "zod": "4.5.4",
34
- "remotion": "4.0.530",
34
+ "remotion": "4.0.531",
35
35
  "recast": "0.23.21",
36
- "@remotion/bundler": "4.0.530",
37
- "@remotion/renderer": "4.0.530",
38
- "@remotion/codemods": "4.0.530",
39
- "@remotion/studio-shared": "4.0.530",
36
+ "@remotion/bundler": "4.0.531",
37
+ "@remotion/renderer": "4.0.531",
38
+ "@remotion/codemods": "4.0.531",
39
+ "@remotion/studio-shared": "4.0.531",
40
40
  "memfs": "3.4.3",
41
41
  "open": "8.4.2"
42
42
  },
@@ -44,7 +44,7 @@
44
44
  "ast-types": "0.16.1",
45
45
  "react": "19.2.3",
46
46
  "@types/semver": "7.5.3",
47
- "@remotion/eslint-config-internal": "4.0.530",
47
+ "@remotion/eslint-config-internal": "4.0.531",
48
48
  "eslint": "9.19.0",
49
49
  "prettier": "3.8.1",
50
50
  "@types/node": "20.12.14",