@flighthq/timeline 0.3.0-next.906.07cea63 → 0.3.0
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/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/timeline.d.ts +6 -2
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +23 -5
- package/dist/timeline.js.map +1 -1
- package/package.json +5 -3
- package/src/timeline.test.ts +77 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { addTimelineFrameScript, createTimeline, createTimelineSource, disposeTimelineSignals, enableTimelineSignals, findTimelineLabel, getTimelineCurrentLabel, getTimelineFrameScript, gotoAndPlayTimeline, gotoAndStopTimeline, nextFrameTimeline, playTimeline, prevFrameTimeline, removeTimelineFrameScript, stopTimeline, updateTimeline, } from './contract';
|
|
1
|
+
export { addTimelineFrameScript, clearTimelineFrameScripts, createTimeline, createTimelineSource, disposeTimelineSignals, enableTimelineSignals, findTimelineLabel, getTimelineCurrentLabel, getTimelineFrameScript, getTimelineFrameScriptFrames, getTimelineLabels, gotoAndPlayTimeline, gotoAndStopTimeline, nextFrameTimeline, playTimeline, prevFrameTimeline, removeTimelineFrameScript, stopTimeline, updateTimeline, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,EAC5B,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { addTimelineFrameScript, createTimeline, createTimelineSource, disposeTimelineSignals, enableTimelineSignals, findTimelineLabel, getTimelineCurrentLabel, getTimelineFrameScript, gotoAndPlayTimeline, gotoAndStopTimeline, nextFrameTimeline, playTimeline, prevFrameTimeline, removeTimelineFrameScript, stopTimeline, updateTimeline, } from './contract';
|
|
1
|
+
export { addTimelineFrameScript, clearTimelineFrameScripts, createTimeline, createTimelineSource, disposeTimelineSignals, enableTimelineSignals, findTimelineLabel, getTimelineCurrentLabel, getTimelineFrameScript, getTimelineFrameScriptFrames, getTimelineLabels, gotoAndPlayTimeline, gotoAndStopTimeline, nextFrameTimeline, playTimeline, prevFrameTimeline, removeTimelineFrameScript, stopTimeline, updateTimeline, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,EAC5B,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/timeline.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import type { Node2D, FrameScript, Timeline, TimelineLabel, TimelineSignals, TimelineSource } from '@flighthq/types/contract';
|
|
1
|
+
import type { Node2D, FrameScript, Timeline, TimelineCue, TimelineLabel, TimelineSignals, TimelineSource } from '@flighthq/types/contract';
|
|
2
2
|
export declare function addTimelineFrameScript(timeline: Timeline, frame: number | string, script: FrameScript): void;
|
|
3
|
+
export declare function clearTimelineFrameScripts(timeline: Timeline): void;
|
|
3
4
|
export declare function createTimeline(obj?: Partial<Timeline>): Timeline;
|
|
4
5
|
export declare function createTimelineSource(obj: {
|
|
5
6
|
totalFrames?: number;
|
|
6
7
|
frameRate?: number | null;
|
|
7
8
|
labels?: readonly TimelineLabel[];
|
|
9
|
+
cues?: readonly TimelineCue[];
|
|
8
10
|
constructFrame?: (target: Node2D, frame: number) => void;
|
|
9
11
|
}): TimelineSource;
|
|
10
12
|
export declare function disposeTimelineSignals(timeline: Timeline): void;
|
|
@@ -12,6 +14,8 @@ export declare function enableTimelineSignals(timeline: Timeline): TimelineSigna
|
|
|
12
14
|
export declare function findTimelineLabel(timeline: Readonly<Timeline>, name: string): TimelineLabel | null;
|
|
13
15
|
export declare function getTimelineCurrentLabel(timeline: Readonly<Timeline>): TimelineLabel | null;
|
|
14
16
|
export declare function getTimelineFrameScript(timeline: Readonly<Timeline>, frame: number | string): FrameScript | null;
|
|
17
|
+
export declare function getTimelineFrameScriptFrames(timeline: Readonly<Timeline>): readonly number[];
|
|
18
|
+
export declare function getTimelineLabels(timeline: Readonly<Timeline>): readonly TimelineLabel[];
|
|
15
19
|
export declare function gotoAndPlayTimeline(timeline: Timeline, frame: number | string): void;
|
|
16
20
|
export declare function gotoAndStopTimeline(timeline: Timeline, frame: number | string): void;
|
|
17
21
|
export declare function nextFrameTimeline(timeline: Timeline): void;
|
|
@@ -19,5 +23,5 @@ export declare function playTimeline(timeline: Timeline): void;
|
|
|
19
23
|
export declare function prevFrameTimeline(timeline: Timeline): void;
|
|
20
24
|
export declare function removeTimelineFrameScript(timeline: Timeline, frame: number | string): void;
|
|
21
25
|
export declare function stopTimeline(timeline: Timeline): void;
|
|
22
|
-
export declare function updateTimeline(timeline: Timeline, deltaTime: number):
|
|
26
|
+
export declare function updateTimeline(timeline: Timeline, deltaTime: number): boolean;
|
|
23
27
|
//# sourceMappingURL=timeline.d.ts.map
|
package/dist/timeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,QAAQ,
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,QAAQ,EACR,WAAW,EAEX,aAAa,EACb,eAAe,EACf,cAAc,EACf,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAG5G;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAElE;AAED,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAahE;AAMD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D,GAAG,cAAc,CAQjB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE/D;AAID,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAEzE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAElG;AAID,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,aAAa,GAAG,IAAI,CAU1F;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,CAI/G;AAID,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,MAAM,EAAE,CAE5F;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,aAAa,EAAE,CAExF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAG1D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAIrD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAG1D;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK1F;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAErD;AAMD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAU7E"}
|
package/dist/timeline.js
CHANGED
|
@@ -3,10 +3,14 @@ export function addTimelineFrameScript(timeline, frame, script) {
|
|
|
3
3
|
const resolved = resolveFrame(timeline, frame);
|
|
4
4
|
(timeline.frameScripts ??= new Map()).set(resolved, script);
|
|
5
5
|
}
|
|
6
|
+
export function clearTimelineFrameScripts(timeline) {
|
|
7
|
+
timeline.frameScripts = null;
|
|
8
|
+
}
|
|
6
9
|
export function createTimeline(obj) {
|
|
7
10
|
return {
|
|
8
11
|
source: obj?.source ?? null,
|
|
9
12
|
target: obj?.target ?? null,
|
|
13
|
+
cueRegistry: obj?.cueRegistry ?? null,
|
|
10
14
|
currentFrame: obj?.currentFrame ?? 1,
|
|
11
15
|
frameScripts: obj?.frameScripts ?? null,
|
|
12
16
|
isPlaying: obj?.isPlaying ?? false,
|
|
@@ -25,6 +29,7 @@ export function createTimelineSource(obj) {
|
|
|
25
29
|
totalFrames: obj.totalFrames ?? 1,
|
|
26
30
|
frameRate: obj.frameRate ?? null,
|
|
27
31
|
labels: obj.labels ?? EMPTY_LABELS,
|
|
32
|
+
cues: obj.cues ?? EMPTY_CUES,
|
|
28
33
|
constructFrame: obj.constructFrame ?? noopConstructFrame,
|
|
29
34
|
};
|
|
30
35
|
}
|
|
@@ -59,6 +64,14 @@ export function getTimelineFrameScript(timeline, frame) {
|
|
|
59
64
|
const resolved = resolveFrame(timeline, frame);
|
|
60
65
|
return timeline.frameScripts.get(resolved) ?? null;
|
|
61
66
|
}
|
|
67
|
+
// Lists authored script frames in their insertion order. Returns a shared empty-array sentinel when
|
|
68
|
+
// none are attached; the returned non-empty array is a snapshot and cannot mutate the timeline's Map.
|
|
69
|
+
export function getTimelineFrameScriptFrames(timeline) {
|
|
70
|
+
return timeline.frameScripts === null ? EMPTY_FRAMES : [...timeline.frameScripts.keys()];
|
|
71
|
+
}
|
|
72
|
+
export function getTimelineLabels(timeline) {
|
|
73
|
+
return timeline.source?.labels ?? EMPTY_LABELS;
|
|
74
|
+
}
|
|
62
75
|
export function gotoAndPlayTimeline(timeline, frame) {
|
|
63
76
|
playTimeline(timeline);
|
|
64
77
|
seekTimeline(timeline, resolveFrame(timeline, frame));
|
|
@@ -92,16 +105,23 @@ export function removeTimelineFrameScript(timeline, frame) {
|
|
|
92
105
|
export function stopTimeline(timeline) {
|
|
93
106
|
timeline.isPlaying = false;
|
|
94
107
|
}
|
|
108
|
+
// Returns whether this call realized a new frame (constructFrame/scripts/signals), not merely whether
|
|
109
|
+
// the numeric playhead was advanced. Timed sources advance before realization, so currentFrame is the
|
|
110
|
+
// realized frame on return. A frameRate-null source realizes currentFrame first and then advances its
|
|
111
|
+
// playhead for the next call, so currentFrame reads one ahead of lastFrameUpdate between updates.
|
|
95
112
|
export function updateTimeline(timeline, deltaTime) {
|
|
96
113
|
const frameRate = getTimelineFrameRate(timeline);
|
|
97
114
|
if (timeline.isPlaying && frameRate !== null) {
|
|
98
115
|
timeline.currentFrame = advanceFrame(timeline, deltaTime);
|
|
99
116
|
}
|
|
100
|
-
fireConstructFrame(timeline);
|
|
117
|
+
const changed = fireConstructFrame(timeline);
|
|
101
118
|
if (timeline.isPlaying && frameRate === null) {
|
|
102
119
|
timeline.currentFrame = advanceFrame(timeline, deltaTime);
|
|
103
120
|
}
|
|
121
|
+
return changed;
|
|
104
122
|
}
|
|
123
|
+
const EMPTY_FRAMES = [];
|
|
124
|
+
const EMPTY_CUES = [];
|
|
105
125
|
const EMPTY_LABELS = [];
|
|
106
126
|
function noopConstructFrame() { }
|
|
107
127
|
// Frame accounting matches Flash/OpenFL: when accumulated time spans multiple frames in one update,
|
|
@@ -167,7 +187,7 @@ function fireConstructFrame(timeline) {
|
|
|
167
187
|
const previous = timeline.lastFrameUpdate;
|
|
168
188
|
const current = timeline.currentFrame;
|
|
169
189
|
if (current === previous)
|
|
170
|
-
return;
|
|
190
|
+
return false;
|
|
171
191
|
const signals = timeline.signals;
|
|
172
192
|
const target = timeline.target;
|
|
173
193
|
const frameEvent = { frame: current, previousFrame: previous };
|
|
@@ -185,13 +205,11 @@ function fireConstructFrame(timeline) {
|
|
|
185
205
|
}
|
|
186
206
|
if (signals !== null)
|
|
187
207
|
emitSignal(signals.onFrameConstructed, frameEvent);
|
|
208
|
+
return true;
|
|
188
209
|
}
|
|
189
210
|
function getTimelineFrameRate(timeline) {
|
|
190
211
|
return timeline.source?.frameRate ?? null;
|
|
191
212
|
}
|
|
192
|
-
function getTimelineLabels(timeline) {
|
|
193
|
-
return timeline.source?.labels ?? EMPTY_LABELS;
|
|
194
|
-
}
|
|
195
213
|
function getTimelineTotalFrames(timeline) {
|
|
196
214
|
return timeline.source?.totalFrames ?? 1;
|
|
197
215
|
}
|
package/dist/timeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/timeline",
|
|
3
|
-
"version": "0.3.0
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"author": "Joshua Granick and other contributors",
|
|
5
|
+
"license": "MIT",
|
|
4
6
|
"repository": {
|
|
5
7
|
"type": "git",
|
|
6
8
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,8 +38,8 @@
|
|
|
36
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
39
|
},
|
|
38
40
|
"dependencies": {
|
|
39
|
-
"@flighthq/signals": "0.3.0
|
|
40
|
-
"@flighthq/types": "0.3.0
|
|
41
|
+
"@flighthq/signals": "0.3.0",
|
|
42
|
+
"@flighthq/types": "0.3.0"
|
|
41
43
|
},
|
|
42
44
|
"devDependencies": {
|
|
43
45
|
"typescript": "^5.3.0"
|
package/src/timeline.test.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Node2D, Timeline } from '@flighthq/types/contract';
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
addTimelineFrameScript,
|
|
5
|
+
clearTimelineFrameScripts,
|
|
5
6
|
createTimeline,
|
|
6
7
|
createTimelineSource,
|
|
7
8
|
disposeTimelineSignals,
|
|
@@ -9,6 +10,8 @@ import {
|
|
|
9
10
|
findTimelineLabel,
|
|
10
11
|
getTimelineCurrentLabel,
|
|
11
12
|
getTimelineFrameScript,
|
|
13
|
+
getTimelineFrameScriptFrames,
|
|
14
|
+
getTimelineLabels,
|
|
12
15
|
gotoAndPlayTimeline,
|
|
13
16
|
gotoAndStopTimeline,
|
|
14
17
|
nextFrameTimeline,
|
|
@@ -77,6 +80,25 @@ describe('addTimelineFrameScript', () => {
|
|
|
77
80
|
});
|
|
78
81
|
});
|
|
79
82
|
|
|
83
|
+
describe('clearTimelineFrameScripts', () => {
|
|
84
|
+
it('is an idempotent no-op when no scripts are attached', () => {
|
|
85
|
+
const t = make();
|
|
86
|
+
clearTimelineFrameScripts(t);
|
|
87
|
+
expect(t.frameScripts).toBeNull();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('clears every attached script and restores the null storage sentinel', () => {
|
|
91
|
+
const t = make();
|
|
92
|
+
addTimelineFrameScript(t, 1, () => {});
|
|
93
|
+
addTimelineFrameScript(t, 3, () => {});
|
|
94
|
+
clearTimelineFrameScripts(t);
|
|
95
|
+
expect(t.frameScripts).toBeNull();
|
|
96
|
+
expect(getTimelineFrameScriptFrames(t)).toEqual([]);
|
|
97
|
+
expect(getTimelineFrameScript(t, 1)).toBeNull();
|
|
98
|
+
expect(getTimelineFrameScript(t, 3)).toBeNull();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
80
102
|
describe('createTimeline', () => {
|
|
81
103
|
it('starts at frame 1, stopped, lastFrameUpdate -1', () => {
|
|
82
104
|
const t = make();
|
|
@@ -300,6 +322,37 @@ describe('getTimelineFrameScript', () => {
|
|
|
300
322
|
});
|
|
301
323
|
});
|
|
302
324
|
|
|
325
|
+
describe('getTimelineFrameScriptFrames', () => {
|
|
326
|
+
it('returns an empty-array sentinel when no scripts are attached', () => {
|
|
327
|
+
expect(getTimelineFrameScriptFrames(make())).toEqual([]);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it('returns a snapshot of authored frames in insertion order', () => {
|
|
331
|
+
const t = make();
|
|
332
|
+
addTimelineFrameScript(t, 3, () => {});
|
|
333
|
+
addTimelineFrameScript(t, 1, () => {});
|
|
334
|
+
const frames = getTimelineFrameScriptFrames(t) as number[];
|
|
335
|
+
expect(frames).toEqual([3, 1]);
|
|
336
|
+
frames.push(2);
|
|
337
|
+
expect(getTimelineFrameScriptFrames(t)).toEqual([3, 1]);
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
describe('getTimelineLabels', () => {
|
|
342
|
+
it('returns an empty-array sentinel when the timeline has no labels', () => {
|
|
343
|
+
expect(getTimelineLabels(createTimeline())).toEqual([]);
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
it('returns the source label list as a read-only view', () => {
|
|
347
|
+
const labels = [
|
|
348
|
+
{ name: 'idle', frame: 1 },
|
|
349
|
+
{ name: 'run', frame: 3 },
|
|
350
|
+
];
|
|
351
|
+
const t = make({ labels });
|
|
352
|
+
expect(getTimelineLabels(t)).toBe(labels);
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
|
|
303
356
|
describe('gotoAndPlayTimeline', () => {
|
|
304
357
|
it('seeks to frame and starts playing', () => {
|
|
305
358
|
const t = make();
|
|
@@ -438,18 +491,39 @@ describe('updateTimeline', () => {
|
|
|
438
491
|
it('fires constructFrame for frame 1 on first update even when stopped', () => {
|
|
439
492
|
const frames: number[] = [];
|
|
440
493
|
const t = make({ constructFrame: (f) => frames.push(f) });
|
|
441
|
-
updateTimeline(t, 0);
|
|
494
|
+
expect(updateTimeline(t, 0)).toBe(true);
|
|
442
495
|
expect(frames).toEqual([1]);
|
|
443
496
|
});
|
|
444
497
|
|
|
445
498
|
it('does not double-fire constructFrame on repeated stopped updates', () => {
|
|
446
499
|
const frames: number[] = [];
|
|
447
500
|
const t = make({ constructFrame: (f) => frames.push(f) });
|
|
448
|
-
updateTimeline(t, 0);
|
|
449
|
-
updateTimeline(t, 0);
|
|
501
|
+
expect(updateTimeline(t, 0)).toBe(true);
|
|
502
|
+
expect(updateTimeline(t, 0)).toBe(false);
|
|
450
503
|
expect(frames).toEqual([1]);
|
|
451
504
|
});
|
|
452
505
|
|
|
506
|
+
it('returns false when a timed update accumulates time without realizing another frame', () => {
|
|
507
|
+
const t = make({ frameRate: 10 }); // 100ms/frame
|
|
508
|
+
playTimeline(t);
|
|
509
|
+
expect(updateTimeline(t, 0)).toBe(true); // realizes the initial frame
|
|
510
|
+
expect(updateTimeline(t, 50)).toBe(false);
|
|
511
|
+
expect(updateTimeline(t, 50)).toBe(true);
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
it('reports the realized frame before frameRate-null advances its next-call playhead', () => {
|
|
515
|
+
const frames: number[] = [];
|
|
516
|
+
const t = make({ frameRate: null, constructFrame: (f) => frames.push(f) });
|
|
517
|
+
playTimeline(t);
|
|
518
|
+
expect(updateTimeline(t, 0)).toBe(true);
|
|
519
|
+
expect(t.lastFrameUpdate).toBe(1);
|
|
520
|
+
expect(t.currentFrame).toBe(2);
|
|
521
|
+
expect(updateTimeline(t, 0)).toBe(true);
|
|
522
|
+
expect(t.lastFrameUpdate).toBe(2);
|
|
523
|
+
expect(t.currentFrame).toBe(3);
|
|
524
|
+
expect(frames).toEqual([1, 2]);
|
|
525
|
+
});
|
|
526
|
+
|
|
453
527
|
it('advances one frame per update when frameRate is null', () => {
|
|
454
528
|
const frames: number[] = [];
|
|
455
529
|
const t = make({ frameRate: null, constructFrame: (f) => frames.push(f) });
|