Skip to content

Commit a0e46ff

Browse files
committed
ensure spring works server-side = fixes #2773
1 parent 5121a3c commit a0e46ff

File tree

10 files changed

+38
-14
lines changed

10 files changed

+38
-14
lines changed

src/internal/animations.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { identity as linear, noop } from './utils.js';
1+
import { identity as linear, noop, now } from './utils.js';
22
import { loop } from './loop.js';
33
import { create_rule, delete_rule } from './style_manager.js';
44

@@ -12,7 +12,7 @@ export function create_animation(node, from, fn, params) {
1212
delay = 0,
1313
duration = 300,
1414
easing = linear,
15-
start: start_time = window.performance.now() + delay,
15+
start: start_time = now() + delay,
1616
end = start_time + duration,
1717
tick = noop,
1818
css

src/internal/loop.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { now } from './utils.js';
2+
13
const tasks = new Set();
24
let running = false;
35

46
function run_tasks() {
57
tasks.forEach(task => {
6-
if (!task[0](window.performance.now())) {
8+
if (!task[0](now())) {
79
tasks.delete(task);
810
task[1]();
911
}

src/internal/transitions.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { identity as linear, noop, run_all } from './utils.js';
1+
import { identity as linear, noop, now, run_all } from './utils.js';
22
import { loop } from './loop.js';
33
import { create_rule, delete_rule } from './style_manager.js';
44
import { custom_event } from './dom.js';
@@ -63,7 +63,7 @@ export function create_in_transition(node, fn, params) {
6363
if (css) animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);
6464
tick(0, 1);
6565

66-
const start_time = window.performance.now() + delay;
66+
const start_time = now() + delay;
6767
const end_time = start_time + duration;
6868

6969
if (task) task.abort();
@@ -136,7 +136,7 @@ export function create_out_transition(node, fn, params) {
136136

137137
if (css) animation_name = create_rule(node, 1, 0, duration, delay, easing, css);
138138

139-
const start_time = window.performance.now() + delay;
139+
const start_time = now() + delay;
140140
const end_time = start_time + duration;
141141

142142
loop(now => {
@@ -224,7 +224,7 @@ export function create_bidirectional_transition(node, fn, params, intro) {
224224
} = config;
225225

226226
const program = {
227-
start: window.performance.now() + delay,
227+
start: now() + delay,
228228
b
229229
};
230230

src/internal/utils.js

+9
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,12 @@ export function exclude_internal_props(props) {
7979
for (const k in props) if (k[0] !== '$') result[k] = props[k];
8080
return result;
8181
}
82+
83+
export let now = typeof window !== 'undefined'
84+
? () => window.performance.now()
85+
: () => Date.now();
86+
87+
// used internally for testing
88+
export function set_now(fn) {
89+
now = fn;
90+
}

src/motion/spring.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { writable } from 'svelte/store'; // eslint-disable-line import/no-unresolved
2-
import { loop } from 'svelte/internal'; // eslint-disable-line import/no-unresolved
2+
import { loop, now } from 'svelte/internal'; // eslint-disable-line import/no-unresolved
33
import { is_date } from './utils.js';
44

55
function tick_spring(ctx, last_value, current_value, target_value) {
@@ -51,7 +51,7 @@ export function spring(value, opts = {}) {
5151

5252
if (opts.hard || (spring.stiffness >= 1 && spring.damping >= 1)) {
5353
cancel_task = true; // cancel any running animation
54-
last_time = window.performance.now();
54+
last_time = now();
5555
last_value = value;
5656
store.set(value = target_value);
5757
return new Promise(f => f()); // fulfil immediately
@@ -62,7 +62,7 @@ export function spring(value, opts = {}) {
6262
}
6363

6464
if (!task) {
65-
last_time = window.performance.now();
65+
last_time = now();
6666
cancel_task = false;
6767

6868
task = loop(now => {

src/motion/tweened.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { writable } from 'svelte/store'; // eslint-disable-line import/no-unresolved
2-
import { assign, loop } from 'svelte/internal'; // eslint-disable-line import/no-unresolved
2+
import { assign, loop, now } from 'svelte/internal'; // eslint-disable-line import/no-unresolved
33
import { linear } from 'svelte/easing'; // eslint-disable-line import/no-unresolved
44
import { is_date } from './utils.js';
55

@@ -73,7 +73,7 @@ export function tweened(value, defaults = {}) {
7373
interpolate = get_interpolator
7474
} = assign(assign({}, defaults), opts);
7575

76-
const start = window.performance.now() + delay;
76+
const start = now() + delay;
7777
let fn;
7878

7979
task = loop(now => {

test/runtime/index.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as path from "path";
33
import * as fs from "fs";
44
import { rollup } from 'rollup';
55
import * as virtual from 'rollup-plugin-virtual';
6-
import { clear_loops } from "../../internal.js";
6+
import { clear_loops, set_now } from "../../internal.js";
77

88
import {
99
showOutput,
@@ -100,7 +100,7 @@ describe("runtime", () => {
100100
if (raf.callback) raf.callback();
101101
}
102102
};
103-
window.performance.now = () => raf.time;
103+
set_now(() => raf.time);
104104
global.requestAnimationFrame = cb => {
105105
let called = false;
106106
raf.callback = () => {
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default {
2+
html: `<p>0</p>`
3+
}
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script>
2+
import { spring } from 'svelte/motion';
3+
4+
const x = spring(0);
5+
x.set(1);
6+
</script>
7+
8+
<p>{$x}</p>

test/server-side-rendering/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ describe("ssr", () => {
102102
delete require.cache[file];
103103
});
104104

105+
delete global.window;
106+
105107
const compileOptions = Object.assign({ sveltePath }, config.compileOptions, {
106108
generate: 'ssr'
107109
});

0 commit comments

Comments
 (0)