remotion 3.3.55 → 3.3.56

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 (143) hide show
  1. package/dist/cjs/audio/Audio.d.ts +1 -1
  2. package/dist/cjs/index.d.ts +1 -0
  3. package/dist/cjs/internals.d.ts +1 -1
  4. package/dist/cjs/use-video.d.ts +1 -1
  5. package/dist/cjs/version.d.ts +1 -1
  6. package/dist/cjs/version.js +1 -1
  7. package/dist/esm/index.mjs +1 -1
  8. package/dist/esm/version.mjs +1 -1
  9. package/dist/tsconfig-esm.tsbuildinfo +1 -0
  10. package/package.json +3 -3
  11. package/tsconfig-esm.json +12 -0
  12. package/dist/esm/AbsoluteFill.js +0 -25
  13. package/dist/esm/CanUseRemotionHooks.js +0 -6
  14. package/dist/esm/Clipper.js +0 -20
  15. package/dist/esm/Composition.js +0 -112
  16. package/dist/esm/CompositionManager.js +0 -137
  17. package/dist/esm/Folder.js +0 -33
  18. package/dist/esm/IFrame.js +0 -25
  19. package/dist/esm/Img.js +0 -53
  20. package/dist/esm/NativeLayers.js +0 -25
  21. package/dist/esm/Null.js +0 -21
  22. package/dist/esm/RemotionRoot.js +0 -69
  23. package/dist/esm/Sequence.js +0 -128
  24. package/dist/esm/SequenceContext.js +0 -2
  25. package/dist/esm/Still.js +0 -9
  26. package/dist/esm/absolute-src.js +0 -3
  27. package/dist/esm/asset-types.js +0 -1
  28. package/dist/esm/audio/Audio.js +0 -53
  29. package/dist/esm/audio/AudioForDevelopment.js +0 -91
  30. package/dist/esm/audio/AudioForRendering.js +0 -108
  31. package/dist/esm/audio/index.js +0 -2
  32. package/dist/esm/audio/props.js +0 -1
  33. package/dist/esm/audio/shared-audio-tags.js +0 -194
  34. package/dist/esm/audio/use-audio-frame.js +0 -18
  35. package/dist/esm/bezier.js +0 -110
  36. package/dist/esm/cancel-render.js +0 -43
  37. package/dist/esm/config/input-props.js +0 -27
  38. package/dist/esm/config.js +0 -17
  39. package/dist/esm/default-css.js +0 -44
  40. package/dist/esm/delay-render.js +0 -72
  41. package/dist/esm/easing.js +0 -77
  42. package/dist/esm/freeze.js +0 -34
  43. package/dist/esm/get-asset-file-name.js +0 -10
  44. package/dist/esm/get-environment.js +0 -29
  45. package/dist/esm/get-preview-dom-element.js +0 -3
  46. package/dist/esm/get-static-files.js +0 -31
  47. package/dist/esm/get-timeline-clip-name.js +0 -21
  48. package/dist/esm/index.js +0 -49
  49. package/dist/esm/internals.js +0 -75
  50. package/dist/esm/interpolate-colors.js +0 -401
  51. package/dist/esm/interpolate.js +0 -123
  52. package/dist/esm/is-approximately-the-same.js +0 -4
  53. package/dist/esm/is-player.js +0 -9
  54. package/dist/esm/loading-indicator.js +0 -31
  55. package/dist/esm/loop/index.js +0 -29
  56. package/dist/esm/multiple-versions-warning.js +0 -28
  57. package/dist/esm/nonce.js +0 -13
  58. package/dist/esm/play-and-handle-not-allowed-error.js +0 -40
  59. package/dist/esm/portal-node.js +0 -19
  60. package/dist/esm/prefetch-state.js +0 -22
  61. package/dist/esm/prefetch.js +0 -107
  62. package/dist/esm/random.js +0 -37
  63. package/dist/esm/register-root.js +0 -31
  64. package/dist/esm/series/flatten-children.js +0 -12
  65. package/dist/esm/series/index.js +0 -61
  66. package/dist/esm/setup-env-variables.js +0 -32
  67. package/dist/esm/spring/index.js +0 -50
  68. package/dist/esm/spring/measure-spring.js +0 -64
  69. package/dist/esm/spring/spring-utils.js +0 -99
  70. package/dist/esm/static-file.js +0 -29
  71. package/dist/esm/test/Img.test.js +0 -20
  72. package/dist/esm/test/absolute-src.test.js +0 -16
  73. package/dist/esm/test/audio-for-rendering.test.js +0 -83
  74. package/dist/esm/test/audio.test.js +0 -51
  75. package/dist/esm/test/bezier.test.js +0 -50
  76. package/dist/esm/test/composition-rules.test.js +0 -28
  77. package/dist/esm/test/composition-validation.test.js +0 -97
  78. package/dist/esm/test/easing.test.js +0 -189
  79. package/dist/esm/test/expect-to-throw.js +0 -11
  80. package/dist/esm/test/freeze.test.js +0 -63
  81. package/dist/esm/test/get-asset-file-name.test.js +0 -12
  82. package/dist/esm/test/get-current-time.test.js +0 -72
  83. package/dist/esm/test/input-props.test.js +0 -29
  84. package/dist/esm/test/interpolate.test.js +0 -136
  85. package/dist/esm/test/interpolateColors.test.js +0 -61
  86. package/dist/esm/test/loop-validation.test.js +0 -68
  87. package/dist/esm/test/measure-spring.test.js +0 -43
  88. package/dist/esm/test/media-validation.test.js +0 -45
  89. package/dist/esm/test/nested-sequences.test.js +0 -130
  90. package/dist/esm/test/not-all-props-in-media-tags.test.js +0 -28
  91. package/dist/esm/test/random.test.js +0 -58
  92. package/dist/esm/test/ready-manager.test.js +0 -27
  93. package/dist/esm/test/render-hook.js +0 -20
  94. package/dist/esm/test/sequence-from-initial-offset.test.js +0 -33
  95. package/dist/esm/test/sequence-validation.test.js +0 -45
  96. package/dist/esm/test/series.test.js +0 -113
  97. package/dist/esm/test/spring.test.js +0 -36
  98. package/dist/esm/test/truthy.test.js +0 -22
  99. package/dist/esm/test/use-audio-frame.test.js +0 -53
  100. package/dist/esm/test/use-media-in-timeline.test.js +0 -49
  101. package/dist/esm/test/use-media-tag-volume.test.js +0 -44
  102. package/dist/esm/test/use-sync-volume-with-media-tag.test.js +0 -53
  103. package/dist/esm/test/validate-start-from-props.test.js +0 -37
  104. package/dist/esm/test/video.test.js +0 -55
  105. package/dist/esm/test/volume-prop.test.js +0 -93
  106. package/dist/esm/test/wrap-sequence-context.js +0 -37
  107. package/dist/esm/timeline-position-state.js +0 -35
  108. package/dist/esm/truthy.js +0 -3
  109. package/dist/esm/use-current-frame.js +0 -23
  110. package/dist/esm/use-lazy-component.js +0 -22
  111. package/dist/esm/use-media-in-timeline.js +0 -125
  112. package/dist/esm/use-media-playback.js +0 -73
  113. package/dist/esm/use-media-tag-volume.js +0 -27
  114. package/dist/esm/use-sync-volume-with-media-tag.js +0 -17
  115. package/dist/esm/use-unsafe-video-config.js +0 -23
  116. package/dist/esm/use-video-config.js +0 -26
  117. package/dist/esm/use-video.js +0 -24
  118. package/dist/esm/validate-frame.js +0 -20
  119. package/dist/esm/validate-media-props.js +0 -20
  120. package/dist/esm/validate-start-from-props.js +0 -27
  121. package/dist/esm/validation/validate-composition-id.js +0 -8
  122. package/dist/esm/validation/validate-dimensions.js +0 -17
  123. package/dist/esm/validation/validate-duration-in-frames.js +0 -11
  124. package/dist/esm/validation/validate-folder-name.js +0 -14
  125. package/dist/esm/validation/validate-fps.js +0 -17
  126. package/dist/esm/validation/validate-offthreadvideo-image-format.js +0 -11
  127. package/dist/esm/validation/validation-spring-duration.js +0 -17
  128. package/dist/esm/version.js +0 -2
  129. package/dist/esm/video/OffthreadVideo.js +0 -33
  130. package/dist/esm/video/OffthreadVideoForRendering.js +0 -100
  131. package/dist/esm/video/Video.js +0 -51
  132. package/dist/esm/video/VideoForDevelopment.js +0 -110
  133. package/dist/esm/video/VideoForRendering.js +0 -200
  134. package/dist/esm/video/duration-state.js +0 -29
  135. package/dist/esm/video/get-current-time.js +0 -26
  136. package/dist/esm/video/index.js +0 -2
  137. package/dist/esm/video/props.js +0 -1
  138. package/dist/esm/video/video-fragment.js +0 -55
  139. package/dist/esm/video-config.js +0 -1
  140. package/dist/esm/volume-position-state.js +0 -27
  141. package/dist/esm/volume-prop.js +0 -20
  142. package/dist/esm/warn-about-non-seekable-media.js +0 -30
  143. package/dist/esm/wrap-remotion-context.js +0 -45
@@ -1,64 +0,0 @@
1
- import { validateFps } from '../validation/validate-fps.js';
2
- import { springCalculation } from './spring-utils.js';
3
- /**
4
- * @description The function returns how long it takes for a spring animation to settle
5
- * @see [Documentation](https://www.remotion.dev/docs/measure-spring)
6
- */
7
- export function measureSpring({ fps, config = {}, threshold = 0.005, from = 0, to = 1, }) {
8
- if (typeof threshold !== 'number') {
9
- throw new TypeError(`threshold must be a number, got ${threshold} of type ${typeof threshold}`);
10
- }
11
- if (threshold === 0) {
12
- return Infinity;
13
- }
14
- if (threshold === 1) {
15
- return 0;
16
- }
17
- if (isNaN(threshold)) {
18
- throw new TypeError('Threshold is NaN');
19
- }
20
- if (!Number.isFinite(threshold)) {
21
- throw new TypeError('Threshold is not finite');
22
- }
23
- if (threshold < 0) {
24
- throw new TypeError('Threshold is below 0');
25
- }
26
- validateFps(fps, 'to the measureSpring() function', false);
27
- const range = Math.abs(from - to);
28
- let frame = 0;
29
- let finishedFrame = 0;
30
- const calc = () => {
31
- return springCalculation({
32
- fps,
33
- frame,
34
- config,
35
- from,
36
- to,
37
- });
38
- };
39
- let animation = calc();
40
- const calcDifference = () => {
41
- return (Math.abs(animation.current - animation.toValue) /
42
- (range === 0 ? 1 : range));
43
- };
44
- let difference = calcDifference();
45
- while (difference >= threshold) {
46
- frame++;
47
- animation = calc();
48
- difference = calcDifference();
49
- }
50
- // Since spring is bouncy, just because it's under the threshold we
51
- // cannot be sure it's done. We need to animate further until it stays in the
52
- // threshold for, say, 20 frames.
53
- finishedFrame = frame;
54
- for (let i = 0; i < 20; i++) {
55
- frame++;
56
- animation = calc();
57
- difference = calcDifference();
58
- if (difference >= threshold) {
59
- i = 0;
60
- finishedFrame = frame + 1;
61
- }
62
- }
63
- return finishedFrame;
64
- }
@@ -1,99 +0,0 @@
1
- const defaultSpringConfig = {
2
- damping: 10,
3
- mass: 1,
4
- stiffness: 100,
5
- overshootClamping: false,
6
- };
7
- const advanceCache = {};
8
- function advance({ animation, now, config, }) {
9
- const { toValue, lastTimestamp, current, velocity } = animation;
10
- const deltaTime = Math.min(now - lastTimestamp, 64);
11
- const c = config.damping;
12
- const m = config.mass;
13
- const k = config.stiffness;
14
- const cacheKey = [
15
- toValue,
16
- lastTimestamp,
17
- current,
18
- velocity,
19
- c,
20
- m,
21
- k,
22
- now,
23
- ].join('-');
24
- if (advanceCache[cacheKey]) {
25
- return advanceCache[cacheKey];
26
- }
27
- const v0 = -velocity;
28
- const x0 = toValue - current;
29
- const zeta = c / (2 * Math.sqrt(k * m)); // damping ratio
30
- const omega0 = Math.sqrt(k / m); // undamped angular frequency of the oscillator (rad/ms)
31
- const omega1 = omega0 * Math.sqrt(1 - zeta ** 2); // exponential decay
32
- const t = deltaTime / 1000;
33
- const sin1 = Math.sin(omega1 * t);
34
- const cos1 = Math.cos(omega1 * t);
35
- // under damped
36
- const underDampedEnvelope = Math.exp(-zeta * omega0 * t);
37
- const underDampedFrag1 = underDampedEnvelope *
38
- (sin1 * ((v0 + zeta * omega0 * x0) / omega1) + x0 * cos1);
39
- const underDampedPosition = toValue - underDampedFrag1;
40
- // This looks crazy -- it's actually just the derivative of the oscillation function
41
- const underDampedVelocity = zeta * omega0 * underDampedFrag1 -
42
- underDampedEnvelope *
43
- (cos1 * (v0 + zeta * omega0 * x0) - omega1 * x0 * sin1);
44
- // critically damped
45
- const criticallyDampedEnvelope = Math.exp(-omega0 * t);
46
- const criticallyDampedPosition = toValue - criticallyDampedEnvelope * (x0 + (v0 + omega0 * x0) * t);
47
- const criticallyDampedVelocity = criticallyDampedEnvelope *
48
- (v0 * (t * omega0 - 1) + t * x0 * omega0 * omega0);
49
- const animationNode = {
50
- toValue,
51
- prevPosition: current,
52
- lastTimestamp: now,
53
- current: zeta < 1 ? underDampedPosition : criticallyDampedPosition,
54
- velocity: zeta < 1 ? underDampedVelocity : criticallyDampedVelocity,
55
- };
56
- advanceCache[cacheKey] = animationNode;
57
- return animationNode;
58
- }
59
- const calculationCache = {};
60
- export function springCalculation({ from = 0, to = 1, frame, fps, config = {}, }) {
61
- const cacheKey = [
62
- from,
63
- to,
64
- frame,
65
- fps,
66
- config.damping,
67
- config.mass,
68
- config.overshootClamping,
69
- config.stiffness,
70
- ].join('-');
71
- if (calculationCache[cacheKey]) {
72
- return calculationCache[cacheKey];
73
- }
74
- let animation = {
75
- lastTimestamp: 0,
76
- current: from,
77
- toValue: to,
78
- velocity: 0,
79
- prevPosition: 0,
80
- };
81
- const frameClamped = Math.max(0, frame);
82
- const unevenRest = frameClamped % 1;
83
- for (let f = 0; f <= Math.floor(frameClamped); f++) {
84
- if (f === Math.floor(frameClamped)) {
85
- f += unevenRest;
86
- }
87
- const time = (f / fps) * 1000;
88
- animation = advance({
89
- animation,
90
- now: time,
91
- config: {
92
- ...defaultSpringConfig,
93
- ...config,
94
- },
95
- });
96
- }
97
- calculationCache[cacheKey] = animation;
98
- return animation;
99
- }
@@ -1,29 +0,0 @@
1
- const trimLeadingSlash = (path) => {
2
- if (path.startsWith('/')) {
3
- return trimLeadingSlash(path.substr(1));
4
- }
5
- return path;
6
- };
7
- const inner = (path) => {
8
- if (typeof window !== 'undefined' && window.remotion_staticBase) {
9
- return `${window.remotion_staticBase}/${trimLeadingSlash(path)}`;
10
- }
11
- return `/${trimLeadingSlash(path)}`;
12
- };
13
- /**
14
- * @description Reference a file from the public/ folder. If the file does not appear in the autocomplete, type the path manually.
15
- * @see [Documentation](https://www.remotion.dev/docs/staticfile)
16
- */
17
- export const staticFile = (path) => {
18
- if (path.startsWith('http://') || path.startsWith('https://')) {
19
- throw new TypeError(`staticFile() does not support remote URLs - got "${path}". Instead, pass the URL without wrapping it in staticFile(). See: https://remotion.dev/docs/staticfile-remote-urls`);
20
- }
21
- if (path.startsWith('..') || path.startsWith('./')) {
22
- throw new TypeError(`staticFile() does not support relative paths - got "${path}". Instead, pass the name of a file that is inside the public/ folder. See: https://remotion.dev/docs/staticfile-relative-paths`);
23
- }
24
- const preparsed = inner(path);
25
- if (!preparsed.startsWith('/')) {
26
- return `/${preparsed}`;
27
- }
28
- return preparsed;
29
- };
@@ -1,20 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- /**
3
- * @vitest-environment jsdom
4
- */
5
- import { render } from '@testing-library/react';
6
- import React from 'react';
7
- import { beforeEach, expect, test } from 'vitest';
8
- import { Img } from '../Img.js';
9
- const ref = React.createRef();
10
- const testImgUrl = 'https://source.unsplash.com/random/50x50';
11
- beforeEach(() => {
12
- render(_jsx(Img, { ref: ref, src: testImgUrl }));
13
- });
14
- test('Img component renders img tag', () => {
15
- var _a;
16
- expect((_a = ref.current) === null || _a === void 0 ? void 0 : _a.tagName).toBe('IMG');
17
- });
18
- test('Src attribute is forwarded to img tag', () => {
19
- expect(ref.current).toHaveProperty('src', testImgUrl);
20
- });
@@ -1,16 +0,0 @@
1
- /**
2
- * @vitest-environment jsdom
3
- */
4
- import { describe, expect, test } from 'vitest';
5
- import { getAbsoluteSrc } from '../absolute-src.js';
6
- describe('Absolute src should behave as expected', () => {
7
- test('Get localhost:8080', () => {
8
- expect(getAbsoluteSrc('http://localhost:8080')).toBe('http://localhost:8080/');
9
- });
10
- test('Get localhost/hi', () => {
11
- expect(getAbsoluteSrc('/hi')).toBe('http://localhost:3000/hi');
12
- });
13
- test('Get data:base64', () => {
14
- expect(getAbsoluteSrc('data:base64,image/png,abc')).toBe('data:base64,image/png,abc');
15
- });
16
- });
@@ -1,83 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * @vitest-environment jsdom
4
- */
5
- import { render } from '@testing-library/react';
6
- import React from 'react';
7
- import { afterAll, beforeAll, beforeEach, describe, expect, test, vitest, } from 'vitest';
8
- import { AudioForRendering } from '../audio/AudioForRendering.js';
9
- import { CanUseRemotionHooksProvider } from '../CanUseRemotionHooks.js';
10
- import { Internals } from '../internals.js';
11
- import { expectToThrow } from './expect-to-throw.js';
12
- let mockContext;
13
- describe('Register and unregister asset', () => {
14
- function createMockContext() {
15
- const registerAsset = vitest.fn();
16
- const unregisterAsset = vitest.fn();
17
- window.remotion_audioEnabled = true;
18
- const MockProvider = ({ children }) => {
19
- return (_jsx(CanUseRemotionHooksProvider, { children: _jsx(Internals.CompositionManager.Provider, { value:
20
- // eslint-disable-next-line react/jsx-no-constructed-context-values
21
- {
22
- registerAsset,
23
- unregisterAsset,
24
- }, children: children }) }));
25
- };
26
- return {
27
- MockProvider,
28
- registerAsset,
29
- unregisterAsset,
30
- };
31
- }
32
- beforeEach(() => {
33
- mockContext = createMockContext();
34
- });
35
- test('register and unregister asset', () => {
36
- const props = {
37
- src: 'test',
38
- muted: false,
39
- volume: 50,
40
- onDuration: vitest.fn(),
41
- };
42
- const { unmount } = render(_jsx(CanUseRemotionHooksProvider, { children: _jsx(mockContext.MockProvider, { children: _jsx(AudioForRendering, { ...props }) }) }));
43
- expect(mockContext.registerAsset).toHaveBeenCalled();
44
- unmount();
45
- expect(mockContext.unregisterAsset).toHaveBeenCalled();
46
- });
47
- test('no src passed', () => {
48
- const props = {
49
- src: undefined,
50
- muted: false,
51
- volume: 50,
52
- onDuration: vitest.fn(),
53
- };
54
- expectToThrow(() => {
55
- render(_jsx(CanUseRemotionHooksProvider, { children: _jsx(mockContext.MockProvider, { children: _jsx(AudioForRendering, { ...props }) }) }));
56
- }, /No src passed/);
57
- expect(mockContext.registerAsset).not.toHaveBeenCalled();
58
- expect(mockContext.unregisterAsset).not.toHaveBeenCalled();
59
- });
60
- });
61
- let mockUseEffect;
62
- describe('useEffect tests', () => {
63
- const useEffectSpy = vitest.spyOn(React, 'useEffect');
64
- mockUseEffect = vitest.fn();
65
- beforeAll(() => {
66
- useEffectSpy.mockImplementation(() => {
67
- mockUseEffect();
68
- });
69
- });
70
- afterAll(() => {
71
- useEffectSpy.mockRestore();
72
- });
73
- test.skip('has registered', () => {
74
- const props = {
75
- src: 'test',
76
- muted: false,
77
- volume: 50,
78
- onDuration: vitest.fn(),
79
- };
80
- render(_jsxs(CanUseRemotionHooksProvider, { children: [_jsx(AudioForRendering, { ...props }), ' '] }));
81
- expect(mockUseEffect).toHaveBeenCalled();
82
- });
83
- });
@@ -1,51 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- /**
3
- * @vitest-environment jsdom
4
- */
5
- import { render } from '@testing-library/react';
6
- import React, { useContext } from 'react';
7
- import { describe, expect, test } from 'vitest';
8
- import { Audio } from '../audio/index.js';
9
- import { CanUseRemotionHooksProvider } from '../CanUseRemotionHooks.js';
10
- import { Internals } from '../internals.js';
11
- const Wrapper = ({ children }) => {
12
- const compositions = useContext(Internals.CompositionManager);
13
- return (_jsx(CanUseRemotionHooksProvider, { children: _jsx(Internals.RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Internals.CompositionManager.Provider
14
- // eslint-disable-next-line react/jsx-no-constructed-context-values
15
- , {
16
- // eslint-disable-next-line react/jsx-no-constructed-context-values
17
- value: {
18
- ...compositions,
19
- compositions: [
20
- {
21
- height: 1080,
22
- width: 1080,
23
- fps: 30,
24
- durationInFrames: 30,
25
- id: 'markup',
26
- nonce: 0,
27
- component: React.lazy(() => Promise.resolve({
28
- default: (() => null),
29
- })),
30
- defaultProps: undefined,
31
- folderName: null,
32
- parentFolderName: null,
33
- },
34
- ],
35
- currentComposition: 'markup',
36
- }, children: children }) }) }));
37
- };
38
- describe('Render correctly with props', () => {
39
- test('It should render Audio without startFrom / endAt props', () => {
40
- expect(() => render(_jsx(Wrapper, { children: _jsx(Audio, { src: "test", volume: 1 }) }))).not.toThrow();
41
- });
42
- test('It should render Audio with startAt props', () => {
43
- expect(() => render(_jsx(Wrapper, { children: _jsx(Audio, { src: "test", volume: 1, startFrom: 10 }) }))).not.toThrow();
44
- });
45
- test('It should render Audio with endAt props', () => {
46
- expect(() => render(_jsx(Wrapper, { children: _jsx(Audio, { src: "test", volume: 1, endAt: 10 }) }))).not.toThrow();
47
- });
48
- test('It should render Audio with startFrom and endAt props', () => {
49
- expect(() => render(_jsx(Wrapper, { children: _jsx(Audio, { src: "test", volume: 1, startFrom: 10, endAt: 20 }) }))).not.toThrow();
50
- });
51
- });
@@ -1,50 +0,0 @@
1
- import { expect, test } from 'vitest';
2
- import { bezier } from '../bezier.js';
3
- const identity = (x) => {
4
- return x;
5
- };
6
- const assertClose = (a, b, precision = 3) => {
7
- expect(a).toBeCloseTo(b, precision);
8
- };
9
- const allEquals = (be1, be2, samples) => {
10
- for (let i = 0; i <= samples; ++i) {
11
- const x = i / samples;
12
- assertClose(be1(x), be2(x));
13
- }
14
- };
15
- function repeat(n) {
16
- return function (f) {
17
- for (let i = 0; i < n; ++i) {
18
- f();
19
- }
20
- };
21
- }
22
- test('bezier - should create an object', () => {
23
- expect(typeof bezier(0, 0, 1, 1) === 'function').toBe(true);
24
- });
25
- test('bezier - fail with wrong params', () => {
26
- const valuesToTest = [
27
- [0.5, 0.5, -5, 0.5],
28
- [0.5, 0.5, 5, 0.5],
29
- [-2, 0.5, 0.5, 0.5],
30
- [2, 0.5, 0.5, 0.5],
31
- ];
32
- valuesToTest.forEach((entry) => {
33
- expect(() => bezier(entry[0], entry[1], entry[2], entry[3])).toThrow();
34
- });
35
- });
36
- test('bezier - linear curves', () => {
37
- allEquals(bezier(0, 0, 1, 1), bezier(1, 1, 0, 0), 100);
38
- allEquals(bezier(0, 0, 1, 1), identity, 100);
39
- });
40
- test('bezier - right value at extremes', () => {
41
- repeat(10)(() => {
42
- const a = Math.random();
43
- const b = 2 * Math.random() - 0.5;
44
- const c = Math.random();
45
- const d = 2 * Math.random() - 0.5;
46
- const easing = bezier(a, b, c, d);
47
- expect(easing(0)).toBe(0);
48
- expect(easing(1)).toBe(1);
49
- });
50
- });
@@ -1,28 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * @vitest-environment jsdom
4
- */
5
- import { render } from '@testing-library/react';
6
- import { describe, expect, test } from 'vitest';
7
- import { Composition } from '../Composition.js';
8
- import { RemotionRoot } from '../RemotionRoot.js';
9
- import { expectToThrow } from './expect-to-throw.js';
10
- const AnyComp = () => null;
11
- describe('Render composition-rules should throw with invalid props', () => {
12
- test('It should report invalid component id', () => {
13
- expectToThrow(() => render(_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, id: "invalid@id", width: 100 })), /can only contain/);
14
- });
15
- test('It should throw if no id is passed', () => {
16
- expectToThrow(() => render(
17
- // @ts-expect-error
18
- _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, width: 100 })), /No id for composition passed./);
19
- });
20
- test('It should throw if multiple components have the same id', () => {
21
- expectToThrow(() => render(_jsxs(RemotionRoot, { numberOfAudioTags: 0, children: [_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, width: 100, id: "id" }), _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, width: 100, id: "id" })] })), /Multiple composition with id id/);
22
- });
23
- });
24
- describe('Render composition-rules should not with valid props', () => {
25
- test('It should validate the component id', () => {
26
- expect(() => render(_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, id: "valid-id", width: 100 }))).not.toThrow();
27
- });
28
- });
@@ -1,97 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- /**
3
- * @vitest-environment jsdom
4
- */
5
- import { render } from '@testing-library/react';
6
- import { describe, expect, test } from 'vitest';
7
- import { Composition } from '../Composition.js';
8
- import { RemotionRoot } from '../RemotionRoot.js';
9
- import { expectToThrow } from './expect-to-throw.js';
10
- const AnyComp = () => null;
11
- describe('Composition-validation render should throw with invalid props', () => {
12
- test('It should throw if multiple components have the same id', () => {
13
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, id: "id" }) })), /The "width/);
14
- });
15
- describe('Throw with invalid height props', () => {
16
- test('It should throw if height is a negative number', () => {
17
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: -100, width: 100, id: "id" }) })), /The "height" prop of the <Composition\/> component must be positive, but got -100./);
18
- });
19
- test('It should throw if height=0 is boundary off-point', () => {
20
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 0, width: 100, id: "id" }) })), /The "height" prop of the <Composition\/> component must be positive, but got 0./);
21
- });
22
- test('It should throw if height is not a number', () => {
23
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30,
24
- // @ts-expect-error
25
- height: '100', width: 100, id: "id" }) })), /The "height" prop of the <Composition\/> component must be a number, but you passed a value of type string/);
26
- });
27
- test('It should throw if height is not an integer', () => {
28
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100.01, width: 100, id: "id" }) })), /The "height" prop of the <Composition\/> component must be an integer, but is 100.01/);
29
- });
30
- });
31
- describe('Throw with invalid width props', () => {
32
- test('It should throw if width is a negative number', () => {
33
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, width: -100, id: "id" }) })), /The "width" prop of the <Composition\/> component must be positive, but got -100./);
34
- });
35
- test('It should throw if width=0 is boundary off-point', () => {
36
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, width: 0, id: "id" }) })), /The "width" prop of the <Composition\/> component must be positive, but got 0./);
37
- });
38
- test('It should throw if width is not a number', () => {
39
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100,
40
- // @ts-expect-error
41
- width: '100', id: "id" }) })), /The "width" prop of the <Composition\/> component must be a number, but you passed a value of type string/);
42
- });
43
- });
44
- describe('Throw with invalid durationInFrames', () => {
45
- test('It should throw if durationInFrames of a composition is a negative number', () => {
46
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: -100, fps: 30, height: 100, width: 100, id: "id" }) })), /The "durationInFrames" prop of the <Composition\/> component must be positive, but got -100./);
47
- });
48
- test('It should throw if durationInFrames=0 of a composition is boundary off-point', () => {
49
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 0, fps: 30, height: 100, width: 100, id: "id" }) })), /The "durationInFrames" prop of the <Composition\/> component must be positive, but got 0./);
50
- });
51
- test('It should throw if durationInFrames of a composition is not an integer', () => {
52
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 0.11, fps: 30, height: 100, width: 100, id: "id" }) })), /The "durationInFrames" prop of the <Composition\/> component must be an integer, but got 0.11./);
53
- });
54
- test('It should throw if durationInFrames of a composition is not a number', () => {
55
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }),
56
- // @ts-expect-error
57
- durationInFrames: '100', fps: 30, height: 100, width: 100, id: "id" }) })), /The "durationInFrames" prop of the <Composition\/> component must be a number, but you passed a value of type string/);
58
- });
59
- });
60
- describe('Throw with invalid fps', () => {
61
- test('It should throw if fps is of a composition is negative', () => {
62
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: -30, height: 100, width: 100, id: "id" }) })), /"fps" must be positive, but got -30./);
63
- });
64
- test('It should throw if fps=0 of a composition is boundary off-point', () => {
65
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 0, height: 100, width: 100, id: "id" }) })), /"fps" must be positive, but got 0./);
66
- });
67
- test('It should throw if fps of a composition is not a number', () => {
68
- expectToThrow(() => render(_jsx(RemotionRoot, { numberOfAudioTags: 0, children: _jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100,
69
- // @ts-expect-error
70
- fps: '30', height: 100, width: 100, id: "id" }) })), /"fps" must be a number, but you passed a value of type string/);
71
- });
72
- });
73
- });
74
- describe('Composition-validation render should NOT throw with valid props', () => {
75
- describe('Not throw with valid height props', () => {
76
- test('It should not throw if height is a positive number', () => {
77
- expect(() => render(_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, width: 100, id: "id" }))).not.toThrow();
78
- });
79
- test('It should not throw if height=1 is boundary on-point', () => {
80
- expect(() => render(_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 1, width: 100, id: "id" }))).not.toThrow();
81
- });
82
- });
83
- describe('Not throw with valid width props', () => {
84
- test('It should not throw if width is a positive number', () => {
85
- expect(() => render(_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, width: 100, id: "id" }))).not.toThrow();
86
- });
87
- test('It should not throw if width=1 is boundary on-point', () => {
88
- expect(() => render(_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 30, height: 100, width: 1, id: "id" }))).not.toThrow();
89
- });
90
- });
91
- test('It should not throw if durationInFrames=1 of a composition is boundary on-point', () => {
92
- expect(() => render(_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 1, fps: 30, height: 100, width: 100, id: "id" }))).not.toThrow();
93
- });
94
- test('It should not throw if fps=1 of a composition is boundary on-point', () => {
95
- expect(() => render(_jsx(Composition, { lazyComponent: () => Promise.resolve({ default: AnyComp }), durationInFrames: 100, fps: 1, height: 100, width: 100, id: "id" }))).not.toThrow();
96
- });
97
- });