@remotion/cli 4.1.0-alpha5 → 4.1.0-alpha8

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 (71) hide show
  1. package/dist/benchmark.js +13 -2
  2. package/dist/codemods/stringify-with-path.js +3 -3
  3. package/dist/compositions.js +6 -1
  4. package/dist/config/log.d.ts +1 -1
  5. package/dist/editor/components/CanvasOrLoading.js +20 -1
  6. package/dist/editor/components/CopyButton.js +5 -2
  7. package/dist/editor/components/Editor.js +1 -3
  8. package/dist/editor/components/FramePersistor.d.ts +0 -2
  9. package/dist/editor/components/FramePersistor.js +4 -24
  10. package/dist/editor/components/InitialCompositionLoader.js +1 -22
  11. package/dist/editor/components/NewComposition/RemInput.d.ts +1 -1
  12. package/dist/editor/components/OpenEditorButton.js +5 -2
  13. package/dist/editor/components/QuickSwitcher/QuickSwitcherResult.js +3 -3
  14. package/dist/editor/components/RenderModal/DataEditor.js +3 -3
  15. package/dist/editor/components/RenderModal/RenderModal.js +5 -2
  16. package/dist/editor/components/RenderModal/RenderModalBasic.d.ts +2 -3
  17. package/dist/editor/components/RenderModal/RenderModalJSONPropsEditor.d.ts +1 -1
  18. package/dist/editor/components/RenderModal/RenderModalJSONPropsEditor.js +2 -2
  19. package/dist/editor/components/RenderModal/SchemaEditor/SchemaEditor.d.ts +1 -1
  20. package/dist/editor/components/RenderModal/SchemaEditor/SchemaErrorMessages.js +1 -3
  21. package/dist/editor/components/RenderModal/SchemaEditor/ZodSwitch.js +0 -1
  22. package/dist/editor/components/RenderQueue/actions.d.ts +1 -1
  23. package/dist/editor/components/RenderQueue/actions.js +12 -4
  24. package/dist/editor/components/SetTimelineInOutProvider.js +5 -4
  25. package/dist/editor/components/SidebarRenderButton.js +3 -1
  26. package/dist/editor/components/Timeline/TimelineDragHandler.js +45 -19
  27. package/dist/editor/components/TimelineInOutToggle.d.ts +2 -1
  28. package/dist/editor/components/TimelineInOutToggle.js +82 -67
  29. package/dist/editor/helpers/is-composition-still.d.ts +1 -1
  30. package/dist/editor/helpers/is-current-selected-still.js +5 -6
  31. package/dist/editor/icons/keys.js +1 -0
  32. package/dist/editor/state/in-out.d.ts +3 -2
  33. package/dist/editor/state/in-out.js +22 -5
  34. package/dist/editor/state/marks.d.ts +3 -2
  35. package/dist/editor/state/marks.js +6 -6
  36. package/dist/error-with-stack-frame.d.ts +19 -0
  37. package/dist/error-with-stack-frame.js +81 -0
  38. package/dist/get-composition-id.d.ts +2 -2
  39. package/dist/get-composition-id.js +7 -4
  40. package/dist/get-composition-with-dimension-override.d.ts +2 -2
  41. package/dist/get-composition-with-dimension-override.js +2 -2
  42. package/dist/handle-common-errors.js +4 -0
  43. package/dist/handle-javascript-error.d.ts +20 -0
  44. package/dist/handle-javascript-error.js +81 -0
  45. package/dist/index.d.ts +3 -3
  46. package/dist/log.d.ts +3 -3
  47. package/dist/parse-command-line.js +1 -1
  48. package/dist/preview-server/error-overlay/remotion-overlay/Button.js +1 -0
  49. package/dist/preview-server/render-queue/job.d.ts +2 -2
  50. package/dist/preview-server/render-queue/make-retry-payload.js +3 -2
  51. package/dist/preview-server/render-queue/open-directory-in-finder.js +11 -5
  52. package/dist/preview-server/render-queue/process-still.js +1 -1
  53. package/dist/preview-server/render-queue/process-video.js +1 -1
  54. package/dist/preview-server/routes/add-render.js +2 -2
  55. package/dist/preview-server/routes/update-default-props.js +2 -2
  56. package/dist/print-compositions.d.ts +2 -2
  57. package/dist/render-flows/render.d.ts +2 -2
  58. package/dist/render-flows/render.js +18 -7
  59. package/dist/render-flows/still.d.ts +2 -2
  60. package/dist/render-flows/still.js +12 -6
  61. package/dist/render.js +6 -1
  62. package/dist/still.js +6 -1
  63. package/dist/symbolicate-error.d.ts +3 -0
  64. package/dist/symbolicate-error.js +24 -0
  65. package/dist/symbolicate-errors.d.ts +7 -0
  66. package/dist/symbolicate-errors.js +90 -0
  67. package/dist/symbolicate-stacktrace.d.ts +28 -0
  68. package/dist/symbolicate-stacktrace.js +135 -0
  69. package/dist/symbolicateable-error.d.ts +16 -0
  70. package/dist/symbolicateable-error.js +18 -0
  71. package/package.json +10 -10
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.symbolicateError = void 0;
4
+ const symbolicate_stacktrace_1 = require("../symbolicate-stacktrace");
5
+ const handle_javascript_exception_1 = require("./handle-javascript-exception");
6
+ const truthy_1 = require("./truthy");
7
+ const symbolicateError = async (symbolicateableError) => {
8
+ const { delayRenderCall, stackFrame } = symbolicateableError;
9
+ const [mainErrorFrames, delayRenderFrames] = await Promise.all([
10
+ stackFrame ? (0, symbolicate_stacktrace_1.symbolicateStackTraceFromRemoteFrames)(stackFrame) : null,
11
+ delayRenderCall
12
+ ? (0, symbolicate_stacktrace_1.symbolicateStackTraceFromRemoteFrames)(delayRenderCall)
13
+ : null,
14
+ ].filter(truthy_1.truthy));
15
+ const symbolicatedErr = new handle_javascript_exception_1.ErrorWithStackFrame({
16
+ message: symbolicateableError.message,
17
+ symbolicatedStackFrames: mainErrorFrames,
18
+ frame: symbolicateableError.frame,
19
+ name: symbolicateableError.name,
20
+ delayRenderCall: delayRenderFrames,
21
+ });
22
+ return symbolicatedErr;
23
+ };
24
+ exports.symbolicateError = symbolicateError;
@@ -0,0 +1,7 @@
1
+ import type { SymbolicatedStackFrame, UnsymbolicatedStackFrame } from '@remotion/renderer';
2
+ import type { SourceMapConsumer } from 'source-map';
3
+ import { ErrorWithStackFrame } from './error-with-stack-frame';
4
+ export declare const symbolicateError: (symbolicateableError: SymbolicateableError) => Promise<ErrorWithStackFrame>;
5
+ export declare const symbolicateStackTraceFromRemoteFrames: (frames: UnsymbolicatedStackFrame[]) => Promise<SymbolicatedStackFrame[]>;
6
+ export declare const getSourceMapFromRemoteFile: (fileName: string) => Promise<any>;
7
+ export declare const symbolicateFromSources: (frames: UnsymbolicatedStackFrame[], mapValues: Record<string, SourceMapConsumer | null>) => SymbolicatedStackFrame[];
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.symbolicateFromSources = exports.getSourceMapFromRemoteFile = exports.symbolicateStackTraceFromRemoteFrames = exports.symbolicateError = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const truthy_1 = require("./truthy");
6
+ const error_with_stack_frame_1 = require("./error-with-stack-frame");
7
+ const symbolicateError = async (symbolicateableError) => {
8
+ const { delayRenderCall, stackFrame } = symbolicateableError;
9
+ const [mainErrorFrames, delayRenderFrames] = await Promise.all([
10
+ stackFrame ? (0, exports.symbolicateStackTraceFromRemoteFrames)(stackFrame) : null,
11
+ delayRenderCall
12
+ ? (0, exports.symbolicateStackTraceFromRemoteFrames)(delayRenderCall)
13
+ : null,
14
+ ].filter(truthy_1.truthy));
15
+ const symbolicatedErr = new error_with_stack_frame_1.ErrorWithStackFrame({
16
+ message: symbolicateableError.message,
17
+ symbolicatedStackFrames: mainErrorFrames,
18
+ frame: symbolicateableError.frame,
19
+ name: symbolicateableError.name,
20
+ delayRenderCall: delayRenderFrames,
21
+ });
22
+ return symbolicatedErr;
23
+ };
24
+ exports.symbolicateError = symbolicateError;
25
+ const symbolicateStackTraceFromRemoteFrames = async (frames) => {
26
+ const uniqueFileNames = [
27
+ ...new Set(frames
28
+ .map((f) => f.fileName)
29
+ .filter((f) => f.startsWith('http://') || f.startsWith('https://'))
30
+ .filter(truthy_1.truthy)),
31
+ ];
32
+ const maps = await Promise.all(uniqueFileNames.map((fileName) => {
33
+ return (0, exports.getSourceMapFromRemoteFile)(fileName);
34
+ }));
35
+ const mapValues = {};
36
+ for (let i = 0; i < uniqueFileNames.length; i++) {
37
+ mapValues[uniqueFileNames[i]] = maps[i];
38
+ }
39
+ return (0, exports.symbolicateFromSources)(frames, mapValues);
40
+ };
41
+ exports.symbolicateStackTraceFromRemoteFrames = symbolicateStackTraceFromRemoteFrames;
42
+ const getSourceMapFromRemoteFile = async (fileName) => {
43
+ const fileContents = await renderer_1.RenderInternals.fetchUrl(fileName);
44
+ return renderer_1.RenderInternals.getSourceMap(fileName, fileContents, 'remote');
45
+ };
46
+ exports.getSourceMapFromRemoteFile = getSourceMapFromRemoteFile;
47
+ const symbolicateFromSources = (frames, mapValues) => {
48
+ return frames
49
+ .map((frame) => {
50
+ const map = mapValues[frame.fileName];
51
+ if (!map) {
52
+ return null;
53
+ }
54
+ return symbolicateStackFrame(frame, map);
55
+ })
56
+ .filter(truthy_1.truthy);
57
+ };
58
+ exports.symbolicateFromSources = symbolicateFromSources;
59
+ const symbolicateStackFrame = (frame, map) => {
60
+ const pos = getOriginalPosition(map, frame.lineNumber, frame.columnNumber);
61
+ const hasSource = pos.source ? map.sourceContentFor(pos.source, false) : null;
62
+ const scriptCode = hasSource && pos.line
63
+ ? getLinesAround(pos.line, 3, hasSource.split('\n'))
64
+ : null;
65
+ return {
66
+ originalColumnNumber: pos.column,
67
+ originalFileName: pos.source,
68
+ originalFunctionName: frame.functionName,
69
+ originalLineNumber: pos.line,
70
+ originalScriptCode: scriptCode,
71
+ };
72
+ };
73
+ const getOriginalPosition = (source_map, line, column) => {
74
+ const result = source_map.originalPositionFor({
75
+ line,
76
+ column,
77
+ });
78
+ return { line: result.line, column: result.column, source: result.source };
79
+ };
80
+ function getLinesAround(line, count, lines) {
81
+ const result = [];
82
+ for (let index = Math.max(0, line - 1 - count) + 1; index <= Math.min(lines.length - 1, line - 1 + count); ++index) {
83
+ result.push({
84
+ lineNumber: index + 1,
85
+ content: lines[index],
86
+ highlight: index + 1 === line,
87
+ });
88
+ }
89
+ return result;
90
+ }
@@ -0,0 +1,28 @@
1
+ import type { BasicSourceMapConsumer, IndexedSourceMapConsumer } from 'source-map';
2
+ import { SourceMapConsumer } from 'source-map';
3
+ import type { UnsymbolicatedStackFrame } from './parse-browser-error-stack';
4
+ type ScriptLine = {
5
+ lineNumber: number;
6
+ content: string;
7
+ highlight: boolean;
8
+ };
9
+ export type SymbolicatedStackFrame = {
10
+ originalFunctionName: string | null;
11
+ originalFileName: string | null;
12
+ originalLineNumber: number | null;
13
+ originalColumnNumber: number | null;
14
+ originalScriptCode: ScriptLine[] | null;
15
+ };
16
+ export declare const symbolicateStackTraceFromRemoteFrames: (frames: UnsymbolicatedStackFrame[]) => Promise<SymbolicatedStackFrame[]>;
17
+ export declare const symbolicateFromSources: (frames: UnsymbolicatedStackFrame[], mapValues: Record<string, SourceMapConsumer | null>) => SymbolicatedStackFrame[];
18
+ export declare const symbolicateStackFrame: (frame: UnsymbolicatedStackFrame, map: SourceMapConsumer) => {
19
+ originalColumnNumber: number | null;
20
+ originalFileName: string | null;
21
+ originalFunctionName: any;
22
+ originalLineNumber: number | null;
23
+ originalScriptCode: ScriptLine[] | null;
24
+ };
25
+ export declare const getSourceMapFromRemoteFile: (fileName: string) => Promise<SourceMapConsumer | null>;
26
+ export declare const getSourceMapFromLocalFile: (fileName: string) => Promise<SourceMapConsumer | null>;
27
+ export type AnySourceMapConsumer = BasicSourceMapConsumer | IndexedSourceMapConsumer;
28
+ export {};
@@ -0,0 +1,135 @@
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.getSourceMapFromLocalFile = exports.getSourceMapFromRemoteFile = exports.symbolicateStackFrame = exports.symbolicateFromSources = exports.symbolicateStackTraceFromRemoteFrames = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const source_map_1 = require("source-map");
10
+ const read_file_1 = require("./assets/read-file");
11
+ const truthy_1 = require("./truthy");
12
+ function extractSourceMapUrl(fileContents) {
13
+ const regex = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm;
14
+ let match = null;
15
+ for (;;) {
16
+ const next = regex.exec(fileContents);
17
+ if (next === null || next === undefined) {
18
+ break;
19
+ }
20
+ match = next;
21
+ }
22
+ if (!(match === null || match === void 0 ? void 0 : match[1])) {
23
+ return null;
24
+ }
25
+ return match[1].toString();
26
+ }
27
+ const getSourceMap = async (filePath, fileContents, type) => {
28
+ const sm = extractSourceMapUrl(fileContents);
29
+ if (sm === null) {
30
+ return null;
31
+ }
32
+ if (sm.indexOf('data:') === 0) {
33
+ const base64 = /^data:application\/json;([\w=:"-]+;)*base64,/;
34
+ const match2 = sm.match(base64);
35
+ if (!match2) {
36
+ throw new Error('Sorry, non-base64 inline source-map encoding is not supported.');
37
+ }
38
+ const converted = window.atob(sm.substring(match2[0].length));
39
+ return new source_map_1.SourceMapConsumer(JSON.parse(converted));
40
+ }
41
+ if (type === 'local') {
42
+ // Find adjacent file: bundle.js -> bundle.js.map
43
+ const newFilePath = path_1.default.join(path_1.default.dirname(filePath), sm);
44
+ return new source_map_1.SourceMapConsumer((0, fs_1.readFileSync)(newFilePath, 'utf8'));
45
+ }
46
+ const index = filePath.lastIndexOf('/');
47
+ const url = filePath.substring(0, index + 1) + sm;
48
+ const obj = await fetchUrl(url);
49
+ return new source_map_1.SourceMapConsumer(obj);
50
+ };
51
+ const fetchUrl = async (url) => {
52
+ const res = await (0, read_file_1.readFile)(url);
53
+ return new Promise((resolve, reject) => {
54
+ let downloaded = '';
55
+ res.on('data', (d) => {
56
+ downloaded += d;
57
+ });
58
+ res.on('end', () => {
59
+ resolve(downloaded);
60
+ });
61
+ res.on('error', (err) => reject(err));
62
+ });
63
+ };
64
+ function getLinesAround(line, count, lines) {
65
+ const result = [];
66
+ for (let index = Math.max(0, line - 1 - count) + 1; index <= Math.min(lines.length - 1, line - 1 + count); ++index) {
67
+ result.push({
68
+ lineNumber: index + 1,
69
+ content: lines[index],
70
+ highlight: index + 1 === line,
71
+ });
72
+ }
73
+ return result;
74
+ }
75
+ const getOriginalPosition = (source_map, line, column) => {
76
+ const result = source_map.originalPositionFor({
77
+ line,
78
+ column,
79
+ });
80
+ return { line: result.line, column: result.column, source: result.source };
81
+ };
82
+ const symbolicateStackTraceFromRemoteFrames = async (frames) => {
83
+ const uniqueFileNames = [
84
+ ...new Set(frames
85
+ .map((f) => f.fileName)
86
+ .filter((f) => f.startsWith('http://') || f.startsWith('https://'))
87
+ .filter(truthy_1.truthy)),
88
+ ];
89
+ const maps = await Promise.all(uniqueFileNames.map((fileName) => {
90
+ return (0, exports.getSourceMapFromRemoteFile)(fileName);
91
+ }));
92
+ const mapValues = {};
93
+ for (let i = 0; i < uniqueFileNames.length; i++) {
94
+ mapValues[uniqueFileNames[i]] = maps[i];
95
+ }
96
+ return (0, exports.symbolicateFromSources)(frames, mapValues);
97
+ };
98
+ exports.symbolicateStackTraceFromRemoteFrames = symbolicateStackTraceFromRemoteFrames;
99
+ const symbolicateFromSources = (frames, mapValues) => {
100
+ return frames
101
+ .map((frame) => {
102
+ const map = mapValues[frame.fileName];
103
+ if (!map) {
104
+ return null;
105
+ }
106
+ return (0, exports.symbolicateStackFrame)(frame, map);
107
+ })
108
+ .filter(truthy_1.truthy);
109
+ };
110
+ exports.symbolicateFromSources = symbolicateFromSources;
111
+ const symbolicateStackFrame = (frame, map) => {
112
+ const pos = getOriginalPosition(map, frame.lineNumber, frame.columnNumber);
113
+ const hasSource = pos.source ? map.sourceContentFor(pos.source, false) : null;
114
+ const scriptCode = hasSource && pos.line
115
+ ? getLinesAround(pos.line, 3, hasSource.split('\n'))
116
+ : null;
117
+ return {
118
+ originalColumnNumber: pos.column,
119
+ originalFileName: pos.source,
120
+ originalFunctionName: frame.functionName,
121
+ originalLineNumber: pos.line,
122
+ originalScriptCode: scriptCode,
123
+ };
124
+ };
125
+ exports.symbolicateStackFrame = symbolicateStackFrame;
126
+ const getSourceMapFromRemoteFile = async (fileName) => {
127
+ const fileContents = await fetchUrl(fileName);
128
+ return getSourceMap(fileName, fileContents, 'remote');
129
+ };
130
+ exports.getSourceMapFromRemoteFile = getSourceMapFromRemoteFile;
131
+ const getSourceMapFromLocalFile = (fileName) => {
132
+ const fileContents = (0, fs_1.readFileSync)(fileName, 'utf8');
133
+ return getSourceMap(fileName, fileContents, 'local');
134
+ };
135
+ exports.getSourceMapFromLocalFile = getSourceMapFromLocalFile;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * A symbolicateable error is an error that can be symolicated by fetching the original sources. By throwing a symbolicateable error, Remotion CLI will attempt to symplicate it
3
+ */
4
+ import type { UnsymbolicatedStackFrame } from '../parse-browser-error-stack';
5
+ export declare class SymbolicateableError extends Error {
6
+ stackFrame: UnsymbolicatedStackFrame[] | null;
7
+ delayRenderCall: UnsymbolicatedStackFrame[] | null;
8
+ frame: number | null;
9
+ constructor({ message, stack, stackFrame, frame, name, }: {
10
+ message: string;
11
+ stack: string | undefined;
12
+ frame: number | null;
13
+ name: string;
14
+ stackFrame: UnsymbolicatedStackFrame[] | null;
15
+ });
16
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * A symbolicateable error is an error that can be symolicated by fetching the original sources. By throwing a symbolicateable error, Remotion CLI will attempt to symplicate it
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SymbolicateableError = void 0;
7
+ const delay_render_embedded_stack_1 = require("../delay-render-embedded-stack");
8
+ class SymbolicateableError extends Error {
9
+ constructor({ message, stack, stackFrame, frame, name, }) {
10
+ super(message);
11
+ this.stack = stack;
12
+ this.stackFrame = stackFrame;
13
+ this.frame = frame;
14
+ this.name = name;
15
+ this.delayRenderCall = stack ? (0, delay_render_embedded_stack_1.parseDelayRenderEmbeddedStack)(stack) : null;
16
+ }
17
+ }
18
+ exports.SymbolicateableError = SymbolicateableError;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/cli",
3
- "version": "4.1.0-alpha5",
3
+ "version": "4.1.0-alpha8",
4
4
  "description": "CLI for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "sideEffects": false,
@@ -33,13 +33,13 @@
33
33
  "minimist": "1.2.6",
34
34
  "open": "^8.4.2",
35
35
  "prompts": "2.4.1",
36
- "semver": "7.3.5",
36
+ "semver": "7.5.3",
37
37
  "source-map": "0.6.1",
38
- "@remotion/media-utils": "4.1.0-alpha5",
39
- "@remotion/player": "4.1.0-alpha5",
40
- "@remotion/renderer": "4.1.0-alpha5",
41
- "@remotion/bundler": "4.1.0-alpha5",
42
- "remotion": "4.1.0-alpha5"
38
+ "@remotion/bundler": "4.1.0-alpha8",
39
+ "@remotion/player": "4.1.0-alpha8",
40
+ "@remotion/media-utils": "4.1.0-alpha8",
41
+ "@remotion/renderer": "4.1.0-alpha8",
42
+ "remotion": "4.1.0-alpha8"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "react": ">=16.8.0",
@@ -56,7 +56,7 @@
56
56
  "@types/semver": "^7.3.4",
57
57
  "eslint": "8.42.0",
58
58
  "eslint-plugin-10x": "1.5.2",
59
- "eslint-plugin-react": "7.29.4",
59
+ "eslint-plugin-react": "7.32.2",
60
60
  "eslint-plugin-react-hooks": "4.4.0",
61
61
  "prettier": "^2.7.1",
62
62
  "prettier-plugin-organize-imports": "^2.3.4",
@@ -65,8 +65,8 @@
65
65
  "typescript": "4.9.5",
66
66
  "vitest": "0.31.1",
67
67
  "zod": "^3.21.4",
68
- "@remotion/tailwind": "4.1.0-alpha5",
69
- "@remotion/zod-types": "4.1.0-alpha5"
68
+ "@remotion/zod-types": "4.1.0-alpha8",
69
+ "@remotion/tailwind": "4.1.0-alpha8"
70
70
  },
71
71
  "keywords": [
72
72
  "remotion",