@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.
- package/.eslintrc +13 -0
- package/.turbo/turbo-build.log +4 -0
- package/LICENSE.md +45 -0
- package/README.md +3 -0
- package/dist/ansi-diff.d.ts +41 -0
- package/dist/ansi-diff.js +220 -0
- package/dist/better-opn/index.d.ts +6 -0
- package/dist/better-opn/index.js +202 -0
- package/dist/codemods/update-default-props.d.ts +7 -0
- package/dist/codemods/update-default-props.js +137 -0
- package/dist/file-watcher.d.ts +9 -0
- package/dist/file-watcher.js +35 -0
- package/dist/get-latest-remotion-version.d.ts +1 -0
- package/dist/get-latest-remotion-version.js +31 -0
- package/dist/get-network-address.d.ts +1 -0
- package/dist/get-network-address.js +16 -0
- package/dist/helpers/get-file-source.d.ts +1 -0
- package/dist/helpers/get-file-source.js +22 -0
- package/dist/helpers/open-in-editor.d.ts +16 -0
- package/dist/helpers/open-in-editor.js +503 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.js +27 -0
- package/dist/max-timeline-tracks.d.ts +2 -0
- package/dist/max-timeline-tracks.js +25 -0
- package/dist/open-directory-in-finder.d.ts +1 -0
- package/dist/open-directory-in-finder.js +49 -0
- package/dist/preview-server/api-routes.d.ts +5 -0
- package/dist/preview-server/api-routes.js +25 -0
- package/dist/preview-server/api-types.d.ts +23 -0
- package/dist/preview-server/api-types.js +2 -0
- package/dist/preview-server/dev-middleware/compatible-api.d.ts +7 -0
- package/dist/preview-server/dev-middleware/compatible-api.js +20 -0
- package/dist/preview-server/dev-middleware/get-paths.d.ts +7 -0
- package/dist/preview-server/dev-middleware/get-paths.js +19 -0
- package/dist/preview-server/dev-middleware/index.d.ts +3 -0
- package/dist/preview-server/dev-middleware/index.js +27 -0
- package/dist/preview-server/dev-middleware/middleware.d.ts +9 -0
- package/dist/preview-server/dev-middleware/middleware.js +222 -0
- package/dist/preview-server/dev-middleware/range-parser.d.ts +15 -0
- package/dist/preview-server/dev-middleware/range-parser.js +96 -0
- package/dist/preview-server/dev-middleware/ready.d.ts +3 -0
- package/dist/preview-server/dev-middleware/ready.js +11 -0
- package/dist/preview-server/dev-middleware/setup-hooks.d.ts +2 -0
- package/dist/preview-server/dev-middleware/setup-hooks.js +52 -0
- package/dist/preview-server/dev-middleware/setup-output-filesystem.d.ts +2 -0
- package/dist/preview-server/dev-middleware/setup-output-filesystem.js +13 -0
- package/dist/preview-server/dev-middleware/types.d.ts +10 -0
- package/dist/preview-server/dev-middleware/types.js +2 -0
- package/dist/preview-server/env-supports-fs-recursive.d.ts +1 -0
- package/dist/preview-server/env-supports-fs-recursive.js +18 -0
- package/dist/preview-server/file-existence-watchers.d.ts +13 -0
- package/dist/preview-server/file-existence-watchers.js +62 -0
- package/dist/preview-server/get-absolute-public-dir.d.ts +4 -0
- package/dist/preview-server/get-absolute-public-dir.js +14 -0
- package/dist/preview-server/get-package-manager.d.ts +10 -0
- package/dist/preview-server/get-package-manager.js +62 -0
- package/dist/preview-server/handler.d.ts +12 -0
- package/dist/preview-server/handler.js +36 -0
- package/dist/preview-server/hot-middleware/index.d.ts +102 -0
- package/dist/preview-server/hot-middleware/index.js +149 -0
- package/dist/preview-server/hot-middleware/types.d.ts +2 -0
- package/dist/preview-server/hot-middleware/types.js +2 -0
- package/dist/preview-server/live-events.d.ts +10 -0
- package/dist/preview-server/live-events.js +76 -0
- package/dist/preview-server/parse-body.d.ts +2 -0
- package/dist/preview-server/parse-body.js +16 -0
- package/dist/preview-server/project-info.d.ts +2 -0
- package/dist/preview-server/project-info.js +32 -0
- package/dist/preview-server/public-folder.d.ts +12 -0
- package/dist/preview-server/public-folder.js +58 -0
- package/dist/preview-server/routes/add-render.d.ts +3 -0
- package/dist/preview-server/routes/add-render.js +122 -0
- package/dist/preview-server/routes/can-update-default-props.d.ts +4 -0
- package/dist/preview-server/routes/can-update-default-props.js +40 -0
- package/dist/preview-server/routes/cancel-render.d.ts +3 -0
- package/dist/preview-server/routes/cancel-render.js +8 -0
- package/dist/preview-server/routes/copy-still-to-clipboard-handler.d.ts +3 -0
- package/dist/preview-server/routes/copy-still-to-clipboard-handler.js +17 -0
- package/dist/preview-server/routes/open-in-file-explorer.d.ts +3 -0
- package/dist/preview-server/routes/open-in-file-explorer.js +8 -0
- package/dist/preview-server/routes/remove-render.d.ts +3 -0
- package/dist/preview-server/routes/remove-render.js +8 -0
- package/dist/preview-server/routes/subscribe-to-file-existence.d.ts +3 -0
- package/dist/preview-server/routes/subscribe-to-file-existence.js +13 -0
- package/dist/preview-server/routes/unsubscribe-from-file-existence.d.ts +3 -0
- package/dist/preview-server/routes/unsubscribe-from-file-existence.js +13 -0
- package/dist/preview-server/routes/update-available.d.ts +3 -0
- package/dist/preview-server/routes/update-available.js +9 -0
- package/dist/preview-server/routes/update-default-props.d.ts +3 -0
- package/dist/preview-server/routes/update-default-props.js +34 -0
- package/dist/preview-server/serve-static.d.ts +14 -0
- package/dist/preview-server/serve-static.js +75 -0
- package/dist/preview-server/start-server.d.ts +31 -0
- package/dist/preview-server/start-server.js +123 -0
- package/dist/preview-server/update-available.d.ts +3 -0
- package/dist/preview-server/update-available.js +47 -0
- package/dist/routes.d.ts +24 -0
- package/dist/routes.js +242 -0
- package/dist/server-ready.d.ts +2 -0
- package/dist/server-ready.js +13 -0
- package/dist/start-studio.d.ts +26 -0
- package/dist/start-studio.js +117 -0
- package/dist/watch-root-file.d.ts +1 -0
- package/dist/watch-root-file.js +22 -0
- package/package.json +54 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/web/beep.wav +0 -0
- package/web/favicon.png +0 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleUpdate = void 0;
|
|
4
|
+
const update_available_1 = require("../update-available");
|
|
5
|
+
const handleUpdate = async ({ remotionRoot }) => {
|
|
6
|
+
const data = await (0, update_available_1.isUpdateAvailableWithTimeout)(remotionRoot);
|
|
7
|
+
return data;
|
|
8
|
+
};
|
|
9
|
+
exports.handleUpdate = handleUpdate;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateDefaultPropsHandler = 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 can_update_default_props_1 = require("./can-update-default-props");
|
|
8
|
+
const updateDefaultPropsHandler = async ({ input: { compositionId, defaultProps, enumPaths }, remotionRoot }) => {
|
|
9
|
+
try {
|
|
10
|
+
const projectInfo = await (0, project_info_1.getProjectInfo)(remotionRoot);
|
|
11
|
+
if (!projectInfo.videoFile) {
|
|
12
|
+
throw new Error('Cannot find root file in project');
|
|
13
|
+
}
|
|
14
|
+
(0, can_update_default_props_1.checkIfTypeScriptFile)(projectInfo.videoFile);
|
|
15
|
+
const updated = await (0, update_default_props_1.updateDefaultProps)({
|
|
16
|
+
compositionId,
|
|
17
|
+
input: (0, node_fs_1.readFileSync)(projectInfo.videoFile, 'utf-8'),
|
|
18
|
+
newDefaultProps: JSON.parse(defaultProps),
|
|
19
|
+
enumPaths,
|
|
20
|
+
});
|
|
21
|
+
(0, node_fs_1.writeFileSync)(projectInfo.videoFile, updated);
|
|
22
|
+
return {
|
|
23
|
+
success: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
reason: err.message,
|
|
30
|
+
stack: err.stack,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.updateDefaultPropsHandler = updateDefaultPropsHandler;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* serve-static
|
|
3
|
+
* Copyright(c) 2010 Sencha Inc.
|
|
4
|
+
* Copyright(c) 2011 TJ Holowaychuk
|
|
5
|
+
* Copyright(c) 2014-2016 Douglas Christopher Wilson
|
|
6
|
+
* MIT Licensed
|
|
7
|
+
*/
|
|
8
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
9
|
+
export declare const serveStatic: ({ root, path, req, res, }: {
|
|
10
|
+
root: string;
|
|
11
|
+
path: string;
|
|
12
|
+
req: IncomingMessage;
|
|
13
|
+
res: ServerResponse;
|
|
14
|
+
}) => Promise<void>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* serve-static
|
|
4
|
+
* Copyright(c) 2010 Sencha Inc.
|
|
5
|
+
* Copyright(c) 2011 TJ Holowaychuk
|
|
6
|
+
* Copyright(c) 2014-2016 Douglas Christopher Wilson
|
|
7
|
+
* MIT Licensed
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.serveStatic = void 0;
|
|
11
|
+
const renderer_1 = require("@remotion/renderer");
|
|
12
|
+
const node_fs_1 = require("node:fs");
|
|
13
|
+
const middleware_1 = require("./dev-middleware/middleware");
|
|
14
|
+
const range_parser_1 = require("./dev-middleware/range-parser");
|
|
15
|
+
const serveStatic = async function ({ root, path, req, res, }) {
|
|
16
|
+
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
17
|
+
// method not allowed
|
|
18
|
+
res.statusCode = 405;
|
|
19
|
+
res.setHeader('Allow', 'GET, HEAD');
|
|
20
|
+
res.setHeader('Content-Length', '0');
|
|
21
|
+
res.end();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (!renderer_1.RenderInternals.isPathInside(path, root)) {
|
|
25
|
+
res.writeHead(500);
|
|
26
|
+
res.write('Not allowed to read');
|
|
27
|
+
res.end();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const exists = (0, node_fs_1.existsSync)(path);
|
|
31
|
+
if (!exists) {
|
|
32
|
+
res.writeHead(404);
|
|
33
|
+
res.write(`${path} does not exist`);
|
|
34
|
+
res.end();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const lstat = await node_fs_1.promises.lstat(path);
|
|
38
|
+
const isDirectory = lstat.isDirectory();
|
|
39
|
+
if (isDirectory) {
|
|
40
|
+
res.writeHead(500);
|
|
41
|
+
res.write('Is a directory');
|
|
42
|
+
res.end();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const hasRange = req.headers.range && lstat.size;
|
|
46
|
+
if (!hasRange) {
|
|
47
|
+
const readStream = (0, node_fs_1.createReadStream)(path);
|
|
48
|
+
res.setHeader('content-type', renderer_1.RenderInternals.mimeLookup(path) || 'application/octet-stream');
|
|
49
|
+
res.setHeader('content-length', lstat.size);
|
|
50
|
+
res.writeHead(200);
|
|
51
|
+
readStream.pipe(res);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const range = (0, range_parser_1.parseRange)(lstat.size, req.headers.range);
|
|
55
|
+
if (typeof range === 'object' && range.type === 'bytes') {
|
|
56
|
+
const { start, end } = range[0];
|
|
57
|
+
res.setHeader('content-type', renderer_1.RenderInternals.mimeLookup(path) || 'application/octet-stream');
|
|
58
|
+
res.setHeader('content-range', (0, middleware_1.getValueContentRangeHeader)('bytes', lstat.size, {
|
|
59
|
+
end,
|
|
60
|
+
start,
|
|
61
|
+
}));
|
|
62
|
+
res.setHeader('content-length', end - start + 1);
|
|
63
|
+
res.writeHead(206);
|
|
64
|
+
const readStream = (0, node_fs_1.createReadStream)(path, {
|
|
65
|
+
start,
|
|
66
|
+
end,
|
|
67
|
+
});
|
|
68
|
+
readStream.pipe(res);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
res.statusCode = 416;
|
|
72
|
+
res.setHeader('Content-Range', `bytes */${lstat.size}`);
|
|
73
|
+
res.end();
|
|
74
|
+
};
|
|
75
|
+
exports.serveStatic = serveStatic;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { WebpackOverrideFn } from '@remotion/bundler';
|
|
2
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
3
|
+
import type { RenderDefaults, RenderJob } from '@remotion/studio-shared';
|
|
4
|
+
import type { QueueMethods } from './api-types';
|
|
5
|
+
import type { LiveEventsServer } from './live-events';
|
|
6
|
+
export declare const startServer: (options: {
|
|
7
|
+
entry: string;
|
|
8
|
+
userDefinedComponent: string;
|
|
9
|
+
webpackOverride: WebpackOverrideFn;
|
|
10
|
+
getCurrentInputProps: () => object;
|
|
11
|
+
getEnvVariables: () => Record<string, string>;
|
|
12
|
+
port: number | null;
|
|
13
|
+
maxTimelineTracks?: number;
|
|
14
|
+
remotionRoot: string;
|
|
15
|
+
keyboardShortcutsEnabled: boolean;
|
|
16
|
+
publicDir: string;
|
|
17
|
+
userPassedPublicDir: string | null;
|
|
18
|
+
poll: number | null;
|
|
19
|
+
staticHash: string;
|
|
20
|
+
staticHashPrefix: string;
|
|
21
|
+
outputHash: string;
|
|
22
|
+
outputHashPrefix: string;
|
|
23
|
+
logLevel: LogLevel;
|
|
24
|
+
getRenderQueue: () => RenderJob[];
|
|
25
|
+
getRenderDefaults: () => RenderDefaults;
|
|
26
|
+
numberOfAudioTags: number;
|
|
27
|
+
queueMethods: QueueMethods;
|
|
28
|
+
}) => Promise<{
|
|
29
|
+
port: number;
|
|
30
|
+
liveEventsServer: LiveEventsServer;
|
|
31
|
+
}>;
|
|
@@ -0,0 +1,123 @@
|
|
|
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.startServer = void 0;
|
|
7
|
+
const bundler_1 = require("@remotion/bundler");
|
|
8
|
+
const renderer_1 = require("@remotion/renderer");
|
|
9
|
+
const studio_shared_1 = require("@remotion/studio-shared");
|
|
10
|
+
const node_http_1 = __importDefault(require("node:http"));
|
|
11
|
+
const routes_1 = require("../routes");
|
|
12
|
+
const dev_middleware_1 = require("./dev-middleware");
|
|
13
|
+
const hot_middleware_1 = require("./hot-middleware");
|
|
14
|
+
const live_events_1 = require("./live-events");
|
|
15
|
+
const startServer = async (options) => {
|
|
16
|
+
var _a, _b, _c;
|
|
17
|
+
const [, config] = bundler_1.BundlerInternals.webpackConfig({
|
|
18
|
+
entry: options.entry,
|
|
19
|
+
userDefinedComponent: options.userDefinedComponent,
|
|
20
|
+
outDir: null,
|
|
21
|
+
environment: 'development',
|
|
22
|
+
webpackOverride: options === null || options === void 0 ? void 0 : options.webpackOverride,
|
|
23
|
+
maxTimelineTracks: (_a = options === null || options === void 0 ? void 0 : options.maxTimelineTracks) !== null && _a !== void 0 ? _a : studio_shared_1.DEFAULT_TIMELINE_TRACKS,
|
|
24
|
+
remotionRoot: options.remotionRoot,
|
|
25
|
+
keyboardShortcutsEnabled: options.keyboardShortcutsEnabled,
|
|
26
|
+
poll: options.poll,
|
|
27
|
+
});
|
|
28
|
+
const compiler = (0, bundler_1.webpack)(config);
|
|
29
|
+
const wdmMiddleware = (0, dev_middleware_1.wdm)(compiler);
|
|
30
|
+
const whm = (0, hot_middleware_1.webpackHotMiddleware)(compiler);
|
|
31
|
+
const liveEventsServer = (0, live_events_1.makeLiveEventsRouter)();
|
|
32
|
+
const server = node_http_1.default.createServer((request, response) => {
|
|
33
|
+
new Promise((resolve) => {
|
|
34
|
+
wdmMiddleware(request, response, () => {
|
|
35
|
+
resolve();
|
|
36
|
+
});
|
|
37
|
+
})
|
|
38
|
+
.then(() => {
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
whm(request, response, () => {
|
|
41
|
+
resolve();
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
})
|
|
45
|
+
.then(() => {
|
|
46
|
+
(0, routes_1.handleRoutes)({
|
|
47
|
+
staticHash: options.staticHash,
|
|
48
|
+
staticHashPrefix: options.staticHashPrefix,
|
|
49
|
+
outputHash: options.outputHash,
|
|
50
|
+
outputHashPrefix: options.outputHashPrefix,
|
|
51
|
+
request: request,
|
|
52
|
+
response,
|
|
53
|
+
liveEventsServer,
|
|
54
|
+
getCurrentInputProps: options.getCurrentInputProps,
|
|
55
|
+
getEnvVariables: options.getEnvVariables,
|
|
56
|
+
remotionRoot: options.remotionRoot,
|
|
57
|
+
entryPoint: options.userDefinedComponent,
|
|
58
|
+
publicDir: options.publicDir,
|
|
59
|
+
logLevel: options.logLevel,
|
|
60
|
+
getRenderQueue: options.getRenderQueue,
|
|
61
|
+
getRenderDefaults: options.getRenderDefaults,
|
|
62
|
+
numberOfAudioTags: options.numberOfAudioTags,
|
|
63
|
+
queueMethods: options.queueMethods,
|
|
64
|
+
});
|
|
65
|
+
})
|
|
66
|
+
.catch((err) => {
|
|
67
|
+
renderer_1.RenderInternals.Log.error(`Error while calling ${request.url}`, err);
|
|
68
|
+
if (!response.headersSent) {
|
|
69
|
+
response.setHeader('content-type', 'application/json');
|
|
70
|
+
response.writeHead(500);
|
|
71
|
+
}
|
|
72
|
+
if (!response.writableEnded) {
|
|
73
|
+
response.end(JSON.stringify({
|
|
74
|
+
err: err.message,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
const desiredPort = (_c = (_b = options === null || options === void 0 ? void 0 : options.port) !== null && _b !== void 0 ? _b : (process.env.PORT ? Number(process.env.PORT) : undefined)) !== null && _c !== void 0 ? _c : undefined;
|
|
80
|
+
const maxTries = 5;
|
|
81
|
+
const portConfig = renderer_1.RenderInternals.getPortConfig();
|
|
82
|
+
for (let i = 0; i < maxTries; i++) {
|
|
83
|
+
try {
|
|
84
|
+
const selectedPort = await new Promise((resolve, reject) => {
|
|
85
|
+
renderer_1.RenderInternals.getDesiredPort({
|
|
86
|
+
desiredPort,
|
|
87
|
+
from: 3000,
|
|
88
|
+
to: 3100,
|
|
89
|
+
hostsToTry: portConfig.hostsToTry,
|
|
90
|
+
})
|
|
91
|
+
.then(({ port, unlockPort }) => {
|
|
92
|
+
server.listen({
|
|
93
|
+
port,
|
|
94
|
+
host: portConfig.host,
|
|
95
|
+
});
|
|
96
|
+
server.on('listening', () => {
|
|
97
|
+
resolve(port);
|
|
98
|
+
return unlockPort();
|
|
99
|
+
});
|
|
100
|
+
server.on('error', (err) => {
|
|
101
|
+
reject(err);
|
|
102
|
+
});
|
|
103
|
+
})
|
|
104
|
+
.catch((err) => reject(err));
|
|
105
|
+
});
|
|
106
|
+
return { port: selectedPort, liveEventsServer };
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
if (!(err instanceof Error)) {
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
const codedError = err;
|
|
113
|
+
if (codedError.code === 'EADDRINUSE') {
|
|
114
|
+
renderer_1.RenderInternals.Log.error(`Port ${codedError.port} is already in use. Trying another port...`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
throw err;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
throw new Error(`Tried ${maxTries} times to find a free port. Giving up.`);
|
|
122
|
+
};
|
|
123
|
+
exports.startServer = startServer;
|
|
@@ -0,0 +1,47 @@
|
|
|
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.isUpdateAvailableWithTimeout = exports.getRemotionVersion = void 0;
|
|
7
|
+
const semver_1 = __importDefault(require("semver"));
|
|
8
|
+
const get_latest_remotion_version_1 = require("../get-latest-remotion-version");
|
|
9
|
+
const get_package_manager_1 = require("./get-package-manager");
|
|
10
|
+
const isUpdateAvailable = async ({ remotionRoot, currentVersion, }) => {
|
|
11
|
+
const latest = await (0, get_latest_remotion_version_1.getLatestRemotionVersion)();
|
|
12
|
+
const pkgManager = (0, get_package_manager_1.getPackageManager)(remotionRoot, undefined);
|
|
13
|
+
return {
|
|
14
|
+
updateAvailable: semver_1.default.lt(currentVersion, latest),
|
|
15
|
+
currentVersion,
|
|
16
|
+
latestVersion: latest,
|
|
17
|
+
timedOut: false,
|
|
18
|
+
packageManager: pkgManager === 'unknown' ? 'unknown' : pkgManager.manager,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
const getRemotionVersion = () => {
|
|
22
|
+
// careful when refactoring this file, path must be adjusted
|
|
23
|
+
const packageJson = require('../../package.json');
|
|
24
|
+
const { version } = packageJson;
|
|
25
|
+
return version;
|
|
26
|
+
};
|
|
27
|
+
exports.getRemotionVersion = getRemotionVersion;
|
|
28
|
+
const isUpdateAvailableWithTimeout = (remotionRoot) => {
|
|
29
|
+
const version = (0, exports.getRemotionVersion)();
|
|
30
|
+
const threeSecTimeout = new Promise((resolve) => {
|
|
31
|
+
const pkgManager = (0, get_package_manager_1.getPackageManager)(remotionRoot, undefined);
|
|
32
|
+
setTimeout(() => {
|
|
33
|
+
resolve({
|
|
34
|
+
currentVersion: version,
|
|
35
|
+
latestVersion: version,
|
|
36
|
+
updateAvailable: false,
|
|
37
|
+
timedOut: true,
|
|
38
|
+
packageManager: pkgManager === 'unknown' ? 'unknown' : pkgManager.manager,
|
|
39
|
+
});
|
|
40
|
+
}, 3000);
|
|
41
|
+
});
|
|
42
|
+
return Promise.race([
|
|
43
|
+
threeSecTimeout,
|
|
44
|
+
isUpdateAvailable({ remotionRoot, currentVersion: version }),
|
|
45
|
+
]);
|
|
46
|
+
};
|
|
47
|
+
exports.isUpdateAvailableWithTimeout = isUpdateAvailableWithTimeout;
|
package/dist/routes.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
2
|
+
import type { RenderDefaults, RenderJob } from '@remotion/studio-shared';
|
|
3
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
4
|
+
import type { QueueMethods } from './preview-server/api-types';
|
|
5
|
+
import type { LiveEventsServer } from './preview-server/live-events';
|
|
6
|
+
export declare const handleRoutes: ({ staticHash, staticHashPrefix, outputHash, outputHashPrefix, request, response, liveEventsServer, getCurrentInputProps, getEnvVariables, remotionRoot, entryPoint, publicDir, logLevel, getRenderQueue, getRenderDefaults, numberOfAudioTags, queueMethods: methods, }: {
|
|
7
|
+
staticHash: string;
|
|
8
|
+
staticHashPrefix: string;
|
|
9
|
+
outputHash: string;
|
|
10
|
+
outputHashPrefix: string;
|
|
11
|
+
request: IncomingMessage;
|
|
12
|
+
response: ServerResponse;
|
|
13
|
+
liveEventsServer: LiveEventsServer;
|
|
14
|
+
getCurrentInputProps: () => object;
|
|
15
|
+
getEnvVariables: () => Record<string, string>;
|
|
16
|
+
remotionRoot: string;
|
|
17
|
+
entryPoint: string;
|
|
18
|
+
publicDir: string;
|
|
19
|
+
logLevel: LogLevel;
|
|
20
|
+
getRenderQueue: () => RenderJob[];
|
|
21
|
+
getRenderDefaults: () => RenderDefaults;
|
|
22
|
+
numberOfAudioTags: number;
|
|
23
|
+
queueMethods: QueueMethods;
|
|
24
|
+
}) => void | Promise<void> | Promise<ServerResponse<IncomingMessage> | undefined>;
|
package/dist/routes.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.handleRoutes = void 0;
|
|
27
|
+
const bundler_1 = require("@remotion/bundler");
|
|
28
|
+
const studio_shared_1 = require("@remotion/studio-shared");
|
|
29
|
+
const node_fs_1 = require("node:fs");
|
|
30
|
+
const node_path_1 = __importStar(require("node:path"));
|
|
31
|
+
const node_url_1 = require("node:url");
|
|
32
|
+
const get_file_source_1 = require("./helpers/get-file-source");
|
|
33
|
+
const open_in_editor_1 = require("./helpers/open-in-editor");
|
|
34
|
+
const api_routes_1 = require("./preview-server/api-routes");
|
|
35
|
+
const get_package_manager_1 = require("./preview-server/get-package-manager");
|
|
36
|
+
const handler_1 = require("./preview-server/handler");
|
|
37
|
+
const parse_body_1 = require("./preview-server/parse-body");
|
|
38
|
+
const project_info_1 = require("./preview-server/project-info");
|
|
39
|
+
const public_folder_1 = require("./preview-server/public-folder");
|
|
40
|
+
const serve_static_1 = require("./preview-server/serve-static");
|
|
41
|
+
const editorGuess = (0, open_in_editor_1.guessEditor)();
|
|
42
|
+
const static404 = (response) => {
|
|
43
|
+
response.writeHead(404);
|
|
44
|
+
response.end('The static/ prefix has been changed, this URL is no longer valid.');
|
|
45
|
+
};
|
|
46
|
+
const output404 = (response) => {
|
|
47
|
+
response.writeHead(404);
|
|
48
|
+
response.end('The outputs/ prefix has been changed, this URL is no longer valid.');
|
|
49
|
+
};
|
|
50
|
+
const handleFallback = async ({ remotionRoot, hash, response, getCurrentInputProps, getEnvVariables, publicDir, getRenderQueue, getRenderDefaults, numberOfAudioTags, }) => {
|
|
51
|
+
const [edit] = await editorGuess;
|
|
52
|
+
const displayName = (0, open_in_editor_1.getDisplayNameForEditor)(edit ? edit.command : null);
|
|
53
|
+
response.setHeader('content-type', 'text/html');
|
|
54
|
+
response.writeHead(200);
|
|
55
|
+
const packageManager = (0, get_package_manager_1.getPackageManager)(remotionRoot, undefined);
|
|
56
|
+
(0, public_folder_1.fetchFolder)({ publicDir, staticHash: hash });
|
|
57
|
+
response.end(bundler_1.BundlerInternals.indexHtml({
|
|
58
|
+
staticHash: hash,
|
|
59
|
+
baseDir: '/',
|
|
60
|
+
editorName: displayName,
|
|
61
|
+
envVariables: getEnvVariables(),
|
|
62
|
+
inputProps: getCurrentInputProps(),
|
|
63
|
+
remotionRoot,
|
|
64
|
+
studioServerCommand: packageManager === 'unknown' ? null : packageManager.startCommand,
|
|
65
|
+
renderQueue: getRenderQueue(),
|
|
66
|
+
numberOfAudioTags,
|
|
67
|
+
publicFiles: (0, public_folder_1.getFiles)(),
|
|
68
|
+
includeFavicon: true,
|
|
69
|
+
title: 'Remotion Studio',
|
|
70
|
+
renderDefaults: getRenderDefaults(),
|
|
71
|
+
publicFolderExists: (0, node_fs_1.existsSync)(publicDir) ? publicDir : null,
|
|
72
|
+
}));
|
|
73
|
+
};
|
|
74
|
+
const handleProjectInfo = async (remotionRoot, _, response) => {
|
|
75
|
+
const data = await (0, project_info_1.getProjectInfo)(remotionRoot);
|
|
76
|
+
response.setHeader('content-type', 'application/json');
|
|
77
|
+
response.writeHead(200);
|
|
78
|
+
response.end(JSON.stringify(data));
|
|
79
|
+
};
|
|
80
|
+
const handleFileSource = async ({ method, remotionRoot, search, response, }) => {
|
|
81
|
+
if (method === 'OPTIONS') {
|
|
82
|
+
response.writeHead(200);
|
|
83
|
+
response.end();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!search.startsWith('?')) {
|
|
87
|
+
throw new Error('query must start with ?');
|
|
88
|
+
}
|
|
89
|
+
const query = new node_url_1.URLSearchParams(search);
|
|
90
|
+
const f = query.get('f');
|
|
91
|
+
if (typeof f !== 'string') {
|
|
92
|
+
throw new Error('must pass `f` parameter');
|
|
93
|
+
}
|
|
94
|
+
const data = await (0, get_file_source_1.getFileSource)(remotionRoot, decodeURIComponent(f));
|
|
95
|
+
response.writeHead(200);
|
|
96
|
+
response.write(data);
|
|
97
|
+
return response.end();
|
|
98
|
+
};
|
|
99
|
+
const handleOpenInEditor = async (remotionRoot, req, res) => {
|
|
100
|
+
if (req.method === 'OPTIONS') {
|
|
101
|
+
res.statusCode = 200;
|
|
102
|
+
res.end();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const body = (await (0, parse_body_1.parseRequestBody)(req));
|
|
107
|
+
if (!('stack' in body)) {
|
|
108
|
+
throw new TypeError('Need to pass stack');
|
|
109
|
+
}
|
|
110
|
+
const stack = body.stack;
|
|
111
|
+
const guess = await editorGuess;
|
|
112
|
+
const didOpen = await (0, open_in_editor_1.launchEditor)({
|
|
113
|
+
colNumber: stack.originalColumnNumber,
|
|
114
|
+
editor: guess[0],
|
|
115
|
+
fileName: node_path_1.default.resolve(remotionRoot, stack.originalFileName),
|
|
116
|
+
lineNumber: stack.originalLineNumber,
|
|
117
|
+
vsCodeNewWindow: false,
|
|
118
|
+
});
|
|
119
|
+
res.setHeader('content-type', 'application/json');
|
|
120
|
+
res.writeHead(200);
|
|
121
|
+
res.end(JSON.stringify({
|
|
122
|
+
success: didOpen,
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
res.setHeader('content-type', 'application/json');
|
|
127
|
+
res.writeHead(200);
|
|
128
|
+
res.end(JSON.stringify({
|
|
129
|
+
success: false,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const handleFavicon = (_, response) => {
|
|
134
|
+
const filePath = node_path_1.default.join(__dirname, '..', 'web', 'favicon.png');
|
|
135
|
+
const stat = (0, node_fs_1.statSync)(filePath);
|
|
136
|
+
response.writeHead(200, {
|
|
137
|
+
'Content-Type': 'image/png',
|
|
138
|
+
'Content-Length': stat.size,
|
|
139
|
+
});
|
|
140
|
+
const readStream = (0, node_fs_1.createReadStream)(filePath);
|
|
141
|
+
readStream.pipe(response);
|
|
142
|
+
};
|
|
143
|
+
const handleBeep = (_, response) => {
|
|
144
|
+
const filePath = node_path_1.default.join(__dirname, '..', 'web', 'beep.wav');
|
|
145
|
+
const stat = (0, node_fs_1.statSync)(filePath);
|
|
146
|
+
response.writeHead(200, {
|
|
147
|
+
'Content-Type': 'audio/wav',
|
|
148
|
+
'Content-Length': stat.size,
|
|
149
|
+
});
|
|
150
|
+
const readStream = (0, node_fs_1.createReadStream)(filePath);
|
|
151
|
+
readStream.pipe(response);
|
|
152
|
+
};
|
|
153
|
+
const handleWasm = (_, response) => {
|
|
154
|
+
const filePath = node_path_1.default.resolve(require.resolve('source-map'), '..', 'lib', 'mappings.wasm');
|
|
155
|
+
const stat = (0, node_fs_1.statSync)(filePath);
|
|
156
|
+
response.writeHead(200, {
|
|
157
|
+
'Content-Type': 'application/wasm',
|
|
158
|
+
'Content-Length': stat.size,
|
|
159
|
+
});
|
|
160
|
+
const readStream = (0, node_fs_1.createReadStream)(filePath);
|
|
161
|
+
readStream.pipe(response);
|
|
162
|
+
};
|
|
163
|
+
const handleRoutes = ({ staticHash, staticHashPrefix, outputHash, outputHashPrefix, request, response, liveEventsServer, getCurrentInputProps, getEnvVariables, remotionRoot, entryPoint, publicDir, logLevel, getRenderQueue, getRenderDefaults, numberOfAudioTags, queueMethods: methods, }) => {
|
|
164
|
+
const url = new URL(request.url, 'http://localhost');
|
|
165
|
+
if (url.pathname === '/api/project-info') {
|
|
166
|
+
return handleProjectInfo(remotionRoot, request, response);
|
|
167
|
+
}
|
|
168
|
+
if (url.pathname === '/api/file-source') {
|
|
169
|
+
return handleFileSource({
|
|
170
|
+
remotionRoot,
|
|
171
|
+
search: url.search,
|
|
172
|
+
method: request.method,
|
|
173
|
+
response,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
if (url.pathname === '/api/open-in-editor') {
|
|
177
|
+
return handleOpenInEditor(remotionRoot, request, response);
|
|
178
|
+
}
|
|
179
|
+
for (const [key, value] of Object.entries(api_routes_1.allApiRoutes)) {
|
|
180
|
+
if (url.pathname === key) {
|
|
181
|
+
return (0, handler_1.handleRequest)({
|
|
182
|
+
remotionRoot,
|
|
183
|
+
entryPoint,
|
|
184
|
+
handler: value,
|
|
185
|
+
request,
|
|
186
|
+
response,
|
|
187
|
+
logLevel,
|
|
188
|
+
methods,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (url.pathname === '/remotion.png') {
|
|
193
|
+
return handleFavicon(request, response);
|
|
194
|
+
}
|
|
195
|
+
if (url.pathname === '/beep.wav') {
|
|
196
|
+
return handleBeep(request, response);
|
|
197
|
+
}
|
|
198
|
+
if (url.pathname === studio_shared_1.SOURCE_MAP_ENDPOINT) {
|
|
199
|
+
return handleWasm(request, response);
|
|
200
|
+
}
|
|
201
|
+
if (url.pathname === '/events') {
|
|
202
|
+
return liveEventsServer.router(request, response);
|
|
203
|
+
}
|
|
204
|
+
if (url.pathname.startsWith(staticHash)) {
|
|
205
|
+
const filename = new URL(request.url, 'http://localhost').pathname.replace(new RegExp(`^${staticHash}`), '');
|
|
206
|
+
const filePath = (0, node_path_1.join)(publicDir, decodeURIComponent(filename));
|
|
207
|
+
return (0, serve_static_1.serveStatic)({
|
|
208
|
+
root: publicDir,
|
|
209
|
+
path: filePath,
|
|
210
|
+
req: request,
|
|
211
|
+
res: response,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
if (url.pathname.startsWith(staticHashPrefix)) {
|
|
215
|
+
return static404(response);
|
|
216
|
+
}
|
|
217
|
+
if (url.pathname.startsWith(outputHash)) {
|
|
218
|
+
const filename = new URL(request.url, 'http://localhost').pathname.replace(new RegExp(`^${outputHash}`), '');
|
|
219
|
+
const filePath = (0, node_path_1.join)(remotionRoot, decodeURIComponent(filename));
|
|
220
|
+
return (0, serve_static_1.serveStatic)({
|
|
221
|
+
root: remotionRoot,
|
|
222
|
+
path: filePath,
|
|
223
|
+
req: request,
|
|
224
|
+
res: response,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
if (url.pathname.startsWith(outputHashPrefix)) {
|
|
228
|
+
return output404(response);
|
|
229
|
+
}
|
|
230
|
+
return handleFallback({
|
|
231
|
+
remotionRoot,
|
|
232
|
+
hash: staticHash,
|
|
233
|
+
response,
|
|
234
|
+
getCurrentInputProps,
|
|
235
|
+
getEnvVariables,
|
|
236
|
+
publicDir,
|
|
237
|
+
getRenderQueue,
|
|
238
|
+
getRenderDefaults,
|
|
239
|
+
numberOfAudioTags,
|
|
240
|
+
});
|
|
241
|
+
};
|
|
242
|
+
exports.handleRoutes = handleRoutes;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.printServerReadyComment = exports.setServerReadyComment = void 0;
|
|
4
|
+
const renderer_1 = require("@remotion/renderer");
|
|
5
|
+
let message = null;
|
|
6
|
+
const setServerReadyComment = (newMessage) => {
|
|
7
|
+
message = newMessage;
|
|
8
|
+
};
|
|
9
|
+
exports.setServerReadyComment = setServerReadyComment;
|
|
10
|
+
const printServerReadyComment = (prefix) => {
|
|
11
|
+
renderer_1.RenderInternals.Log.info(`${prefix} - ${message}`);
|
|
12
|
+
};
|
|
13
|
+
exports.printServerReadyComment = printServerReadyComment;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { WebpackOverrideFn } from '@remotion/bundler';
|
|
2
|
+
import type { LogLevel } from '@remotion/renderer';
|
|
3
|
+
import type { RenderDefaults, RenderJob } from '@remotion/studio-shared';
|
|
4
|
+
import type { QueueMethods } from './preview-server/api-types';
|
|
5
|
+
export declare const startStudio: ({ browserArgs, browserFlag, configValueShouldOpenBrowser, fullEntryPath, logLevel, getCurrentInputProps, getEnvVariables, desiredPort, maxTimelineTracks, remotionRoot, keyboardShortcutsEnabled, userPassedPublicDir, webpackOverride, poll, getRenderDefaults, getRenderQueue, numberOfAudioTags, queueMethods, parsedCliOpen, previewEntry, }: {
|
|
6
|
+
browserArgs: string;
|
|
7
|
+
browserFlag: string;
|
|
8
|
+
logLevel: LogLevel;
|
|
9
|
+
configValueShouldOpenBrowser: boolean;
|
|
10
|
+
fullEntryPath: string;
|
|
11
|
+
getCurrentInputProps: () => object;
|
|
12
|
+
getEnvVariables: () => Record<string, string>;
|
|
13
|
+
desiredPort: number | null;
|
|
14
|
+
maxTimelineTracks: number;
|
|
15
|
+
remotionRoot: string;
|
|
16
|
+
keyboardShortcutsEnabled: boolean;
|
|
17
|
+
userPassedPublicDir: string | null;
|
|
18
|
+
webpackOverride: WebpackOverrideFn;
|
|
19
|
+
poll: number | null;
|
|
20
|
+
getRenderDefaults: () => RenderDefaults;
|
|
21
|
+
getRenderQueue: () => RenderJob[];
|
|
22
|
+
numberOfAudioTags: number;
|
|
23
|
+
queueMethods: QueueMethods;
|
|
24
|
+
parsedCliOpen: boolean;
|
|
25
|
+
previewEntry: string;
|
|
26
|
+
}) => Promise<void>;
|