@remotion/studio-server 4.0.91

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 (108) hide show
  1. package/.eslintrc +13 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/LICENSE.md +45 -0
  4. package/README.md +3 -0
  5. package/dist/ansi-diff.d.ts +41 -0
  6. package/dist/ansi-diff.js +220 -0
  7. package/dist/better-opn/index.d.ts +6 -0
  8. package/dist/better-opn/index.js +202 -0
  9. package/dist/codemods/update-default-props.d.ts +7 -0
  10. package/dist/codemods/update-default-props.js +137 -0
  11. package/dist/file-watcher.d.ts +9 -0
  12. package/dist/file-watcher.js +35 -0
  13. package/dist/get-latest-remotion-version.d.ts +1 -0
  14. package/dist/get-latest-remotion-version.js +31 -0
  15. package/dist/get-network-address.d.ts +1 -0
  16. package/dist/get-network-address.js +16 -0
  17. package/dist/helpers/get-file-source.d.ts +1 -0
  18. package/dist/helpers/get-file-source.js +22 -0
  19. package/dist/helpers/open-in-editor.d.ts +16 -0
  20. package/dist/helpers/open-in-editor.js +503 -0
  21. package/dist/index.d.ts +58 -0
  22. package/dist/index.js +27 -0
  23. package/dist/max-timeline-tracks.d.ts +2 -0
  24. package/dist/max-timeline-tracks.js +25 -0
  25. package/dist/open-directory-in-finder.d.ts +1 -0
  26. package/dist/open-directory-in-finder.js +49 -0
  27. package/dist/preview-server/api-routes.d.ts +5 -0
  28. package/dist/preview-server/api-routes.js +25 -0
  29. package/dist/preview-server/api-types.d.ts +23 -0
  30. package/dist/preview-server/api-types.js +2 -0
  31. package/dist/preview-server/dev-middleware/compatible-api.d.ts +7 -0
  32. package/dist/preview-server/dev-middleware/compatible-api.js +20 -0
  33. package/dist/preview-server/dev-middleware/get-paths.d.ts +7 -0
  34. package/dist/preview-server/dev-middleware/get-paths.js +19 -0
  35. package/dist/preview-server/dev-middleware/index.d.ts +3 -0
  36. package/dist/preview-server/dev-middleware/index.js +27 -0
  37. package/dist/preview-server/dev-middleware/middleware.d.ts +9 -0
  38. package/dist/preview-server/dev-middleware/middleware.js +222 -0
  39. package/dist/preview-server/dev-middleware/range-parser.d.ts +15 -0
  40. package/dist/preview-server/dev-middleware/range-parser.js +96 -0
  41. package/dist/preview-server/dev-middleware/ready.d.ts +3 -0
  42. package/dist/preview-server/dev-middleware/ready.js +11 -0
  43. package/dist/preview-server/dev-middleware/setup-hooks.d.ts +2 -0
  44. package/dist/preview-server/dev-middleware/setup-hooks.js +52 -0
  45. package/dist/preview-server/dev-middleware/setup-output-filesystem.d.ts +2 -0
  46. package/dist/preview-server/dev-middleware/setup-output-filesystem.js +13 -0
  47. package/dist/preview-server/dev-middleware/types.d.ts +10 -0
  48. package/dist/preview-server/dev-middleware/types.js +2 -0
  49. package/dist/preview-server/env-supports-fs-recursive.d.ts +1 -0
  50. package/dist/preview-server/env-supports-fs-recursive.js +18 -0
  51. package/dist/preview-server/file-existence-watchers.d.ts +13 -0
  52. package/dist/preview-server/file-existence-watchers.js +62 -0
  53. package/dist/preview-server/get-absolute-public-dir.d.ts +4 -0
  54. package/dist/preview-server/get-absolute-public-dir.js +14 -0
  55. package/dist/preview-server/get-package-manager.d.ts +10 -0
  56. package/dist/preview-server/get-package-manager.js +62 -0
  57. package/dist/preview-server/handler.d.ts +12 -0
  58. package/dist/preview-server/handler.js +36 -0
  59. package/dist/preview-server/hot-middleware/index.d.ts +102 -0
  60. package/dist/preview-server/hot-middleware/index.js +149 -0
  61. package/dist/preview-server/hot-middleware/types.d.ts +2 -0
  62. package/dist/preview-server/hot-middleware/types.js +2 -0
  63. package/dist/preview-server/live-events.d.ts +10 -0
  64. package/dist/preview-server/live-events.js +76 -0
  65. package/dist/preview-server/parse-body.d.ts +2 -0
  66. package/dist/preview-server/parse-body.js +16 -0
  67. package/dist/preview-server/project-info.d.ts +2 -0
  68. package/dist/preview-server/project-info.js +32 -0
  69. package/dist/preview-server/public-folder.d.ts +12 -0
  70. package/dist/preview-server/public-folder.js +58 -0
  71. package/dist/preview-server/routes/add-render.d.ts +3 -0
  72. package/dist/preview-server/routes/add-render.js +122 -0
  73. package/dist/preview-server/routes/can-update-default-props.d.ts +4 -0
  74. package/dist/preview-server/routes/can-update-default-props.js +40 -0
  75. package/dist/preview-server/routes/cancel-render.d.ts +3 -0
  76. package/dist/preview-server/routes/cancel-render.js +8 -0
  77. package/dist/preview-server/routes/copy-still-to-clipboard-handler.d.ts +3 -0
  78. package/dist/preview-server/routes/copy-still-to-clipboard-handler.js +17 -0
  79. package/dist/preview-server/routes/open-in-file-explorer.d.ts +3 -0
  80. package/dist/preview-server/routes/open-in-file-explorer.js +8 -0
  81. package/dist/preview-server/routes/remove-render.d.ts +3 -0
  82. package/dist/preview-server/routes/remove-render.js +8 -0
  83. package/dist/preview-server/routes/subscribe-to-file-existence.d.ts +3 -0
  84. package/dist/preview-server/routes/subscribe-to-file-existence.js +13 -0
  85. package/dist/preview-server/routes/unsubscribe-from-file-existence.d.ts +3 -0
  86. package/dist/preview-server/routes/unsubscribe-from-file-existence.js +13 -0
  87. package/dist/preview-server/routes/update-available.d.ts +3 -0
  88. package/dist/preview-server/routes/update-available.js +9 -0
  89. package/dist/preview-server/routes/update-default-props.d.ts +3 -0
  90. package/dist/preview-server/routes/update-default-props.js +34 -0
  91. package/dist/preview-server/serve-static.d.ts +14 -0
  92. package/dist/preview-server/serve-static.js +75 -0
  93. package/dist/preview-server/start-server.d.ts +31 -0
  94. package/dist/preview-server/start-server.js +123 -0
  95. package/dist/preview-server/update-available.d.ts +3 -0
  96. package/dist/preview-server/update-available.js +47 -0
  97. package/dist/routes.d.ts +24 -0
  98. package/dist/routes.js +242 -0
  99. package/dist/server-ready.d.ts +2 -0
  100. package/dist/server-ready.js +13 -0
  101. package/dist/start-studio.d.ts +26 -0
  102. package/dist/start-studio.js +117 -0
  103. package/dist/watch-root-file.d.ts +1 -0
  104. package/dist/watch-root-file.js +22 -0
  105. package/package.json +54 -0
  106. package/tsconfig.tsbuildinfo +1 -0
  107. package/web/beep.wav +0 -0
  108. package/web/favicon.png +0 -0
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Source code is adapted from
4
+ * https://github.com/webpack-contrib/webpack-hot-middleware#readme
5
+ * and rewritten in TypeScript. This file is MIT licensed
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.webpackHotMiddleware = void 0;
9
+ const renderer_1 = require("@remotion/renderer");
10
+ const studio_shared_1 = require("@remotion/studio-shared");
11
+ const node_url_1 = require("node:url");
12
+ const pathMatch = function (url, path) {
13
+ try {
14
+ return (0, node_url_1.parse)(url).pathname === path;
15
+ }
16
+ catch (e) {
17
+ return false;
18
+ }
19
+ };
20
+ const webpackHotMiddleware = (compiler) => {
21
+ const eventStream = createEventStream(studio_shared_1.hotMiddlewareOptions.heartbeat);
22
+ let latestStats = null;
23
+ compiler.hooks.invalid.tap('remotion', onInvalid);
24
+ compiler.hooks.done.tap('remotion', onDone);
25
+ function onInvalid() {
26
+ latestStats = null;
27
+ renderer_1.RenderInternals.Log.info('Building...');
28
+ eventStream === null || eventStream === void 0 ? void 0 : eventStream.publish({
29
+ action: 'building',
30
+ });
31
+ }
32
+ function onDone(statsResult) {
33
+ // Keep hold of latest stats so they can be propagated to new clients
34
+ latestStats = statsResult;
35
+ publishStats('built', latestStats, eventStream);
36
+ }
37
+ const middleware = function (req, res, next) {
38
+ if (!pathMatch(req.url, studio_shared_1.hotMiddlewareOptions.path))
39
+ return next();
40
+ eventStream === null || eventStream === void 0 ? void 0 : eventStream.handler(req, res);
41
+ if (latestStats) {
42
+ publishStats('sync', latestStats, eventStream);
43
+ }
44
+ };
45
+ return middleware;
46
+ };
47
+ exports.webpackHotMiddleware = webpackHotMiddleware;
48
+ function createEventStream(heartbeat) {
49
+ let clientId = 0;
50
+ let clients = {};
51
+ function everyClient(fn) {
52
+ Object.keys(clients).forEach((id) => {
53
+ fn(clients[id]);
54
+ });
55
+ }
56
+ const interval = setInterval(() => {
57
+ everyClient((client) => {
58
+ client.write('data: \uD83D\uDC93\n\n');
59
+ });
60
+ }, heartbeat).unref();
61
+ return {
62
+ close() {
63
+ clearInterval(interval);
64
+ everyClient((client) => {
65
+ if (!client.finished)
66
+ client.end();
67
+ });
68
+ clients = {};
69
+ },
70
+ handler(req, res) {
71
+ const headers = {
72
+ 'Access-Control-Allow-Origin': '*',
73
+ 'Content-Type': 'text/event-stream;charset=utf-8',
74
+ 'Cache-Control': 'no-cache, no-transform',
75
+ };
76
+ const isHttp1 = !(parseInt(req.httpVersion, 10) >= 2);
77
+ if (isHttp1) {
78
+ req.socket.setKeepAlive(true);
79
+ Object.assign(headers, {
80
+ Connection: 'keep-alive',
81
+ });
82
+ }
83
+ res.writeHead(200, headers);
84
+ res.write('\n');
85
+ const id = clientId++;
86
+ clients[id] = res;
87
+ req.on('close', () => {
88
+ if (!res.finished)
89
+ res.end();
90
+ delete clients[id];
91
+ });
92
+ },
93
+ publish(payload) {
94
+ everyClient((client) => {
95
+ client.write('data: ' + JSON.stringify(payload) + '\n\n');
96
+ });
97
+ },
98
+ };
99
+ }
100
+ function publishStats(action, statsResult, eventStream) {
101
+ const stats = statsResult.toJson({
102
+ all: false,
103
+ cached: true,
104
+ children: true,
105
+ modules: true,
106
+ timings: true,
107
+ hash: true,
108
+ });
109
+ // For multi-compiler, stats will be an object with a 'children' array of stats
110
+ const bundles = extractBundles(stats);
111
+ bundles.forEach((_stats) => {
112
+ let name = _stats.name || '';
113
+ // Fallback to compilation name in case of 1 bundle (if it exists)
114
+ if (bundles.length === 1 && !name && statsResult.compilation) {
115
+ name = statsResult.compilation.name || '';
116
+ }
117
+ eventStream === null || eventStream === void 0 ? void 0 : eventStream.publish({
118
+ name,
119
+ action,
120
+ time: _stats.time,
121
+ hash: _stats.hash,
122
+ warnings: _stats.warnings || [],
123
+ errors: _stats.errors || [],
124
+ modules: buildModuleMap(_stats.modules),
125
+ });
126
+ });
127
+ }
128
+ function extractBundles(stats) {
129
+ var _a;
130
+ // Stats has modules, single bundle
131
+ if (stats.modules)
132
+ return [stats];
133
+ // Stats has children, multiple bundles
134
+ if ((_a = stats.children) === null || _a === void 0 ? void 0 : _a.length)
135
+ return stats.children;
136
+ // Not sure, assume single
137
+ return [stats];
138
+ }
139
+ function buildModuleMap(modules) {
140
+ const map = {};
141
+ if (!modules) {
142
+ return map;
143
+ }
144
+ modules.forEach((module) => {
145
+ const id = module.id;
146
+ map[id] = module.name;
147
+ });
148
+ return map;
149
+ }
@@ -0,0 +1,2 @@
1
+ import type { webpack } from '@remotion/bundler';
2
+ export type WebpackStats = ReturnType<webpack.Stats['toJson']>;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ import type { EventSourceEvent } from '@remotion/studio-shared';
3
+ import type { IncomingMessage, ServerResponse } from 'node:http';
4
+ export type LiveEventsServer = {
5
+ sendEventToClient: (event: EventSourceEvent) => void;
6
+ router: (request: IncomingMessage, response: ServerResponse) => void;
7
+ };
8
+ export declare const makeLiveEventsRouter: () => LiveEventsServer;
9
+ export declare const waitForLiveEventsListener: () => Promise<LiveEventsServer>;
10
+ export declare const setLiveEventsListener: (listener: LiveEventsServer) => void;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setLiveEventsListener = exports.waitForLiveEventsListener = exports.makeLiveEventsRouter = void 0;
4
+ const server_ready_1 = require("../server-ready");
5
+ const file_existence_watchers_1 = require("./file-existence-watchers");
6
+ const serializeMessage = (message) => {
7
+ return `data: ${JSON.stringify(message)}\n\n`;
8
+ };
9
+ let printPortMessageTimeout = null;
10
+ const makeLiveEventsRouter = () => {
11
+ let clients = [];
12
+ const router = (request, response) => {
13
+ const headers = {
14
+ 'content-type': 'text/event-stream;charset=utf-8',
15
+ connection: 'keep-alive',
16
+ 'cache-control': 'no-cache',
17
+ };
18
+ response.writeHead(200, headers);
19
+ response.write('\n');
20
+ if (request.method === 'OPTIONS') {
21
+ response.end();
22
+ return;
23
+ }
24
+ const clientId = String(Math.random());
25
+ response.write(serializeMessage({ type: 'init', clientId }));
26
+ const newClient = {
27
+ id: clientId,
28
+ response,
29
+ };
30
+ clients.push(newClient);
31
+ if (printPortMessageTimeout) {
32
+ clearTimeout(printPortMessageTimeout);
33
+ }
34
+ request.on('close', () => {
35
+ (0, file_existence_watchers_1.unsubscribeClientFileExistenceWatchers)(clientId);
36
+ clients = clients.filter((client) => client.id !== clientId);
37
+ // If all clients disconnected, print a comment so user can easily restart it.
38
+ if (clients.length === 0) {
39
+ if (printPortMessageTimeout) {
40
+ clearTimeout(printPortMessageTimeout);
41
+ }
42
+ printPortMessageTimeout = setTimeout(() => {
43
+ (0, server_ready_1.printServerReadyComment)('To restart');
44
+ }, 2500);
45
+ }
46
+ });
47
+ };
48
+ const sendEventToClient = (event) => {
49
+ clients.forEach((client) => {
50
+ client.response.write(serializeMessage(event));
51
+ });
52
+ };
53
+ return {
54
+ sendEventToClient,
55
+ router,
56
+ };
57
+ };
58
+ exports.makeLiveEventsRouter = makeLiveEventsRouter;
59
+ let liveEventsListener = null;
60
+ const waiters = [];
61
+ const waitForLiveEventsListener = () => {
62
+ if (liveEventsListener) {
63
+ return Promise.resolve(liveEventsListener);
64
+ }
65
+ return new Promise((resolve) => {
66
+ waiters.push((list) => {
67
+ resolve(list);
68
+ });
69
+ });
70
+ };
71
+ exports.waitForLiveEventsListener = waitForLiveEventsListener;
72
+ const setLiveEventsListener = (listener) => {
73
+ liveEventsListener = listener;
74
+ waiters.forEach((w) => w(listener));
75
+ };
76
+ exports.setLiveEventsListener = setLiveEventsListener;
@@ -0,0 +1,2 @@
1
+ import type { IncomingMessage } from 'node:http';
2
+ export declare const parseRequestBody: (req: IncomingMessage) => Promise<unknown>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRequestBody = void 0;
4
+ const parseRequestBody = async (req) => {
5
+ const body = await new Promise((_resolve) => {
6
+ let data = '';
7
+ req.on('data', (chunk) => {
8
+ data += chunk;
9
+ });
10
+ req.on('end', () => {
11
+ _resolve(data.toString());
12
+ });
13
+ });
14
+ return JSON.parse(body);
15
+ };
16
+ exports.parseRequestBody = parseRequestBody;
@@ -0,0 +1,2 @@
1
+ import type { ProjectInfo } from '@remotion/studio-shared';
2
+ export declare const getProjectInfo: (remotionRoot: string) => Promise<ProjectInfo>;
@@ -0,0 +1,32 @@
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.getProjectInfo = void 0;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const getProjectInfo = (remotionRoot) => {
10
+ var _a;
11
+ const pathsToLookFor = [
12
+ 'src/Root.tsx',
13
+ 'src/Root.jsx',
14
+ 'remotion/Root.tsx',
15
+ 'remotion/Root.jsx',
16
+ 'app/remotion/Root.tsx',
17
+ 'src/Video.tsx',
18
+ 'src/Video.jsx',
19
+ 'src/remotion/Root.tsx',
20
+ 'src/remotion/Root.jsx',
21
+ ].map((p) => {
22
+ return node_path_1.default.join(remotionRoot, p);
23
+ });
24
+ const videoFile = (_a = pathsToLookFor.find((p) => (0, node_fs_1.existsSync)(p))) !== null && _a !== void 0 ? _a : null;
25
+ return Promise.resolve({
26
+ videoFile,
27
+ relativeVideoFile: videoFile
28
+ ? node_path_1.default.relative(remotionRoot, videoFile)
29
+ : null,
30
+ });
31
+ };
32
+ exports.getProjectInfo = getProjectInfo;
@@ -0,0 +1,12 @@
1
+ import type { StaticFile } from 'remotion';
2
+ export declare const initPublicFolderWatch: ({ publicDir, onUpdate, staticHash, }: {
3
+ publicDir: string;
4
+ remotionRoot: string;
5
+ onUpdate: () => void;
6
+ staticHash: string;
7
+ }) => void;
8
+ export declare const fetchFolder: ({ publicDir, staticHash, }: {
9
+ publicDir: string;
10
+ staticHash: string;
11
+ }) => void;
12
+ export declare const getFiles: () => StaticFile[];
@@ -0,0 +1,58 @@
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.getFiles = exports.fetchFolder = exports.initPublicFolderWatch = void 0;
7
+ const bundler_1 = require("@remotion/bundler");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const env_supports_fs_recursive_1 = require("./env-supports-fs-recursive");
11
+ let files = [];
12
+ const initPublicFolderWatch = ({ publicDir, onUpdate, staticHash, }) => {
13
+ (0, exports.fetchFolder)({ publicDir, staticHash });
14
+ watchPublicFolder({ publicDir, onUpdate, staticHash });
15
+ };
16
+ exports.initPublicFolderWatch = initPublicFolderWatch;
17
+ const fetchFolder = ({ publicDir, staticHash, }) => {
18
+ files = bundler_1.BundlerInternals.readRecursively({
19
+ folder: '.',
20
+ startPath: publicDir,
21
+ staticHash,
22
+ limit: 10000,
23
+ }).map((f) => {
24
+ return {
25
+ ...f,
26
+ name: f.name.split(node_path_1.default.sep).join('/'),
27
+ };
28
+ });
29
+ };
30
+ exports.fetchFolder = fetchFolder;
31
+ const watchPublicFolder = ({ publicDir, onUpdate, staticHash, }) => {
32
+ if (!(0, node_fs_1.existsSync)(publicDir)) {
33
+ const parentDir = node_path_1.default.dirname(publicDir);
34
+ const onDirChange = () => {
35
+ if ((0, node_fs_1.existsSync)(publicDir)) {
36
+ watchPublicFolder({
37
+ publicDir,
38
+ onUpdate,
39
+ staticHash,
40
+ });
41
+ onUpdate();
42
+ watcher.close();
43
+ }
44
+ };
45
+ const watcher = (0, node_fs_1.watch)(parentDir, {}, onDirChange);
46
+ return;
47
+ }
48
+ // Known bug: If whole public folder is deleted, this will not be called on macOS.
49
+ // This is not severe, so a wontfix for now.
50
+ (0, node_fs_1.watch)(publicDir, { recursive: (0, env_supports_fs_recursive_1.envSupportsFsRecursive)() }, () => {
51
+ (0, exports.fetchFolder)({ publicDir, staticHash });
52
+ onUpdate();
53
+ });
54
+ };
55
+ const getFiles = () => {
56
+ return files;
57
+ };
58
+ exports.getFiles = getFiles;
@@ -0,0 +1,3 @@
1
+ import type { AddRenderRequest } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const handleAddRender: ApiHandler<AddRenderRequest, undefined>;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleAddRender = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const handleAddRender = ({ input, entryPoint, remotionRoot, logLevel, methods: { addJob }, }) => {
6
+ const id = String(Math.random()).replace('0.', '');
7
+ if (input.type === 'video') {
8
+ addJob({
9
+ entryPoint,
10
+ remotionRoot,
11
+ job: {
12
+ cleanup: [],
13
+ codec: input.codec,
14
+ audioCodec: input.audioCodec,
15
+ compositionId: input.compositionId,
16
+ deletedOutputLocation: false,
17
+ type: 'video',
18
+ status: 'idle',
19
+ id,
20
+ imageFormat: input.imageFormat,
21
+ outName: input.outName,
22
+ jpegQuality: input.jpegQuality,
23
+ scale: input.scale,
24
+ startedAt: Date.now(),
25
+ logLevel: input.logLevel,
26
+ cancelToken: (0, renderer_1.makeCancelSignal)(),
27
+ concurrency: input.concurrency,
28
+ crf: input.crf,
29
+ endFrame: input.endFrame,
30
+ startFrame: input.startFrame,
31
+ muted: input.muted,
32
+ enforceAudioTrack: input.enforceAudioTrack,
33
+ proResProfile: input.proResProfile,
34
+ x264Preset: input.x264Preset,
35
+ pixelFormat: input.pixelFormat,
36
+ audioBitrate: input.audioBitrate,
37
+ videoBitrate: input.videoBitrate,
38
+ encodingMaxRate: input.encodingMaxRate,
39
+ encodingBufferSize: input.encodingBufferSize,
40
+ everyNthFrame: input.everyNthFrame,
41
+ numberOfGifLoops: input.numberOfGifLoops,
42
+ delayRenderTimeout: input.delayRenderTimeout,
43
+ disallowParallelEncoding: input.disallowParallelEncoding,
44
+ chromiumOptions: input.chromiumOptions,
45
+ envVariables: input.envVariables,
46
+ serializedInputPropsWithCustomSchema: input.serializedInputPropsWithCustomSchema,
47
+ offthreadVideoCacheSizeInBytes: input.offthreadVideoCacheSizeInBytes,
48
+ colorSpace: input.colorSpace,
49
+ multiProcessOnLinux: input.multiProcessOnLinux,
50
+ beepOnFinish: input.beepOnFinish,
51
+ repro: input.repro,
52
+ },
53
+ logLevel,
54
+ });
55
+ }
56
+ if (input.type === 'sequence') {
57
+ addJob({
58
+ entryPoint,
59
+ remotionRoot,
60
+ job: {
61
+ cleanup: [],
62
+ compositionId: input.compositionId,
63
+ deletedOutputLocation: false,
64
+ type: 'sequence',
65
+ status: 'idle',
66
+ id,
67
+ imageFormat: input.imageFormat,
68
+ outName: input.outName,
69
+ jpegQuality: input.jpegQuality,
70
+ scale: input.scale,
71
+ startedAt: Date.now(),
72
+ logLevel: input.logLevel,
73
+ cancelToken: (0, renderer_1.makeCancelSignal)(),
74
+ concurrency: input.concurrency,
75
+ endFrame: input.endFrame,
76
+ startFrame: input.startFrame,
77
+ delayRenderTimeout: input.delayRenderTimeout,
78
+ chromiumOptions: input.chromiumOptions,
79
+ envVariables: input.envVariables,
80
+ serializedInputPropsWithCustomSchema: input.serializedInputPropsWithCustomSchema,
81
+ offthreadVideoCacheSizeInBytes: input.offthreadVideoCacheSizeInBytes,
82
+ multiProcessOnLinux: input.multiProcessOnLinux,
83
+ beepOnFinish: input.beepOnFinish,
84
+ repro: input.repro,
85
+ },
86
+ logLevel,
87
+ });
88
+ }
89
+ if (input.type === 'still') {
90
+ addJob({
91
+ job: {
92
+ compositionId: input.compositionId,
93
+ id: String(Math.random()).replace('0.', ''),
94
+ startedAt: Date.now(),
95
+ type: 'still',
96
+ outName: input.outName,
97
+ status: 'idle',
98
+ imageFormat: input.imageFormat,
99
+ jpegQuality: input.jpegQuality,
100
+ frame: input.frame,
101
+ scale: input.scale,
102
+ cleanup: [],
103
+ deletedOutputLocation: false,
104
+ logLevel: input.logLevel,
105
+ cancelToken: (0, renderer_1.makeCancelSignal)(),
106
+ chromiumOptions: input.chromiumOptions,
107
+ delayRenderTimeout: input.delayRenderTimeout,
108
+ envVariables: input.envVariables,
109
+ serializedInputPropsWithCustomSchema: input.serializedInputPropsWithCustomSchema,
110
+ offthreadVideoCacheSizeInBytes: input.offthreadVideoCacheSizeInBytes,
111
+ multiProcessOnLinux: input.multiProcessOnLinux,
112
+ beepOnFinish: input.beepOnFinish,
113
+ repro: false,
114
+ },
115
+ entryPoint,
116
+ remotionRoot,
117
+ logLevel,
118
+ });
119
+ }
120
+ return Promise.resolve(undefined);
121
+ };
122
+ exports.handleAddRender = handleAddRender;
@@ -0,0 +1,4 @@
1
+ import type { CanUpdateDefaultPropsRequest, CanUpdateDefaultPropsResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const checkIfTypeScriptFile: (file: string) => void;
4
+ export declare const canUpdateDefaultPropsHandler: ApiHandler<CanUpdateDefaultPropsRequest, CanUpdateDefaultPropsResponse>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canUpdateDefaultPropsHandler = exports.checkIfTypeScriptFile = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const update_default_props_1 = require("../../codemods/update-default-props");
6
+ const project_info_1 = require("../project-info");
7
+ const checkIfTypeScriptFile = (file) => {
8
+ if (!file.endsWith('.tsx') &&
9
+ !file.endsWith('.ts') &&
10
+ !file.endsWith('.mtsx') &&
11
+ !file.endsWith('.mts')) {
12
+ throw new Error('Cannot update default props for non-TypeScript files');
13
+ }
14
+ };
15
+ exports.checkIfTypeScriptFile = checkIfTypeScriptFile;
16
+ const canUpdateDefaultPropsHandler = async ({ input: { compositionId }, remotionRoot }) => {
17
+ try {
18
+ const projectInfo = await (0, project_info_1.getProjectInfo)(remotionRoot);
19
+ if (!projectInfo.videoFile) {
20
+ throw new Error('Cannot find root file in project');
21
+ }
22
+ (0, exports.checkIfTypeScriptFile)(projectInfo.videoFile);
23
+ await (0, update_default_props_1.updateDefaultProps)({
24
+ compositionId,
25
+ input: (0, node_fs_1.readFileSync)(projectInfo.videoFile, 'utf-8'),
26
+ newDefaultProps: {},
27
+ enumPaths: [],
28
+ });
29
+ return {
30
+ canUpdate: true,
31
+ };
32
+ }
33
+ catch (err) {
34
+ return {
35
+ canUpdate: false,
36
+ reason: err.message,
37
+ };
38
+ }
39
+ };
40
+ exports.canUpdateDefaultPropsHandler = canUpdateDefaultPropsHandler;
@@ -0,0 +1,3 @@
1
+ import type { CancelRenderRequest, CancelRenderResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const handleCancelRender: ApiHandler<CancelRenderRequest, CancelRenderResponse>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleCancelRender = void 0;
4
+ const handleCancelRender = ({ input: { jobId }, methods: { cancelJob } }) => {
5
+ cancelJob(jobId);
6
+ return Promise.resolve({});
7
+ };
8
+ exports.handleCancelRender = handleCancelRender;
@@ -0,0 +1,3 @@
1
+ import type { CopyStillToClipboardRequest } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const handleCopyStillToClipboard: ApiHandler<CopyStillToClipboardRequest, void>;
@@ -0,0 +1,17 @@
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.handleCopyStillToClipboard = void 0;
7
+ const renderer_1 = require("@remotion/renderer");
8
+ const path_1 = __importDefault(require("path"));
9
+ const handleCopyStillToClipboard = ({ input: { outName }, remotionRoot }) => {
10
+ const resolved = path_1.default.resolve(remotionRoot, outName);
11
+ const relativeToProcessCwd = path_1.default.relative(remotionRoot, resolved);
12
+ if (relativeToProcessCwd.startsWith('..')) {
13
+ throw new Error(`Not allowed to open ${relativeToProcessCwd}`);
14
+ }
15
+ return renderer_1.RenderInternals.copyImageToClipboard(resolved, 'info');
16
+ };
17
+ exports.handleCopyStillToClipboard = handleCopyStillToClipboard;
@@ -0,0 +1,3 @@
1
+ import type { OpenInFileExplorerRequest } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const handleOpenInFileExplorer: ApiHandler<OpenInFileExplorerRequest, void>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleOpenInFileExplorer = void 0;
4
+ const open_directory_in_finder_1 = require("../../open-directory-in-finder");
5
+ const handleOpenInFileExplorer = ({ input: { directory }, remotionRoot }) => {
6
+ return (0, open_directory_in_finder_1.openDirectoryInFinder)(directory, remotionRoot);
7
+ };
8
+ exports.handleOpenInFileExplorer = handleOpenInFileExplorer;
@@ -0,0 +1,3 @@
1
+ import type { RemoveRenderRequest } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const handleRemoveRender: ApiHandler<RemoveRenderRequest, undefined>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleRemoveRender = void 0;
4
+ const handleRemoveRender = ({ input: { jobId }, methods: { removeJob }, }) => {
5
+ removeJob(jobId);
6
+ return Promise.resolve(undefined);
7
+ };
8
+ exports.handleRemoveRender = handleRemoveRender;
@@ -0,0 +1,3 @@
1
+ import type { SubscribeToFileExistenceRequest, SubscribeToFileExistenceResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const subscribeToFileExistence: ApiHandler<SubscribeToFileExistenceRequest, SubscribeToFileExistenceResponse>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.subscribeToFileExistence = void 0;
4
+ const file_existence_watchers_1 = require("../file-existence-watchers");
5
+ const subscribeToFileExistence = ({ input: { file, clientId }, remotionRoot }) => {
6
+ const { exists } = (0, file_existence_watchers_1.subscribeToFileExistenceWatchers)({
7
+ file,
8
+ remotionRoot,
9
+ clientId,
10
+ });
11
+ return Promise.resolve({ exists });
12
+ };
13
+ exports.subscribeToFileExistence = subscribeToFileExistence;
@@ -0,0 +1,3 @@
1
+ import type { UnsubscribeFromFileExistenceRequest } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const unsubscribeFromFileExistence: ApiHandler<UnsubscribeFromFileExistenceRequest, undefined>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unsubscribeFromFileExistence = void 0;
4
+ const file_existence_watchers_1 = require("../file-existence-watchers");
5
+ const unsubscribeFromFileExistence = ({ input, remotionRoot }) => {
6
+ (0, file_existence_watchers_1.unsubscribeFromFileExistenceWatchers)({
7
+ file: input.file,
8
+ clientId: input.clientId,
9
+ remotionRoot,
10
+ });
11
+ return Promise.resolve(undefined);
12
+ };
13
+ exports.unsubscribeFromFileExistence = unsubscribeFromFileExistence;
@@ -0,0 +1,3 @@
1
+ import type { UpdateAvailableRequest, UpdateAvailableResponse } from '@remotion/studio-shared';
2
+ import type { ApiHandler } from '../api-types';
3
+ export declare const handleUpdate: ApiHandler<UpdateAvailableRequest, UpdateAvailableResponse>;