@remotion/cli 3.3.8 → 3.3.9

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 (56) hide show
  1. package/dist/config/log.d.ts +1 -1
  2. package/dist/editor/components/RenderButton.d.ts +6 -0
  3. package/dist/editor/components/RenderButton.js +53 -0
  4. package/dist/editor/components/RenderModal/RenderModal.d.ts +5 -0
  5. package/dist/editor/components/RenderModal/RenderModal.js +90 -0
  6. package/dist/editor/components/RenderQueue/RenderQueueItem.d.ts +5 -0
  7. package/dist/editor/components/RenderQueue/RenderQueueItem.js +25 -0
  8. package/dist/editor/components/RenderQueue/RenderQueueItemStatus.d.ts +5 -0
  9. package/dist/editor/components/RenderQueue/RenderQueueItemStatus.js +19 -0
  10. package/dist/editor/components/RenderQueue/RenderQueueOutputName.d.ts +5 -0
  11. package/dist/editor/components/RenderQueue/RenderQueueOutputName.js +70 -0
  12. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.d.ts +5 -0
  13. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.js +56 -0
  14. package/dist/editor/components/RenderQueue/context.d.ts +18 -0
  15. package/dist/editor/components/RenderQueue/context.js +49 -0
  16. package/dist/editor/components/RenderQueue/index.d.ts +2 -0
  17. package/dist/editor/components/RenderQueue/index.js +18 -0
  18. package/dist/editor/components/RendersTab.d.ts +6 -0
  19. package/dist/editor/components/RendersTab.js +40 -0
  20. package/dist/editor/components/SidebarContent.d.ts +5 -0
  21. package/dist/editor/components/SidebarContent.js +34 -0
  22. package/dist/editor/components/Tabs/index.d.ts +11 -0
  23. package/dist/editor/components/Tabs/index.js +49 -0
  24. package/dist/editor/icons/render.d.ts +6 -0
  25. package/dist/editor/icons/render.js +8 -0
  26. package/dist/find-closest-package-json.d.ts +2 -0
  27. package/dist/find-closest-package-json.js +35 -0
  28. package/dist/get-cli-options.d.ts +1 -1
  29. package/dist/get-default-out-name.d.ts +4 -0
  30. package/dist/get-default-out-name.js +8 -0
  31. package/dist/index.d.ts +1 -1
  32. package/dist/preview-server/get-absolute-public-dir.d.ts +4 -0
  33. package/dist/preview-server/get-absolute-public-dir.js +14 -0
  34. package/dist/preview-server/get-files-in-public-folder.d.ts +2 -0
  35. package/dist/preview-server/get-files-in-public-folder.js +7 -0
  36. package/dist/preview-server/live-event-listener.d.ts +0 -0
  37. package/dist/preview-server/live-event-listener.js +1 -0
  38. package/dist/preview-server/parse-body.d.ts +2 -0
  39. package/dist/preview-server/parse-body.js +16 -0
  40. package/dist/preview-server/public-folder.d.ts +12 -0
  41. package/dist/preview-server/public-folder.js +39 -0
  42. package/dist/preview-server/render-queue/add-render.d.ts +2 -0
  43. package/dist/preview-server/render-queue/add-render.js +39 -0
  44. package/dist/preview-server/render-queue/index.d.ts +7 -0
  45. package/dist/preview-server/render-queue/index.js +105 -0
  46. package/dist/preview-server/render-queue/job.d.ts +29 -0
  47. package/dist/preview-server/render-queue/job.js +2 -0
  48. package/dist/preview-server/render-queue/open-directory-in-finder.d.ts +1 -0
  49. package/dist/preview-server/render-queue/open-directory-in-finder.js +32 -0
  50. package/dist/preview-server/render-queue/open-in-file-explorer.d.ts +2 -0
  51. package/dist/preview-server/render-queue/open-in-file-explorer.js +30 -0
  52. package/dist/preview-server/render-queue/remove-render.d.ts +2 -0
  53. package/dist/preview-server/render-queue/remove-render.js +28 -0
  54. package/dist/preview-server/write-files-definition-file.d.ts +2 -0
  55. package/dist/preview-server/write-files-definition-file.js +37 -0
  56. package/package.json +7 -7
@@ -1,3 +1,3 @@
1
1
  import type { LogLevel } from '@remotion/renderer';
2
- export declare const getLogLevel: () => "error" | "verbose" | "info" | "warn";
2
+ export declare const getLogLevel: () => "verbose" | "info" | "warn" | "error";
3
3
  export declare const setLogLevel: (newLogLevel: LogLevel) => void;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { TCompMetadata } from 'remotion';
3
+ export declare const COMPOSITION_ITEM_HEIGHT = 32;
4
+ export declare const RenderButton: React.FC<{
5
+ composition: TCompMetadata;
6
+ }>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderButton = exports.COMPOSITION_ITEM_HEIGHT = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../helpers/colors");
7
+ const render_1 = require("../icons/render");
8
+ const modals_1 = require("../state/modals");
9
+ const z_index_1 = require("../state/z-index");
10
+ exports.COMPOSITION_ITEM_HEIGHT = 32;
11
+ const itemStyle = {
12
+ display: 'flex',
13
+ cursor: 'default',
14
+ alignItems: 'center',
15
+ justifyContent: 'center',
16
+ marginBottom: 1,
17
+ appearance: 'none',
18
+ border: 'none',
19
+ height: exports.COMPOSITION_ITEM_HEIGHT,
20
+ };
21
+ const RenderButton = ({ composition }) => {
22
+ const [hovered, setHovered] = (0, react_1.useState)(false);
23
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
24
+ const onPointerEnter = (0, react_1.useCallback)(() => {
25
+ setHovered(true);
26
+ }, []);
27
+ const onPointerLeave = (0, react_1.useCallback)(() => {
28
+ setHovered(false);
29
+ }, []);
30
+ const { tabIndex } = (0, z_index_1.useZIndex)();
31
+ const style = (0, react_1.useMemo)(() => {
32
+ return {
33
+ ...itemStyle,
34
+ backgroundColor: hovered ? colors_1.CLEAR_HOVER : 'transparent',
35
+ color: hovered ? 'white' : colors_1.LIGHT_TEXT,
36
+ };
37
+ }, [hovered]);
38
+ const iconStyle = (0, react_1.useMemo)(() => {
39
+ return {
40
+ style: {
41
+ height: 14,
42
+ },
43
+ };
44
+ }, []);
45
+ const onClick = (0, react_1.useCallback)(() => {
46
+ setSelectedModal({
47
+ type: 'render',
48
+ composition,
49
+ });
50
+ }, [composition, setSelectedModal]);
51
+ return ((0, jsx_runtime_1.jsx)("button", { style: style, tabIndex: tabIndex, onClick: onClick, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, type: "button", children: (0, jsx_runtime_1.jsx)(render_1.RenderIcon, { svgProps: iconStyle, color: hovered ? 'white' : colors_1.LIGHT_TEXT }) }));
52
+ };
53
+ exports.RenderButton = RenderButton;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { TCompMetadata } from 'remotion';
3
+ export declare const RenderModal: React.FC<{
4
+ composition: TCompMetadata;
5
+ }>;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderModal = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const get_default_out_name_1 = require("../../../get-default-out-name");
7
+ const Button_1 = require("../../../preview-server/error-overlay/remotion-overlay/Button");
8
+ const modals_1 = require("../../state/modals");
9
+ const layout_1 = require("../layout");
10
+ const ModalContainer_1 = require("../ModalContainer");
11
+ const ModalHeader_1 = require("../ModalHeader");
12
+ const RemInput_1 = require("../NewComposition/RemInput");
13
+ const SidebarContent_1 = require("../SidebarContent");
14
+ const initialState = { type: 'idle' };
15
+ const reducer = (state, action) => {
16
+ if (action.type === 'start') {
17
+ return {
18
+ type: 'load',
19
+ };
20
+ }
21
+ if (action.type === 'fail') {
22
+ return {
23
+ type: 'error',
24
+ };
25
+ }
26
+ if (action.type === 'succeed') {
27
+ return {
28
+ type: 'success',
29
+ };
30
+ }
31
+ return state;
32
+ };
33
+ const container = {
34
+ padding: 20,
35
+ };
36
+ const RenderModal = ({ composition, }) => {
37
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
38
+ const onQuit = (0, react_1.useCallback)(() => {
39
+ setSelectedModal(null);
40
+ }, [setSelectedModal]);
41
+ const isMounted = (0, react_1.useRef)(true);
42
+ const [state, dispatch] = (0, react_1.useReducer)(reducer, initialState);
43
+ // TODO: Allow to change out name
44
+ const [outName] = (0, react_1.useState)(() => (0, get_default_out_name_1.getDefaultOutLocation)({
45
+ compositionName: composition.id,
46
+ // TODO: Set default extension
47
+ defaultExtension: 'png',
48
+ }));
49
+ const dispatchIfMounted = (0, react_1.useCallback)((payload) => {
50
+ if (isMounted.current === false)
51
+ return;
52
+ dispatch(payload);
53
+ }, []);
54
+ const onClick = (0, react_1.useCallback)(() => {
55
+ var _a;
56
+ const body = {
57
+ compositionId: composition.id,
58
+ type: 'still',
59
+ outName,
60
+ };
61
+ (_a = SidebarContent_1.leftSidebarTabs.current) === null || _a === void 0 ? void 0 : _a.selectRendersPanel();
62
+ fetch(`/api/render`, {
63
+ method: 'post',
64
+ headers: {
65
+ 'content-type': 'application/json',
66
+ },
67
+ body: JSON.stringify(body),
68
+ })
69
+ .then((res) => res.json())
70
+ .then((data) => {
71
+ if (data.success) {
72
+ dispatchIfMounted({ type: 'succeed' });
73
+ setSelectedModal(null);
74
+ }
75
+ else {
76
+ dispatchIfMounted({ type: 'fail' });
77
+ }
78
+ })
79
+ .catch(() => {
80
+ dispatchIfMounted({ type: 'fail' });
81
+ });
82
+ }, [composition.id, dispatchIfMounted, outName, setSelectedModal]);
83
+ (0, react_1.useEffect)(() => {
84
+ return () => {
85
+ isMounted.current = false;
86
+ };
87
+ }, []);
88
+ return ((0, jsx_runtime_1.jsxs)(ModalContainer_1.ModalContainer, { onOutsideClick: onQuit, onEscape: onQuit, children: [(0, jsx_runtime_1.jsx)(ModalHeader_1.NewCompHeader, { title: `Render ${composition.id}` }), (0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(RemInput_1.RemotionInput, { type: "text", value: outName }) }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { block: true, y: 0.5 }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(Button_1.Button, { onClick: onClick, disabled: state.type === 'load', children: state.type === 'idle' ? 'Render' : 'Rendering...' }) })] })] }));
89
+ };
90
+ exports.RenderModal = RenderModal;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { RenderJob } from '../../../preview-server/render-queue/job';
3
+ export declare const RenderQueueItem: React.FC<{
4
+ job: RenderJob;
5
+ }>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderQueueItem = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const layout_1 = require("../layout");
6
+ const RenderQueueItemStatus_1 = require("./RenderQueueItemStatus");
7
+ const RenderQueueOutputName_1 = require("./RenderQueueOutputName");
8
+ const RenderQueueRemoveItem_1 = require("./RenderQueueRemoveItem");
9
+ const container = {
10
+ padding: 12,
11
+ display: 'flex',
12
+ flexDirection: 'row',
13
+ paddingBottom: 10,
14
+ };
15
+ const title = {
16
+ fontSize: 13,
17
+ lineHeight: 1,
18
+ };
19
+ const right = {
20
+ flex: 1,
21
+ };
22
+ const RenderQueueItem = ({ job }) => {
23
+ return ((0, jsx_runtime_1.jsxs)(layout_1.Row, { style: container, align: "center", children: [(0, jsx_runtime_1.jsx)(RenderQueueItemStatus_1.RenderQueueItemStatus, { job: job }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsxs)("div", { style: right, children: [(0, jsx_runtime_1.jsx)("div", { style: title, children: job.compositionId }), (0, jsx_runtime_1.jsx)(RenderQueueOutputName_1.RenderQueueOutputName, { job: job })] }), (0, jsx_runtime_1.jsx)(RenderQueueRemoveItem_1.RenderQueueRemoveItem, { job: job })] }));
24
+ };
25
+ exports.RenderQueueItem = RenderQueueItem;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { RenderJob } from '../../../preview-server/render-queue/job';
3
+ export declare const RenderQueueItemStatus: React.FC<{
4
+ job: RenderJob;
5
+ }>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderQueueItemStatus = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const colors_1 = require("../../helpers/colors");
6
+ const iconStyle = {
7
+ height: 16,
8
+ width: 16,
9
+ };
10
+ const RenderQueueItemStatus = ({ job }) => {
11
+ if (job.status === 'failed') {
12
+ return ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("svg", { style: iconStyle, viewBox: "0 0 512 512", children: (0, jsx_runtime_1.jsx)("path", { fill: colors_1.FAIL_COLOR, d: "M0 160V352L160 512H352L512 352V160L352 0H160L0 160zm353.9 32l-17 17-47 47 47 47 17 17L320 353.9l-17-17-47-47-47 47-17 17L158.1 320l17-17 47-47-47-47-17-17L192 158.1l17 17 47 47 47-47 17-17L353.9 192z" }) }) }));
13
+ }
14
+ if (job.status === 'idle') {
15
+ return ((0, jsx_runtime_1.jsx)("svg", { style: iconStyle, viewBox: "0 0 512 512", children: (0, jsx_runtime_1.jsx)("path", { fill: colors_1.LIGHT_TEXT, d: "M256 512C114.6 512 0 397.4 0 256S114.6 0 256 0S512 114.6 512 256s-114.6 256-256 256zM232 120V256c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2V120c0-13.3-10.7-24-24-24s-24 10.7-24 24z" }) }));
16
+ }
17
+ return (0, jsx_runtime_1.jsx)("div", { children: job.status });
18
+ };
19
+ exports.RenderQueueItemStatus = RenderQueueItemStatus;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { RenderJob } from '../../../preview-server/render-queue/job';
3
+ export declare const RenderQueueOutputName: React.FC<{
4
+ job: RenderJob;
5
+ }>;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderQueueOutputName = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../../helpers/colors");
7
+ const layout_1 = require("../layout");
8
+ const NotificationCenter_1 = require("../Notifications/NotificationCenter");
9
+ const outputLocation = {
10
+ fontSize: 13,
11
+ color: colors_1.LIGHT_TEXT,
12
+ appearance: 'none',
13
+ border: 'none',
14
+ padding: 0,
15
+ cursor: 'pointer',
16
+ lineHeight: 1,
17
+ textAlign: 'left',
18
+ whiteSpace: 'nowrap',
19
+ marginRight: layout_1.SPACING_UNIT,
20
+ };
21
+ const formatOutputLocation = (location) => {
22
+ if (location.startsWith(window.remotion_cwd)) {
23
+ const out = location.substring(window.remotion_cwd.length);
24
+ if (out.startsWith('/') || out.startsWith('\\')) {
25
+ return out.substring(1);
26
+ }
27
+ return out;
28
+ }
29
+ return location;
30
+ };
31
+ const RenderQueueOutputName = ({ job }) => {
32
+ const onClick = (0, react_1.useCallback)(() => {
33
+ const body = {
34
+ directory: job.outputLocation,
35
+ };
36
+ fetch(`/api/open-in-file-explorer`, {
37
+ method: 'post',
38
+ headers: {
39
+ 'content-type': 'application/json',
40
+ },
41
+ body: JSON.stringify(body),
42
+ })
43
+ .then((res) => res.json())
44
+ .then((data) => {
45
+ var _a;
46
+ if (data.success) {
47
+ console.log('Opened file in explorer');
48
+ }
49
+ else {
50
+ (_a = NotificationCenter_1.notificationCenter.current) === null || _a === void 0 ? void 0 : _a.addNotification({
51
+ content: `Could not open file: ${data.error}`,
52
+ created: Date.now(),
53
+ duration: 2000,
54
+ id: String(Math.random()),
55
+ });
56
+ }
57
+ })
58
+ .catch((err) => {
59
+ var _a;
60
+ (_a = NotificationCenter_1.notificationCenter.current) === null || _a === void 0 ? void 0 : _a.addNotification({
61
+ content: `Could not open file: ${err.message}`,
62
+ created: Date.now(),
63
+ duration: 2000,
64
+ id: String(Math.random()),
65
+ });
66
+ });
67
+ }, [job.outputLocation]);
68
+ return ((0, jsx_runtime_1.jsx)("button", { onClick: onClick, type: "button", style: outputLocation, title: job.outputLocation, children: formatOutputLocation(job.outputLocation) }));
69
+ };
70
+ exports.RenderQueueOutputName = RenderQueueOutputName;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { RenderJob } from '../../../preview-server/render-queue/job';
3
+ export declare const RenderQueueRemoveItem: React.FC<{
4
+ job: RenderJob;
5
+ }>;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderQueueRemoveItem = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../../helpers/colors");
7
+ const RenderQueueRemoveItem = ({ job }) => {
8
+ const onClick = (0, react_1.useCallback)(() => {
9
+ const body = {
10
+ jobId: job.id,
11
+ };
12
+ fetch(`/api/remove-render`, {
13
+ method: 'post',
14
+ headers: {
15
+ 'content-type': 'application/json',
16
+ },
17
+ body: JSON.stringify(body),
18
+ })
19
+ .then((res) => res.json())
20
+ .then((data) => {
21
+ if (!data.success) {
22
+ // TODO: Handle error
23
+ }
24
+ })
25
+ .catch(() => {
26
+ // TODO: Handle error
27
+ });
28
+ }, [job.id]);
29
+ const [hovered, setHovered] = (0, react_1.useState)(false);
30
+ const icon = (0, react_1.useMemo)(() => {
31
+ return {
32
+ height: 12,
33
+ };
34
+ }, []);
35
+ const onPointerEnter = (0, react_1.useCallback)(() => {
36
+ setHovered(true);
37
+ }, []);
38
+ const onPointerLeave = (0, react_1.useCallback)(() => {
39
+ setHovered(false);
40
+ }, []);
41
+ const style = (0, react_1.useMemo)(() => {
42
+ return {
43
+ border: 'none',
44
+ background: hovered ? colors_1.CLEAR_HOVER : 'transparent',
45
+ height: 24,
46
+ width: 24,
47
+ display: 'inline-flex',
48
+ justifyContent: 'center',
49
+ alignItems: 'center',
50
+ borderRadius: 3,
51
+ cursor: 'pointer',
52
+ };
53
+ }, [hovered]);
54
+ return ((0, jsx_runtime_1.jsx)("button", { onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, type: "button", onClick: onClick, style: style, children: (0, jsx_runtime_1.jsx)("svg", { style: icon, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 448 512", children: (0, jsx_runtime_1.jsx)("path", { fill: hovered ? 'white' : colors_1.LIGHT_TEXT, d: "M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z" }) }) }));
55
+ };
56
+ exports.RenderQueueRemoveItem = RenderQueueRemoveItem;
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import type { RenderJob } from '../../../preview-server/render-queue/job';
3
+ declare global {
4
+ interface Window {
5
+ remotion_initialRenderQueue: RenderJob[];
6
+ }
7
+ }
8
+ declare type RenderQueueContextType = {
9
+ jobs: RenderJob[];
10
+ };
11
+ export declare const RenderQueueContext: React.Context<RenderQueueContextType>;
12
+ export declare const renderJobsRef: React.RefObject<{
13
+ updateRenderJobs: (jobs: RenderJob[]) => void;
14
+ }>;
15
+ export declare const RenderQueueContextProvider: React.FC<{
16
+ children: React.ReactNode;
17
+ }>;
18
+ export {};
@@ -0,0 +1,49 @@
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.RenderQueueContextProvider = exports.renderJobsRef = exports.RenderQueueContext = void 0;
27
+ const jsx_runtime_1 = require("react/jsx-runtime");
28
+ const react_1 = __importStar(require("react"));
29
+ exports.RenderQueueContext = react_1.default.createContext({
30
+ jobs: [],
31
+ });
32
+ exports.renderJobsRef = (0, react_1.createRef)();
33
+ const RenderQueueContextProvider = ({ children }) => {
34
+ const [jobs, setJobs] = (0, react_1.useState)(window.remotion_initialRenderQueue);
35
+ const value = (0, react_1.useMemo)(() => {
36
+ return {
37
+ jobs,
38
+ };
39
+ }, [jobs]);
40
+ (0, react_1.useImperativeHandle)(exports.renderJobsRef, () => {
41
+ return {
42
+ updateRenderJobs: (newJobs) => {
43
+ setJobs(newJobs);
44
+ },
45
+ };
46
+ }, []);
47
+ return ((0, jsx_runtime_1.jsx)(exports.RenderQueueContext.Provider, { value: value, children: children }));
48
+ };
49
+ exports.RenderQueueContextProvider = RenderQueueContextProvider;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const RenderQueue: React.FC;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderQueue = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../../helpers/colors");
7
+ const context_1 = require("./context");
8
+ const RenderQueueItem_1 = require("./RenderQueueItem");
9
+ const separatorStyle = {
10
+ borderBottom: '1px solid ' + colors_1.BORDER_COLOR,
11
+ };
12
+ const RenderQueue = () => {
13
+ const { jobs } = (0, react_1.useContext)(context_1.RenderQueueContext);
14
+ return ((0, jsx_runtime_1.jsx)("div", { children: jobs.map((j, index) => {
15
+ return ((0, jsx_runtime_1.jsx)("div", { style: index === jobs.length - 1 ? undefined : separatorStyle, children: (0, jsx_runtime_1.jsx)(RenderQueueItem_1.RenderQueueItem, { job: j }) }, j.id));
16
+ }) }));
17
+ };
18
+ exports.RenderQueue = RenderQueue;
@@ -0,0 +1,6 @@
1
+ import type { MouseEventHandler } from 'react';
2
+ import React from 'react';
3
+ export declare const RendersTab: React.FC<{
4
+ selected: boolean;
5
+ onClick: MouseEventHandler<HTMLButtonElement>;
6
+ }>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RendersTab = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../helpers/colors");
7
+ const layout_1 = require("./layout");
8
+ const context_1 = require("./RenderQueue/context");
9
+ const Tabs_1 = require("./Tabs");
10
+ const row = {
11
+ display: 'flex',
12
+ flexDirection: 'row',
13
+ fontSize: 13,
14
+ justifyContent: 'center',
15
+ color: 'inherit',
16
+ alignItems: 'center',
17
+ };
18
+ const badge = {
19
+ height: 16,
20
+ width: 16,
21
+ borderRadius: 8,
22
+ fontSize: 10,
23
+ display: 'inline-flex',
24
+ justifyContent: 'center',
25
+ alignItems: 'center',
26
+ };
27
+ const RendersTab = ({ selected, onClick }) => {
28
+ const { jobs } = (0, react_1.useContext)(context_1.RenderQueueContext);
29
+ const failedJobs = jobs.filter((j) => j.status === 'failed').length;
30
+ const jobCount = jobs.length;
31
+ const badgeStyle = (0, react_1.useMemo)(() => {
32
+ return {
33
+ ...badge,
34
+ backgroundColor: failedJobs > 0 ? colors_1.FAIL_COLOR : 'white',
35
+ color: failedJobs > 0 ? 'white' : 'black',
36
+ };
37
+ }, [failedJobs]);
38
+ return ((0, jsx_runtime_1.jsx)(Tabs_1.Tab, { selected: selected, onClick: onClick, children: (0, jsx_runtime_1.jsxs)("div", { style: row, children: ["Renders", jobCount > 0 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)("div", { style: badgeStyle, children: jobCount })] })) : null] }) }));
39
+ };
40
+ exports.RendersTab = RendersTab;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare const leftSidebarTabs: React.RefObject<{
3
+ selectRendersPanel: () => void;
4
+ }>;
5
+ export declare const SidebarContent: React.FC;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SidebarContent = exports.leftSidebarTabs = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../helpers/colors");
7
+ const CompositionSelector_1 = require("./CompositionSelector");
8
+ const RenderQueue_1 = require("./RenderQueue");
9
+ const RendersTab_1 = require("./RendersTab");
10
+ const Tabs_1 = require("./Tabs");
11
+ const container = {
12
+ width: '100%',
13
+ };
14
+ const tabsContainer = {
15
+ padding: 4,
16
+ borderBottom: `1px solid ${colors_1.BORDER_COLOR}`,
17
+ };
18
+ exports.leftSidebarTabs = (0, react_1.createRef)();
19
+ const SidebarContent = () => {
20
+ const [panel, setPanel] = (0, react_1.useState)('compositions');
21
+ const onCompositionsSelected = (0, react_1.useCallback)(() => {
22
+ setPanel('compositions');
23
+ }, []);
24
+ const onRendersSelected = (0, react_1.useCallback)(() => {
25
+ setPanel('renders');
26
+ }, []);
27
+ (0, react_1.useImperativeHandle)(exports.leftSidebarTabs, () => {
28
+ return {
29
+ selectRendersPanel: () => setPanel('renders'),
30
+ };
31
+ }, []);
32
+ return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)("div", { style: tabsContainer, children: (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tab, { selected: panel === 'compositions', onClick: onCompositionsSelected, children: "Compositions" }), (0, jsx_runtime_1.jsx)(RendersTab_1.RendersTab, { onClick: onRendersSelected, selected: panel === 'renders' })] }) }), panel === 'compositions' ? (0, jsx_runtime_1.jsx)(CompositionSelector_1.CompositionSelector, {}) : (0, jsx_runtime_1.jsx)(RenderQueue_1.RenderQueue, {})] }));
33
+ };
34
+ exports.SidebarContent = SidebarContent;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export declare const Tabs: React.FC<{
3
+ children: React.ReactNode;
4
+ style?: React.CSSProperties;
5
+ }>;
6
+ export declare const Tab: React.FC<{
7
+ children: React.ReactNode;
8
+ onClick: React.MouseEventHandler<HTMLButtonElement>;
9
+ style?: React.CSSProperties;
10
+ selected: boolean;
11
+ }>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Tab = exports.Tabs = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../../helpers/colors");
7
+ const tabsContainer = {
8
+ display: 'flex',
9
+ flexDirection: 'row',
10
+ };
11
+ const Tabs = ({ children, style }) => {
12
+ const definiteStyle = (0, react_1.useMemo)(() => {
13
+ return {
14
+ ...tabsContainer,
15
+ ...style,
16
+ };
17
+ }, [style]);
18
+ return (0, jsx_runtime_1.jsx)("div", { style: definiteStyle, children: children });
19
+ };
20
+ exports.Tabs = Tabs;
21
+ const selectorButton = {
22
+ border: 'none',
23
+ flex: 1,
24
+ padding: 8,
25
+ fontSize: 13,
26
+ };
27
+ const Tab = ({ children, onClick, style, selected }) => {
28
+ const [hovered, setHovered] = (0, react_1.useState)(false);
29
+ const onPointerEnter = (0, react_1.useCallback)(() => {
30
+ setHovered(true);
31
+ }, []);
32
+ const onPointerLeave = (0, react_1.useCallback)(() => {
33
+ setHovered(false);
34
+ }, []);
35
+ const definiteStyle = (0, react_1.useMemo)(() => {
36
+ return {
37
+ ...selectorButton,
38
+ backgroundColor: selected
39
+ ? colors_1.SELECTED_BACKGROUND
40
+ : hovered
41
+ ? colors_1.CLEAR_HOVER
42
+ : 'transparent',
43
+ color: selected ? 'white' : colors_1.LIGHT_TEXT,
44
+ ...style,
45
+ };
46
+ }, [hovered, selected, style]);
47
+ return ((0, jsx_runtime_1.jsx)("button", { style: definiteStyle, type: "button", onClick: onClick, onPointerLeave: onPointerLeave, onPointerEnter: onPointerEnter, children: children }));
48
+ };
49
+ exports.Tab = Tab;
@@ -0,0 +1,6 @@
1
+ import type { SVGProps } from 'react';
2
+ import React from 'react';
3
+ export declare const RenderIcon: React.FC<{
4
+ svgProps: SVGProps<SVGSVGElement>;
5
+ color: string;
6
+ }>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const RenderIcon = (props) => {
6
+ return ((0, jsx_runtime_1.jsx)("svg", { ...props.svgProps, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", children: (0, jsx_runtime_1.jsx)("path", { fill: props.color, d: "M408 143.1C408 166.1 390.1 183.1 368 183.1C345.9 183.1 328 166.1 328 143.1C328 121.9 345.9 103.1 368 103.1C390.1 103.1 408 121.9 408 143.1zM384 312.1V394.2C384 419.7 370.6 443.2 348.7 456.2L260.2 508.6C252.8 513 243.6 513.1 236.1 508.9C228.6 504.6 224 496.6 224 488V373.3C224 350.6 215 328.1 199 312.1C183 296.1 161.4 288 138.7 288H24C15.38 288 7.414 283.4 3.146 275.9C-1.123 268.4-1.042 259.2 3.357 251.8L55.83 163.3C68.79 141.4 92.33 127.1 117.8 127.1H199.9C281.7-3.798 408.8-8.546 483.9 5.272C495.6 7.411 504.6 16.45 506.7 28.07C520.5 103.2 515.8 230.3 384 312.1V312.1zM197.9 253.9C210.8 260.2 222.6 268.7 232.1 279C243.3 289.4 251.8 301.2 258.1 314.1C363.9 284.1 414.8 234.5 439.7 188C464.7 141.3 466.1 90.47 461.7 50.33C421.5 45.02 370.7 47.34 323.1 72.33C277.5 97.16 227.9 148.1 197.9 253.9H197.9zM41.98 345.5C76.37 311.1 132.1 311.1 166.5 345.5C200.9 379.9 200.9 435.6 166.5 470C117 519.5 .4765 511.5 .4765 511.5C.4765 511.5-7.516 394.1 41.98 345.5V345.5zM64.58 447.4C64.58 447.4 103.3 450.1 119.8 433.6C131.2 422.2 131.2 403.6 119.8 392.2C108.3 380.8 89.81 380.8 78.38 392.2C61.92 408.7 64.58 447.4 64.58 447.4z" }) }));
7
+ };
8
+ exports.RenderIcon = RenderIcon;
@@ -0,0 +1,2 @@
1
+ export declare const findClosestPackageJson: () => string | null;
2
+ export declare const findRemotionRoot: () => string;
@@ -0,0 +1,35 @@
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.findRemotionRoot = exports.findClosestPackageJson = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const log_1 = require("./log");
10
+ const recursionLimit = 5;
11
+ const findClosestPackageJson = () => {
12
+ let currentDir = process.cwd();
13
+ let possiblePackageJson = '';
14
+ for (let i = 0; i < recursionLimit; i++) {
15
+ possiblePackageJson = path_1.default.join(currentDir, 'package.json');
16
+ const exists = fs_1.default.existsSync(possiblePackageJson);
17
+ if (exists) {
18
+ return possiblePackageJson;
19
+ }
20
+ currentDir = path_1.default.dirname(currentDir);
21
+ }
22
+ return null;
23
+ };
24
+ exports.findClosestPackageJson = findClosestPackageJson;
25
+ const findRemotionRoot = () => {
26
+ const closestPackageJson = (0, exports.findClosestPackageJson)();
27
+ if (closestPackageJson === null) {
28
+ log_1.Log.error('Could not find a package.json in the current directory or any of the ' +
29
+ recursionLimit +
30
+ ' parent directories. Is this a Remotion project?');
31
+ process.exit(1);
32
+ }
33
+ return path_1.default.dirname(closestPackageJson);
34
+ };
35
+ exports.findRemotionRoot = findRemotionRoot;
@@ -30,7 +30,7 @@ export declare const getCliOptions: (options: {
30
30
  browserExecutable: BrowserExecutable;
31
31
  ffmpegExecutable: import("@remotion/renderer").FfmpegExecutable;
32
32
  ffprobeExecutable: import("@remotion/renderer").FfmpegExecutable;
33
- logLevel: "error" | "verbose" | "info" | "warn";
33
+ logLevel: "verbose" | "info" | "warn" | "error";
34
34
  scale: number;
35
35
  chromiumOptions: ChromiumOptions;
36
36
  overwrite: boolean;
@@ -0,0 +1,4 @@
1
+ export declare const getDefaultOutLocation: ({ compositionName, defaultExtension, }: {
2
+ compositionName: string;
3
+ defaultExtension: string;
4
+ }) => string;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultOutLocation = void 0;
4
+ const getDefaultOutLocation = ({ compositionName, defaultExtension, }) => {
5
+ const defaultName = `out/${compositionName}.${defaultExtension}`;
6
+ return defaultName;
7
+ };
8
+ exports.getDefaultOutLocation = getDefaultOutLocation;
package/dist/index.d.ts CHANGED
@@ -88,7 +88,7 @@ export declare const CliInternals: {
88
88
  browserExecutable: import("@remotion/renderer").BrowserExecutable;
89
89
  ffmpegExecutable: import("@remotion/renderer").FfmpegExecutable;
90
90
  ffprobeExecutable: import("@remotion/renderer").FfmpegExecutable;
91
- logLevel: "error" | "verbose" | "info" | "warn";
91
+ logLevel: "verbose" | "info" | "warn" | "error";
92
92
  scale: number;
93
93
  chromiumOptions: import("@remotion/renderer").ChromiumOptions;
94
94
  overwrite: boolean;
@@ -0,0 +1,4 @@
1
+ export declare const getAbsolutePublicDir: ({ userPassedPublicDir, remotionRoot, }: {
2
+ userPassedPublicDir: string | null;
3
+ remotionRoot: string;
4
+ }) => string;
@@ -0,0 +1,14 @@
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.getAbsolutePublicDir = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const getAbsolutePublicDir = ({ userPassedPublicDir, remotionRoot, }) => {
9
+ const publicDir = userPassedPublicDir
10
+ ? path_1.default.resolve(remotionRoot, userPassedPublicDir)
11
+ : path_1.default.join(remotionRoot, 'public');
12
+ return publicDir;
13
+ };
14
+ exports.getAbsolutePublicDir = getAbsolutePublicDir;
@@ -0,0 +1,2 @@
1
+ import type { StaticFile } from 'remotion';
2
+ export declare const getFilesInPublicFolder: (publicFolder: string) => StaticFile[];
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFilesInPublicFolder = void 0;
4
+ const getFilesInPublicFolder = (publicFolder) => {
5
+ return readRecursively({ folder: '.', startPath: publicFolder });
6
+ };
7
+ exports.getFilesInPublicFolder = getFilesInPublicFolder;
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,2 @@
1
+ import type { IncomingMessage } from '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,12 @@
1
+ import type { StaticFile } from 'remotion';
2
+ export declare const initPublicFolderWatch: ({ publicDir, remotionRoot, onUpdate, }: {
3
+ publicDir: string;
4
+ remotionRoot: string;
5
+ onUpdate: () => void;
6
+ }) => void;
7
+ export declare const watchPublicFolder: ({ publicDir, remotionRoot, onUpdate, }: {
8
+ publicDir: string;
9
+ remotionRoot: string;
10
+ onUpdate: () => void;
11
+ }) => void;
12
+ export declare const getFiles: () => StaticFile[];
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getFiles = exports.watchPublicFolder = exports.initPublicFolderWatch = void 0;
7
+ const bundler_1 = require("@remotion/bundler");
8
+ const fs_1 = require("fs");
9
+ const path_1 = __importDefault(require("path"));
10
+ const write_files_definition_file_1 = require("./write-files-definition-file");
11
+ let files = [];
12
+ const initPublicFolderWatch = ({ publicDir, remotionRoot, onUpdate, }) => {
13
+ fetchFolder({ publicDir, remotionRoot });
14
+ (0, exports.watchPublicFolder)({ publicDir, remotionRoot, onUpdate });
15
+ };
16
+ exports.initPublicFolderWatch = initPublicFolderWatch;
17
+ const fetchFolder = ({ publicDir, remotionRoot, }) => {
18
+ files = bundler_1.BundlerInternals.readRecursively({
19
+ folder: '.',
20
+ startPath: publicDir,
21
+ }).map((f) => {
22
+ return {
23
+ ...f,
24
+ path: f.path.split(path_1.default.sep).join('/'),
25
+ };
26
+ });
27
+ (0, write_files_definition_file_1.writeFilesDefinitionFile)(files, remotionRoot);
28
+ };
29
+ const watchPublicFolder = ({ publicDir, remotionRoot, onUpdate, }) => {
30
+ (0, fs_1.watch)(publicDir, { recursive: true }, () => {
31
+ fetchFolder({ publicDir, remotionRoot });
32
+ onUpdate();
33
+ });
34
+ };
35
+ exports.watchPublicFolder = watchPublicFolder;
36
+ const getFiles = () => {
37
+ return files;
38
+ };
39
+ exports.getFiles = getFiles;
@@ -0,0 +1,2 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ export declare const handleAddRender: (remotionRoot: string, req: IncomingMessage, res: ServerResponse, entryPoint: string) => Promise<void>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handleAddRender = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const _1 = require(".");
9
+ const parse_body_1 = require("../parse-body");
10
+ const handleAddRender = async (remotionRoot, req, res, entryPoint) => {
11
+ if (req.method === 'OPTIONS') {
12
+ res.statusCode = 200;
13
+ res.end();
14
+ }
15
+ try {
16
+ const body = (await (0, parse_body_1.parseRequestBody)(req));
17
+ (0, _1.addJob)({
18
+ compositionId: body.compositionId,
19
+ id: String(Math.random()).replace('0.', ''),
20
+ startedAt: Date.now(),
21
+ type: 'still',
22
+ outputLocation: path_1.default.resolve(remotionRoot, body.outName),
23
+ status: 'idle',
24
+ }, entryPoint);
25
+ res.setHeader('content-type', 'application/json');
26
+ res.writeHead(200);
27
+ res.end(JSON.stringify({
28
+ success: true,
29
+ }));
30
+ }
31
+ catch (err) {
32
+ res.setHeader('content-type', 'application/json');
33
+ res.writeHead(200);
34
+ res.end(JSON.stringify({
35
+ success: false,
36
+ }));
37
+ }
38
+ };
39
+ exports.handleAddRender = handleAddRender;
@@ -0,0 +1,7 @@
1
+ import type { RenderJob } from './job';
2
+ export declare const getRenderQueue: () => RenderJob[];
3
+ export declare const notifyClientsOfJobUpdate: () => void;
4
+ export declare const processJob: (job: RenderJob, entryPoint: string) => Promise<never>;
5
+ export declare const addJob: (job: RenderJob, entryPoint: string) => void;
6
+ export declare const removeJob: (jobId: string) => void;
7
+ export declare const processJobIfPossible: (entryPoint: string) => Promise<void>;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processJobIfPossible = exports.removeJob = exports.addJob = exports.processJob = exports.notifyClientsOfJobUpdate = exports.getRenderQueue = void 0;
4
+ const bundler_1 = require("@remotion/bundler");
5
+ const renderer_1 = require("@remotion/renderer");
6
+ const live_events_1 = require("../live-events");
7
+ let jobQueue = [];
8
+ const updateJob = (id, updater) => {
9
+ jobQueue = jobQueue.map((j) => {
10
+ if (id === j.id) {
11
+ return updater(j);
12
+ }
13
+ return j;
14
+ });
15
+ (0, exports.notifyClientsOfJobUpdate)();
16
+ };
17
+ const getRenderQueue = () => {
18
+ return jobQueue;
19
+ };
20
+ exports.getRenderQueue = getRenderQueue;
21
+ const notifyClientsOfJobUpdate = () => {
22
+ (0, live_events_1.waitForLiveEventsListener)().then((listener) => {
23
+ listener.sendEventToClient({
24
+ type: 'render-queue-updated',
25
+ queue: jobQueue,
26
+ });
27
+ });
28
+ };
29
+ exports.notifyClientsOfJobUpdate = notifyClientsOfJobUpdate;
30
+ const processJob = async (job, entryPoint) => {
31
+ if (job.type === 'still') {
32
+ const serveUrl = await (0, bundler_1.bundle)({
33
+ entryPoint,
34
+ // TODO: Accept CLI options
35
+ });
36
+ const compositions = await (0, renderer_1.getCompositions)(serveUrl, {
37
+ // TODO: Accept CLI option
38
+ });
39
+ const composition = compositions.find((c) => {
40
+ return c.id === job.compositionId;
41
+ });
42
+ if (!composition) {
43
+ throw new TypeError(`Composition ${job.compositionId} not found`);
44
+ }
45
+ await (0, renderer_1.renderStill)({
46
+ composition,
47
+ output: job.outputLocation,
48
+ serveUrl,
49
+ // TODO: Accept CLI options
50
+ });
51
+ }
52
+ throw new TypeError(`Could not process job of type ${job.type}`);
53
+ };
54
+ exports.processJob = processJob;
55
+ const addJob = (job, entryPoint) => {
56
+ jobQueue.push(job);
57
+ (0, exports.processJobIfPossible)(entryPoint);
58
+ (0, exports.notifyClientsOfJobUpdate)();
59
+ };
60
+ exports.addJob = addJob;
61
+ const removeJob = (jobId) => {
62
+ jobQueue = jobQueue.filter((job) => job.id !== jobId);
63
+ (0, exports.notifyClientsOfJobUpdate)();
64
+ };
65
+ exports.removeJob = removeJob;
66
+ const processJobIfPossible = async (entryPoint) => {
67
+ const nextJob = jobQueue.find((q) => {
68
+ return q.status === 'idle';
69
+ });
70
+ if (!nextJob) {
71
+ return;
72
+ }
73
+ try {
74
+ updateJob(nextJob.id, (job) => {
75
+ return {
76
+ ...job,
77
+ status: 'running',
78
+ };
79
+ });
80
+ await (0, exports.processJob)(nextJob, entryPoint);
81
+ updateJob(nextJob.id, (job) => {
82
+ return {
83
+ ...job,
84
+ status: 'done',
85
+ };
86
+ });
87
+ }
88
+ catch (err) {
89
+ updateJob(nextJob.id, (job) => {
90
+ return {
91
+ ...job,
92
+ status: 'failed',
93
+ error: err,
94
+ };
95
+ });
96
+ (0, live_events_1.waitForLiveEventsListener)().then((listener) => {
97
+ listener.sendEventToClient({
98
+ type: 'render-job-failed',
99
+ compositionId: nextJob.compositionId,
100
+ error: err,
101
+ });
102
+ });
103
+ }
104
+ };
105
+ exports.processJobIfPossible = processJobIfPossible;
@@ -0,0 +1,29 @@
1
+ declare type RenderJobDynamicStatus = {
2
+ status: 'done';
3
+ } | {
4
+ status: 'running';
5
+ } | {
6
+ status: 'idle';
7
+ } | {
8
+ status: 'failed';
9
+ error: Error;
10
+ };
11
+ export declare type RenderJob = {
12
+ startedAt: number;
13
+ compositionId: string;
14
+ type: 'still' | 'composition';
15
+ id: string;
16
+ outputLocation: string;
17
+ } & RenderJobDynamicStatus;
18
+ export declare type AddRenderRequest = {
19
+ compositionId: string;
20
+ type: 'still' | 'composition';
21
+ outName: string;
22
+ };
23
+ export declare type RemoveRenderRequest = {
24
+ jobId: string;
25
+ };
26
+ export declare type OpenInFileExplorerRequest = {
27
+ directory: string;
28
+ };
29
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const openDirectoryInFinder: (dirToOpen: string) => Promise<void>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openDirectoryInFinder = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const os_1 = require("os");
6
+ const openDirectoryInFinder = (dirToOpen) => {
7
+ const command = (0, os_1.platform)() === 'darwin'
8
+ ? 'open'
9
+ : (0, os_1.platform)() === 'linux'
10
+ ? 'xdg-open'
11
+ : 'explorer';
12
+ // TODO: What if file was deleted in the meanwhile?
13
+ // TODO: '-R' only works on macOS
14
+ const p = (0, child_process_1.spawn)(command, ['-R', dirToOpen]);
15
+ return new Promise((resolve, reject) => {
16
+ p.on('exit', (code) => {
17
+ if (code === 0) {
18
+ resolve();
19
+ }
20
+ else {
21
+ reject(new Error(`Exited with code ${code}`));
22
+ }
23
+ });
24
+ p.on('error', (err) => {
25
+ p.kill();
26
+ if (err) {
27
+ reject(err);
28
+ }
29
+ });
30
+ });
31
+ };
32
+ exports.openDirectoryInFinder = openDirectoryInFinder;
@@ -0,0 +1,2 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ export declare const handleOpenInFileExplorer: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleOpenInFileExplorer = void 0;
4
+ const parse_body_1 = require("../parse-body");
5
+ const open_directory_in_finder_1 = require("./open-directory-in-finder");
6
+ const handleOpenInFileExplorer = async (req, res) => {
7
+ if (req.method === 'OPTIONS') {
8
+ res.statusCode = 200;
9
+ res.end();
10
+ }
11
+ try {
12
+ const body = (await (0, parse_body_1.parseRequestBody)(req));
13
+ // TODO: Disallow opening file that is not in Remotion CWD
14
+ await (0, open_directory_in_finder_1.openDirectoryInFinder)(body.directory);
15
+ res.setHeader('content-type', 'application/json');
16
+ res.writeHead(200);
17
+ res.end(JSON.stringify({
18
+ success: true,
19
+ }));
20
+ }
21
+ catch (err) {
22
+ res.setHeader('content-type', 'application/json');
23
+ res.writeHead(200);
24
+ res.end(JSON.stringify({
25
+ success: false,
26
+ error: err.message,
27
+ }));
28
+ }
29
+ };
30
+ exports.handleOpenInFileExplorer = handleOpenInFileExplorer;
@@ -0,0 +1,2 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ export declare const handleRemoveRender: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleRemoveRender = void 0;
4
+ const _1 = require(".");
5
+ const parse_body_1 = require("../parse-body");
6
+ const handleRemoveRender = async (req, res) => {
7
+ if (req.method === 'OPTIONS') {
8
+ res.statusCode = 200;
9
+ res.end();
10
+ }
11
+ try {
12
+ const body = (await (0, parse_body_1.parseRequestBody)(req));
13
+ (0, _1.removeJob)(body.jobId);
14
+ res.setHeader('content-type', 'application/json');
15
+ res.writeHead(200);
16
+ res.end(JSON.stringify({
17
+ success: true,
18
+ }));
19
+ }
20
+ catch (err) {
21
+ res.setHeader('content-type', 'application/json');
22
+ res.writeHead(200);
23
+ res.end(JSON.stringify({
24
+ success: false,
25
+ }));
26
+ }
27
+ };
28
+ exports.handleRemoveRender = handleRemoveRender;
@@ -0,0 +1,2 @@
1
+ import type { StaticFile } from './get-files-in-public-folder';
2
+ export declare const writeFilesDefinitionFile: (files: StaticFile[], remotionRoot: string) => void;
@@ -0,0 +1,37 @@
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.writeFilesDefinitionFile = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const writeFilesDefinitionFile = (files, remotionRoot) => {
10
+ const content = `
11
+ /*
12
+ This file will give you autocompletions for staticFile().
13
+ Enable autocompletion by adding "autocomplete.d.ts" to the "include" array in "tsconfig.json".
14
+ This file is auto-generated - do not edit this file!
15
+ You may add it to your \`.gitignore\`.
16
+ */
17
+
18
+ declare global {
19
+ interface RemotionStaticPaths {
20
+ ${files
21
+ .map((f) => {
22
+ // TODO: What if file contains '"'?
23
+ return ` ["${f.path}"]: unknown;`;
24
+ })
25
+ .join('\n')}
26
+ }
27
+ }
28
+ export {}
29
+ `.trimStart();
30
+ const folder = path_1.default.join(remotionRoot);
31
+ if (!(0, fs_1.existsSync)(folder)) {
32
+ (0, fs_1.mkdirSync)(folder);
33
+ }
34
+ // TODO: Create folder if exists
35
+ (0, fs_1.writeFileSync)(path_1.default.join(folder, 'autocomplete.d.ts'), content);
36
+ };
37
+ exports.writeFilesDefinitionFile = writeFilesDefinitionFile;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/cli",
3
- "version": "3.3.8",
3
+ "version": "3.3.9",
4
4
  "description": "CLI for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "sideEffects": false,
@@ -22,16 +22,16 @@
22
22
  "author": "Jonny Burger <jonny@remotion.dev>",
23
23
  "license": "SEE LICENSE IN LICENSE.md",
24
24
  "dependencies": {
25
- "@remotion/bundler": "3.3.8",
26
- "@remotion/media-utils": "3.3.8",
27
- "@remotion/player": "3.3.8",
28
- "@remotion/renderer": "3.3.8",
25
+ "@remotion/bundler": "3.3.9",
26
+ "@remotion/media-utils": "3.3.9",
27
+ "@remotion/player": "3.3.9",
28
+ "@remotion/renderer": "3.3.9",
29
29
  "better-opn": "2.1.1",
30
30
  "dotenv": "9.0.2",
31
31
  "memfs": "3.4.3",
32
32
  "minimist": "1.2.6",
33
33
  "prompts": "2.4.1",
34
- "remotion": "3.3.8",
34
+ "remotion": "3.3.9",
35
35
  "semver": "7.3.5",
36
36
  "source-map": "0.6.1"
37
37
  },
@@ -72,5 +72,5 @@
72
72
  "publishConfig": {
73
73
  "access": "public"
74
74
  },
75
- "gitHead": "4d4c78cf83b5fd085f24d5fd19f4507815e200a7"
75
+ "gitHead": "86269c98522cb7ea280f8283fa6c57885b971b3b"
76
76
  }