@remotion/renderer 4.0.500 → 4.0.502

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/dist/esm/pure.mjs CHANGED
@@ -63,11 +63,12 @@ var getFramesToRender = (frameRange, everyNthFrame) => {
63
63
  if (everyNthFrame === 0) {
64
64
  throw new Error("everyNthFrame cannot be 0");
65
65
  }
66
- return new Array(frameRange[1] - frameRange[0] + 1).fill(true).map((_, index) => {
67
- return index + frameRange[0];
66
+ const ranges = Array.isArray(frameRange[0]) ? frameRange : [frameRange];
67
+ return ranges.flatMap((range) => new Array(range[1] - range[0] + 1).fill(true).map((_, index) => {
68
+ return index + range[0];
68
69
  }).filter((frame) => {
69
- return (frame - frameRange[0]) % everyNthFrame === 0;
70
- });
70
+ return (frame - range[0]) % everyNthFrame === 0;
71
+ }));
71
72
  };
72
73
 
73
74
  // src/codec.ts
@@ -1,2 +1,11 @@
1
- export type FrameRange = number | [number, number] | [number, null];
1
+ export type ResolvedFrameRange = [number, number];
2
+ export type OpenEndedFrameRange = [number, null];
3
+ export type FrameRangeTuple = ResolvedFrameRange | OpenEndedFrameRange;
4
+ export type SingleFrameRange = number | FrameRangeTuple;
5
+ export type FrameRange = SingleFrameRange | FrameRangeTuple[];
6
+ export type FrameSelection = FrameRange | {
7
+ type: 'frames';
8
+ frames: number[];
9
+ } | null;
10
+ export declare const isMultipleFrameRanges: (frameRange: FrameRange) => frameRange is FrameRangeTuple[];
2
11
  export declare const validateFrameRange: (frameRange: FrameRange | null) => void;
@@ -1,6 +1,48 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateFrameRange = void 0;
3
+ exports.validateFrameRange = exports.isMultipleFrameRanges = void 0;
4
+ const isMultipleFrameRanges = (frameRange) => {
5
+ return Array.isArray(frameRange) && Array.isArray(frameRange[0]);
6
+ };
7
+ exports.isMultipleFrameRanges = isMultipleFrameRanges;
8
+ const validateFrameRangeTuple = (frameRange) => {
9
+ if (frameRange.length !== 2) {
10
+ throw new TypeError('Frame range must be a tuple, got an array with length ' +
11
+ frameRange.length);
12
+ }
13
+ const [first, second] = frameRange;
14
+ if (typeof first !== 'number') {
15
+ throw new Error(`The first value of frame range must be a number, but got ${typeof first} (${JSON.stringify(first)})`);
16
+ }
17
+ if (!Number.isFinite(first)) {
18
+ throw new TypeError('The first value of frame range must be finite, but got ' + first);
19
+ }
20
+ if (!Number.isInteger(first)) {
21
+ throw new Error(`The first value of frame range must be an integer, but got a float (${first})`);
22
+ }
23
+ if (first < 0) {
24
+ throw new Error(`The first value of frame range must be non-negative, but got ${first}`);
25
+ }
26
+ if (second === null) {
27
+ return;
28
+ }
29
+ if (typeof second !== 'number') {
30
+ throw new Error(`The second value of frame range must be a number or null, but got ${typeof second} (${JSON.stringify(second)})`);
31
+ }
32
+ if (!Number.isFinite(second)) {
33
+ throw new TypeError('The second value of frame range must be finite, but got ' + second);
34
+ }
35
+ if (!Number.isInteger(second)) {
36
+ throw new Error(`The second value of frame range must be an integer, but got a float (${second})`);
37
+ }
38
+ if (second < 0) {
39
+ throw new Error(`The second value of frame range must be non-negative, but got ${second}`);
40
+ }
41
+ if (second < first) {
42
+ throw new Error('The second value of frame range must be not smaller than the first one, but got ' +
43
+ frameRange.join('-'));
44
+ }
45
+ };
4
46
  const validateFrameRange = (frameRange) => {
5
47
  if (frameRange === null) {
6
48
  return;
@@ -17,45 +59,27 @@ const validateFrameRange = (frameRange) => {
17
59
  }
18
60
  return;
19
61
  }
20
- if (Array.isArray(frameRange)) {
21
- if (frameRange.length !== 2) {
22
- throw new TypeError('Frame range must be a tuple, got an array with length ' +
23
- frameRange.length);
24
- }
25
- const [first, second] = frameRange;
26
- if (typeof first !== 'number') {
27
- throw new Error(`The first value of frame range must be a number, but got ${typeof first} (${JSON.stringify(first)})`);
28
- }
29
- if (!Number.isFinite(first)) {
30
- throw new TypeError('The first value of frame range must be finite, but got ' + first);
31
- }
32
- if (!Number.isInteger(first)) {
33
- throw new Error(`The first value of frame range must be an integer, but got a float (${first})`);
34
- }
35
- if (first < 0) {
36
- throw new Error(`The first value of frame range must be non-negative, but got ${first}`);
37
- }
38
- if (second === null) {
39
- return;
40
- }
41
- if (typeof second !== 'number') {
42
- throw new Error(`The second value of frame range must be a number or null, but got ${typeof second} (${JSON.stringify(second)})`);
62
+ if ((0, exports.isMultipleFrameRanges)(frameRange)) {
63
+ if (frameRange.length === 0) {
64
+ throw new TypeError('Multiple frame ranges must not be empty.');
43
65
  }
44
- if (!Number.isFinite(second)) {
45
- throw new TypeError('The second value of frame range must be finite, but got ' + second);
46
- }
47
- if (!Number.isInteger(second)) {
48
- throw new Error(`The second value of frame range must be an integer, but got a float (${second})`);
49
- }
50
- if (second < 0) {
51
- throw new Error(`The second value of frame range must be non-negative, but got ${second}`);
52
- }
53
- if (second < first) {
54
- throw new Error('The second value of frame range must be not smaller than the first one, but got ' +
55
- frameRange.join('-'));
66
+ for (let index = 0; index < frameRange.length; index++) {
67
+ const range = frameRange[index];
68
+ validateFrameRangeTuple(range);
69
+ if (range[1] === null && index !== frameRange.length - 1) {
70
+ throw new Error('An open-ended frame range must be the last range.');
71
+ }
72
+ const previous = frameRange[index - 1];
73
+ if (previous && previous[1] !== null && range[0] <= previous[1]) {
74
+ throw new Error(`Frame ranges must be ordered and non-overlapping, but got ${previous.join('-')} followed by ${range.join('-')}.`);
75
+ }
56
76
  }
57
77
  return;
58
78
  }
79
+ if (Array.isArray(frameRange)) {
80
+ validateFrameRangeTuple(frameRange);
81
+ return;
82
+ }
59
83
  throw new TypeError('Frame range must be a number or a tuple of numbers, but got object of type ' +
60
84
  typeof frameRange);
61
85
  };
@@ -1 +1,2 @@
1
- export declare const getFramesToRender: (frameRange: [number, number], everyNthFrame: number) => number[];
1
+ import type { ResolvedFrameRange } from './frame-range';
2
+ export declare const getFramesToRender: (frameRange: ResolvedFrameRange[] | ResolvedFrameRange, everyNthFrame: number) => number[];
@@ -5,13 +5,16 @@ const getFramesToRender = (frameRange, everyNthFrame) => {
5
5
  if (everyNthFrame === 0) {
6
6
  throw new Error('everyNthFrame cannot be 0');
7
7
  }
8
- return new Array(frameRange[1] - frameRange[0] + 1)
8
+ const ranges = Array.isArray(frameRange[0])
9
+ ? frameRange
10
+ : [frameRange];
11
+ return ranges.flatMap((range) => new Array(range[1] - range[0] + 1)
9
12
  .fill(true)
10
13
  .map((_, index) => {
11
- return index + frameRange[0];
14
+ return index + range[0];
12
15
  })
13
16
  .filter((frame) => {
14
- return (frame - frameRange[0]) % everyNthFrame === 0;
15
- });
17
+ return (frame - range[0]) % everyNthFrame === 0;
18
+ }));
16
19
  };
17
20
  exports.getFramesToRender = getFramesToRender;
@@ -1,2 +1,3 @@
1
- import type { FrameRange } from './frame-range';
1
+ import { type FrameRange, type ResolvedFrameRange } from './frame-range';
2
+ export declare const getRealFrameRanges: (durationInFrames: number, frameRange: FrameRange | null) => ResolvedFrameRange[];
2
3
  export declare const getRealFrameRange: (durationInFrames: number, frameRange: FrameRange | null) => [number, number];
@@ -1,10 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRealFrameRange = void 0;
4
- const getRealFrameRange = (durationInFrames, frameRange) => {
5
- if (frameRange === null) {
6
- return [0, durationInFrames - 1];
7
- }
3
+ exports.getRealFrameRange = exports.getRealFrameRanges = void 0;
4
+ const frame_range_1 = require("./frame-range");
5
+ const resolveFrameRange = (durationInFrames, frameRange) => {
8
6
  if (typeof frameRange === 'number') {
9
7
  if (frameRange < 0 || frameRange >= durationInFrames) {
10
8
  throw new Error(`Frame number is out of range, must be between 0 and ${durationInFrames - 1} but got ${frameRange}`);
@@ -22,4 +20,22 @@ const getRealFrameRange = (durationInFrames, frameRange) => {
22
20
  }
23
21
  return resolved;
24
22
  };
23
+ const getRealFrameRanges = (durationInFrames, frameRange) => {
24
+ if (frameRange === null) {
25
+ return [[0, durationInFrames - 1]];
26
+ }
27
+ (0, frame_range_1.validateFrameRange)(frameRange);
28
+ if ((0, frame_range_1.isMultipleFrameRanges)(frameRange)) {
29
+ return frameRange.map((range) => resolveFrameRange(durationInFrames, range));
30
+ }
31
+ return [resolveFrameRange(durationInFrames, frameRange)];
32
+ };
33
+ exports.getRealFrameRanges = getRealFrameRanges;
34
+ const getRealFrameRange = (durationInFrames, frameRange) => {
35
+ const ranges = (0, exports.getRealFrameRanges)(durationInFrames, frameRange);
36
+ if (ranges.length !== 1) {
37
+ throw new Error('Expected a single frame range, but received multiple frame ranges.');
38
+ }
39
+ return ranges[0];
40
+ };
25
41
  exports.getRealFrameRange = getRealFrameRange;
package/dist/index.d.ts CHANGED
@@ -18,7 +18,7 @@ export { ErrorWithStackFrame } from './error-handling/handle-javascript-exceptio
18
18
  export { extractAudio } from './extract-audio';
19
19
  export type { FfmpegOverrideFn } from './ffmpeg-override';
20
20
  export { FileExtension } from './file-extensions';
21
- export { FrameRange } from './frame-range';
21
+ export { FrameRange, FrameRangeTuple, FrameSelection, OpenEndedFrameRange, ResolvedFrameRange, SingleFrameRange, } from './frame-range';
22
22
  export { GetCompositionsOptions, getCompositions, LegacyGetCompositionsOptions, } from './get-compositions';
23
23
  export { SilentPart, getSilentParts } from './get-silent-parts';
24
24
  export { VideoMetadata, getVideoMetadata } from './get-video-metadata';
@@ -86,6 +86,7 @@ export declare const RenderInternals: {
86
86
  isServeUrl: (potentialUrl: string) => boolean;
87
87
  ensureOutputDirectory: (outputLocation: string) => void;
88
88
  getRealFrameRange: (durationInFrames: number, frameRange: import("./frame-range").FrameRange | null) => [number, number];
89
+ getRealFrameRanges: (durationInFrames: number, frameRange: import("./frame-range").FrameRange | null) => import("./frame-range").ResolvedFrameRange[];
89
90
  validatePuppeteerTimeout: (timeoutInMilliseconds: unknown) => void;
90
91
  downloadFile: (options: {
91
92
  url: string;
@@ -108,7 +109,7 @@ export declare const RenderInternals: {
108
109
  formatStackFrameCodeFrame: (frame: import("./symbolicate-stacktrace").SymbolicatedStackFrame) => string | null;
109
110
  formatStackFrameLocationLine: (frame: import("./symbolicate-stacktrace").SymbolicatedStackFrame) => string | null;
110
111
  SymbolicateableError: typeof SymbolicateableError;
111
- getFramesToRender: (frameRange: [number, number], everyNthFrame: number) => number[];
112
+ getFramesToRender: (frameRange: import("./frame-range").ResolvedFrameRange[] | import("./frame-range").ResolvedFrameRange, everyNthFrame: number) => number[];
112
113
  getExtensionOfFilename: (filename: string | null) => string | null;
113
114
  getDesiredPort: ({ desiredPort, from, hostsToTry, to, onPortUnavailable, }: {
114
115
  desiredPort: number | undefined;
@@ -157,6 +158,10 @@ export declare const RenderInternals: {
157
158
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
158
159
  DEFAULT_BROWSER: "chrome";
159
160
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
161
+ validateSelectedFrames: ({ frames, durationInFrames, }: {
162
+ frames: unknown;
163
+ durationInFrames: number | null;
164
+ }) => number[];
160
165
  DEFAULT_OPENGL_RENDERER: "angle" | "angle-egl" | "egl" | "swangle" | "swiftshader" | "vulkan" | null;
161
166
  validateOpenGlRenderer: (option: unknown) => "angle" | "angle-egl" | "egl" | "swangle" | "swiftshader" | "vulkan" | null;
162
167
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "av1", "mp3", "aac", "wav", "prores", "h264-mkv", "h264-ts", "gif"];
@@ -1033,6 +1038,8 @@ export declare const RenderInternals: {
1033
1038
  imageFormat: "jpeg" | "none" | "png";
1034
1039
  jpegQuality: number;
1035
1040
  frameRange: import("./frame-range").FrameRange | null;
1041
+ frames: number[] | null;
1042
+ outputFramesInSequence: boolean;
1036
1043
  everyNthFrame: number;
1037
1044
  puppeteerInstance: HeadlessBrowser | undefined;
1038
1045
  browserExecutable: import("./browser-executable").BrowserExecutable;
@@ -1372,7 +1379,7 @@ export declare const RenderInternals: {
1372
1379
  audioCodec: "aac" | "mp3" | "opus" | "pcm-16" | null;
1373
1380
  cancelSignal: import("./make-cancel-signal").CancelSignal | undefined;
1374
1381
  metadata: Record<string, string> | null;
1375
- frameRange: import("./frame-range").FrameRange | null;
1382
+ frameRange: import("./frame-range").SingleFrameRange | null;
1376
1383
  everyNthFrame: number;
1377
1384
  sampleRate: number;
1378
1385
  } & {
package/dist/index.js CHANGED
@@ -88,6 +88,7 @@ const test_gpu_1 = require("./test-gpu");
88
88
  const tmp_dir_1 = require("./tmp-dir");
89
89
  const validate_concurrency_1 = require("./validate-concurrency");
90
90
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
91
+ const validate_selected_frames_1 = require("./validate-selected-frames");
91
92
  const combine_chunks_1 = require("./combine-chunks");
92
93
  Object.defineProperty(exports, "combineChunks", { enumerable: true, get: function () { return combine_chunks_1.combineChunks; } });
93
94
  const ensure_browser_1 = require("./ensure-browser");
@@ -145,6 +146,7 @@ exports.RenderInternals = {
145
146
  isServeUrl: is_serve_url_1.isServeUrl,
146
147
  ensureOutputDirectory: ensure_output_directory_1.ensureOutputDirectory,
147
148
  getRealFrameRange: get_frame_to_render_1.getRealFrameRange,
149
+ getRealFrameRanges: get_frame_to_render_1.getRealFrameRanges,
148
150
  validatePuppeteerTimeout: validate_puppeteer_timeout_1.validatePuppeteerTimeout,
149
151
  downloadFile: download_file_1.downloadFile,
150
152
  parseStack: parse_browser_error_stack_1.parseStack,
@@ -167,6 +169,7 @@ exports.RenderInternals = {
167
169
  validPixelFormats: pixel_format_1.validPixelFormats,
168
170
  DEFAULT_BROWSER: browser_1.DEFAULT_BROWSER,
169
171
  validateFrameRange: frame_range_1.validateFrameRange,
172
+ validateSelectedFrames: validate_selected_frames_1.validateSelectedFrames,
170
173
  DEFAULT_OPENGL_RENDERER: gl_1.DEFAULT_OPENGL_RENDERER,
171
174
  validateOpenGlRenderer: gl_1.validateOpenGlRenderer,
172
175
  validCodecs: codec_1.validCodecs,
@@ -33,6 +33,9 @@ type InternalOpenBrowserOptions = {
33
33
  type LogOptions = typeof NoReactInternals.ENABLE_V5_BREAKING_CHANGES extends true ? {
34
34
  logLevel?: LogLevel;
35
35
  } : {
36
+ /**
37
+ * @deprecated Use `logLevel` instead.
38
+ */
36
39
  shouldDumpIo?: boolean;
37
40
  logLevel?: LogLevel;
38
41
  };
@@ -1,17 +1,17 @@
1
- import type { FrameRange } from '../frame-range';
1
+ import type { FrameSelection } from '../frame-range';
2
2
  export declare const framesOption: {
3
3
  name: string;
4
4
  cliFlag: "frames";
5
5
  description: () => import("react/jsx-runtime").JSX.Element;
6
6
  ssrName: "frameRange";
7
7
  docLink: string;
8
- type: FrameRange | null;
8
+ type: FrameSelection;
9
9
  getValue: ({ commandLine }: {
10
10
  commandLine: Record<string, unknown>;
11
11
  }) => {
12
12
  source: string;
13
- value: FrameRange | null;
13
+ value: FrameSelection;
14
14
  };
15
- setConfig: (value: FrameRange | null) => void;
15
+ setConfig: (value: FrameSelection) => void;
16
16
  id: "frames";
17
17
  };
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.framesOption = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const frame_range_1 = require("../frame-range");
6
+ const validate_selected_frames_1 = require("../validate-selected-frames");
6
7
  const cliFlag = 'frames';
7
- let frameRange = null;
8
+ let frameSelection = null;
8
9
  const parseFrameRangeFromCli = (newFrameRange) => {
9
10
  if (typeof newFrameRange === 'number') {
10
11
  if (newFrameRange < 0) {
@@ -16,6 +17,37 @@ const parseFrameRangeFromCli = (newFrameRange) => {
16
17
  if (newFrameRange.trim() === '') {
17
18
  throw new Error('--frames flag must be a single number, or 2 numbers separated by `-`');
18
19
  }
20
+ if (newFrameRange.includes(',')) {
21
+ const selectors = newFrameRange
22
+ .split(',')
23
+ .map((selector) => selector.trim());
24
+ if (selectors.some((selector) => selector === '')) {
25
+ throw new TypeError('--frames must contain a frame or frame range between commas.');
26
+ }
27
+ const onlyFrames = selectors.every((selector) => !selector.includes('-'));
28
+ if (onlyFrames) {
29
+ const frames = (0, validate_selected_frames_1.validateSelectedFrames)({
30
+ frames: selectors.map((frame) => Number(frame)),
31
+ durationInFrames: null,
32
+ });
33
+ return { type: 'frames', frames };
34
+ }
35
+ const ranges = selectors.map((selector) => {
36
+ if (!selector.includes('-')) {
37
+ const frame = Number(selector);
38
+ return [frame, frame];
39
+ }
40
+ const rangeParts = selector.split('-');
41
+ if (rangeParts.length !== 2 || rangeParts[0] === '') {
42
+ throw new Error(`Invalid frame selector "${selector}". Use a frame number, a range such as 0-9, or an open-ended range such as 100-.`);
43
+ }
44
+ const start = Number(rangeParts[0]);
45
+ const end = rangeParts[1] === '' ? null : Number(rangeParts[1]);
46
+ return [start, end];
47
+ });
48
+ (0, frame_range_1.validateFrameRange)(ranges);
49
+ return ranges;
50
+ }
19
51
  const parts = newFrameRange.split('-');
20
52
  if (parts.length > 2 || parts.length <= 0) {
21
53
  throw new Error(`--frames flag must be a number or 2 numbers separated by '-', instead got ${parts.length} numbers`);
@@ -23,7 +55,7 @@ const parseFrameRangeFromCli = (newFrameRange) => {
23
55
  if (parts.length === 1) {
24
56
  const value = Number(parts[0]);
25
57
  if (isNaN(value)) {
26
- throw new Error('--frames flag must be a single number, or 2 numbers separated by `-`');
58
+ throw new Error('--frames flag must be a frame number, range, or comma-separated selection');
27
59
  }
28
60
  return value;
29
61
  }
@@ -31,7 +63,7 @@ const parseFrameRangeFromCli = (newFrameRange) => {
31
63
  if (secondPart === '' && firstPart !== '') {
32
64
  const start = Number(firstPart);
33
65
  if (isNaN(start)) {
34
- throw new Error('--frames flag must be a single number, or 2 numbers separated by `-`');
66
+ throw new Error('--frames flag must be a frame number, range, or comma-separated selection');
35
67
  }
36
68
  return [start, null];
37
69
  }
@@ -39,7 +71,7 @@ const parseFrameRangeFromCli = (newFrameRange) => {
39
71
  const [first, second] = parsed;
40
72
  for (const value of parsed) {
41
73
  if (isNaN(value)) {
42
- throw new Error('--frames flag must be a single number, or 2 numbers separated by `-`');
74
+ throw new Error('--frames flag must be a frame number, range, or comma-separated selection');
43
75
  }
44
76
  }
45
77
  if (second < first) {
@@ -62,7 +94,15 @@ exports.framesOption = {
62
94
  getValue: ({ commandLine }) => {
63
95
  if (commandLine[cliFlag] !== undefined) {
64
96
  const value = parseFrameRangeFromCli(commandLine[cliFlag]);
65
- (0, frame_range_1.validateFrameRange)(value);
97
+ if (typeof value === 'object' && !Array.isArray(value)) {
98
+ (0, validate_selected_frames_1.validateSelectedFrames)({
99
+ frames: value.frames,
100
+ durationInFrames: null,
101
+ });
102
+ }
103
+ else {
104
+ (0, frame_range_1.validateFrameRange)(value);
105
+ }
66
106
  return {
67
107
  source: 'cli',
68
108
  value,
@@ -70,14 +110,17 @@ exports.framesOption = {
70
110
  }
71
111
  return {
72
112
  source: 'config',
73
- value: frameRange,
113
+ value: frameSelection,
74
114
  };
75
115
  },
76
116
  setConfig: (value) => {
77
- if (value !== null) {
117
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
118
+ (0, validate_selected_frames_1.validateSelectedFrames)({ frames: value.frames, durationInFrames: null });
119
+ }
120
+ else if (value !== null) {
78
121
  (0, frame_range_1.validateFrameRange)(value);
79
122
  }
80
- frameRange = value;
123
+ frameSelection = value;
81
124
  },
82
125
  id: cliFlag,
83
126
  };
@@ -1118,14 +1118,14 @@ export declare const allOptions: {
1118
1118
  description: () => import("react/jsx-runtime").JSX.Element;
1119
1119
  ssrName: "frameRange";
1120
1120
  docLink: string;
1121
- type: import("..").FrameRange | null;
1121
+ type: import("..").FrameSelection;
1122
1122
  getValue: ({ commandLine }: {
1123
1123
  commandLine: Record<string, unknown>;
1124
1124
  }) => {
1125
1125
  source: string;
1126
- value: import("..").FrameRange | null;
1126
+ value: import("..").FrameSelection;
1127
1127
  };
1128
- setConfig: (value: import("..").FrameRange | null) => void;
1128
+ setConfig: (value: import("..").FrameSelection) => void;
1129
1129
  id: "frames";
1130
1130
  };
1131
1131
  forceNewStudioOption: {
@@ -1319,7 +1319,7 @@ export declare const allOptions: {
1319
1319
  };
1320
1320
  rspackOption: {
1321
1321
  name: string;
1322
- cliFlag: "experimental-rspack";
1322
+ cliFlag: "rspack";
1323
1323
  description: () => import("react/jsx-runtime").JSX.Element;
1324
1324
  ssrName: null;
1325
1325
  docLink: null;
@@ -1331,7 +1331,7 @@ export declare const allOptions: {
1331
1331
  source: string;
1332
1332
  };
1333
1333
  setConfig(value: boolean): void;
1334
- id: "experimental-rspack";
1334
+ id: "rspack";
1335
1335
  };
1336
1336
  outDirOption: {
1337
1337
  name: string;
@@ -1,6 +1,6 @@
1
1
  export declare const rspackOption: {
2
2
  name: string;
3
- cliFlag: "experimental-rspack";
3
+ cliFlag: "rspack";
4
4
  description: () => import("react/jsx-runtime").JSX.Element;
5
5
  ssrName: null;
6
6
  docLink: null;
@@ -12,5 +12,5 @@ export declare const rspackOption: {
12
12
  source: string;
13
13
  };
14
14
  setConfig(value: boolean): void;
15
- id: "experimental-rspack";
15
+ id: "rspack";
16
16
  };
@@ -3,17 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rspackOption = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  let rspackEnabled = false;
6
- const cliFlag = 'experimental-rspack';
6
+ const cliFlag = 'rspack';
7
7
  exports.rspackOption = {
8
- name: 'Experimental Rspack',
8
+ name: 'Rspack',
9
9
  cliFlag,
10
10
  description: () => (jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: "Uses Rspack instead of Webpack as the bundler for the Studio or bundle." })),
11
11
  ssrName: null,
12
12
  docLink: null,
13
13
  type: false,
14
14
  getValue: ({ commandLine }) => {
15
- if (commandLine[cliFlag] !== undefined) {
16
- rspackEnabled = true;
15
+ if (commandLine[cliFlag] !== undefined && commandLine[cliFlag] !== null) {
17
16
  return {
18
17
  value: commandLine[cliFlag],
19
18
  source: 'cli',
package/dist/pure.d.ts CHANGED
@@ -8,7 +8,7 @@ export declare const NoReactAPIs: {
8
8
  preferLossless: boolean;
9
9
  separateAudioTo: string | null;
10
10
  }) => void;
11
- getFramesToRender: (frameRange: [number, number], everyNthFrame: number) => number[];
11
+ getFramesToRender: (frameRange: import("./frame-range").ResolvedFrameRange[] | import("./frame-range").ResolvedFrameRange, everyNthFrame: number) => number[];
12
12
  codecSupportsMedia: (codec: "aac" | "av1" | "gif" | "h264" | "h264-mkv" | "h264-ts" | "h265" | "mp3" | "prores" | "vp8" | "vp9" | "wav") => {
13
13
  video: boolean;
14
14
  audio: boolean;
@@ -109,6 +109,7 @@ const renderFrameWithOptionToReject = async ({ reject, width, height, compId, at
109
109
  return (0, compress_assets_1.compressAsset)(previousAudioRenderAssets, asset);
110
110
  });
111
111
  const inlineAudioAssets = (0, filter_asset_types_1.onlyInlineAudio)(collectedAssets);
112
+ const outputFrame = allFramesAndExtraFrames[0] + allFramesAndExtraFrames.indexOf(frame);
112
113
  assets.push({
113
114
  audioAndVideoAssets: compressedAssets,
114
115
  frame,
@@ -138,7 +139,7 @@ const renderFrameWithOptionToReject = async ({ reject, width, height, compId, at
138
139
  }
139
140
  for (const renderAsset of inlineAudioAssets) {
140
141
  downloadMap.inlineAudioMixing.addAsset({
141
- asset: renderAsset,
142
+ asset: { ...renderAsset, frame: outputFrame },
142
143
  fps,
143
144
  totalNumberOfFrames: allFramesAndExtraFrames.length,
144
145
  firstFrame: allFramesAndExtraFrames[0],
@@ -4,7 +4,7 @@ import type { BrowserExecutable } from './browser-executable';
4
4
  import type { BrowserLog } from './browser-log';
5
5
  import type { HeadlessBrowser } from './browser/Browser';
6
6
  import type { OnLog } from './browser/BrowserPage';
7
- import type { FrameRange } from './frame-range';
7
+ import { type FrameRange } from './frame-range';
8
8
  import type { VideoImageFormat } from './image-format';
9
9
  import type { CancelSignal } from './make-cancel-signal';
10
10
  import type { ChromiumOptions } from './open-browser';
@@ -22,6 +22,8 @@ type InternalRenderFramesOptions = {
22
22
  imageFormat: VideoImageFormat;
23
23
  jpegQuality: number;
24
24
  frameRange: FrameRange | null;
25
+ frames: number[] | null;
26
+ outputFramesInSequence: boolean;
25
27
  everyNthFrame: number;
26
28
  puppeteerInstance: HeadlessBrowser | undefined;
27
29
  browserExecutable: BrowserExecutable | null;
@@ -70,6 +72,7 @@ export type RenderFramesOptions = Prettify<{
70
72
  */
71
73
  quality?: never;
72
74
  frameRange?: FrameRange | null;
75
+ frames?: number[];
73
76
  everyNthFrame?: number;
74
77
  /**
75
78
  * @deprecated Use "logLevel": "verbose" instead
@@ -116,6 +119,7 @@ export declare const renderFrames: (options: {
116
119
  imageFormat?: "jpeg" | "none" | "png" | undefined;
117
120
  quality?: undefined;
118
121
  frameRange?: FrameRange | null | undefined;
122
+ frames?: number[] | undefined;
119
123
  everyNthFrame?: number | undefined;
120
124
  dumpBrowserLogs?: boolean | undefined;
121
125
  verbose?: boolean | undefined;