Skip to content

Commit aad5e35

Browse files
committed
move all checks into public
1 parent d52e169 commit aad5e35

File tree

4 files changed

+34
-28
lines changed

4 files changed

+34
-28
lines changed

internal/animate/state.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import {Point} from "../types";
22
import {RenderCache, InternalKeyframe, renderFramesAt, transitionFrames, Keyframe} from "./frames";
3-
import {typeCheck, error} from "../errors";
4-
import {timingFunctions} from "./timing";
53

64
interface CallbackKeyframe extends Keyframe {
75
callback?: () => void;
@@ -42,18 +40,6 @@ export const statefulAnimationGenerator = <K extends CallbackKeyframe, T>(
4240
const transition = (...keyframes: K[]) => {
4341
// Make sure frame info is valid.
4442
for (let i = 0; i < keyframes.length; i++) {
45-
typeCheck(`keyframes[${i}]`, keyframes[i], ["object"]);
46-
const {delay, duration, timingFunction, callback} = keyframes[i];
47-
typeCheck(`keyframes[${i}].delay`, delay, ["number", "undefined"]);
48-
if (delay && delay < 0) error(`keyframes[${i}].delay is invalid "${delay}".`);
49-
typeCheck(`keyframes[${i}].duration`, duration, ["number"]);
50-
if (duration && duration < 0)
51-
error(`keyframes[${i}].duration is invalid "${duration}".`);
52-
typeCheck(`keyframes[${i}].timingFunction`, timingFunction, ["string", "undefined"]);
53-
if (timingFunctions[timingFunction || "linear"] === undefined) {
54-
error(`"keyframes[${i}].timingFunction" is not recognized "${timingFunction}".`);
55-
}
56-
typeCheck(`keyframes[${i}].callback`, callback, ["function", "undefined"]);
5743
checker(keyframes[i], i);
5844
}
5945

internal/errors.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export const error = (message: string) => {
1+
export const err = (message: string) => {
22
throw `(blobs2) ${message}`;
33
};
44

@@ -7,6 +7,6 @@ export const typeCheck = (name: string, val: any, expected: string[]) => {
77
if (actual === "number" && isNaN(val)) actual = "NaN";
88
if (actual === "object" && val === null) actual = "null";
99
if (!expected.includes(actual)) {
10-
error(`"${name}" should have type "${expected.join("|")}" but was "${actual}".`);
10+
err(`"${name}" should have type "${expected.join("|")}" but was "${actual}".`);
1111
}
1212
};

internal/gen.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {mapPoints} from "../internal/util";
33
import {BlobOptions} from "../public/blobs";
44
import {Point} from "./types";
55
import {smooth} from "./util";
6-
import {typeCheck} from "./errors";
76

87
export const genBlob = (pointCount: number, offset: () => number): Point[] => {
98
const angle = (Math.PI * 2) / pointCount;
@@ -28,12 +27,6 @@ export const genBlob = (pointCount: number, offset: () => number): Point[] => {
2827
};
2928

3029
export const genFromOptions = (blobOptions: BlobOptions): Point[] => {
31-
typeCheck("blobOptions", blobOptions, ["object"]);
32-
typeCheck("seed", blobOptions.seed, ["string", "number"]);
33-
typeCheck("extraPoints", blobOptions.extraPoints, ["number"]);
34-
typeCheck("randomness", blobOptions.randomness, ["number"]);
35-
typeCheck("size", blobOptions.size, ["number"]);
36-
3730
const rgen = rand(String(blobOptions.seed));
3831

3932
// Scale of random movement increases as randomness approaches infinity.
@@ -44,14 +37,14 @@ export const genFromOptions = (blobOptions: BlobOptions): Point[] => {
4437
// randomness = 20 -> rangeStart = 0.3333
4538
// randomness = 50 -> rangeStart = 0.1667
4639
// randomness = 100 -> rangeStart = 0.0909
47-
const rangeStart = 1 / (1 + Math.abs(blobOptions.randomness) / 10);
40+
const rangeStart = 1 / (1 + blobOptions.randomness / 10);
4841

4942
const points = genBlob(
50-
3 + Math.abs(blobOptions.extraPoints),
43+
3 + blobOptions.extraPoints,
5144
() => (rangeStart + rgen() * (1 - rangeStart)) / 2,
5245
);
5346

54-
const size = Math.abs(blobOptions.size);
47+
const size = blobOptions.size;
5548
return mapPoints(points, ({curr}) => {
5649
curr.x *= size;
5750
curr.y *= size;

public/animate.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {renderPath2D} from "../internal/render/canvas";
33
import {genFromOptions} from "../internal/gen";
44
import {mapPoints} from "../internal/util";
55
import {statefulAnimationGenerator} from "../internal/animate/state";
6-
import {typeCheck} from "../internal/errors";
6+
import {typeCheck, err} from "../internal/errors";
7+
import {timingFunctions} from "../internal/animate/timing";
78

89
export interface CanvasKeyframe {
910
delay?: number;
@@ -38,8 +39,34 @@ const canvasBlobGenerator = (keyframe: CanvasKeyframe): Point[] => {
3839
});
3940
};
4041

41-
// Only need to check properties unique to the canvas animation generator.
42+
// TODO make reusable.
4243
const canvasKeyframeChecker = (keyframe: CanvasKeyframe, index: number) => {
44+
// keyframe options
45+
typeCheck(`keyframes[${index}]`, keyframe, ["object"]);
46+
const {delay, duration, timingFunction, callback} = keyframe;
47+
typeCheck(`keyframes[${index}].delay`, delay, ["number", "undefined"]);
48+
if (delay && delay < 0) err(`keyframes[${index}].delay is invalid "${delay}".`);
49+
typeCheck(`keyframes[${index}].duration`, duration, ["number"]);
50+
if (duration && duration < 0) err(`keyframes[${index}].duration is invalid "${duration}".`);
51+
typeCheck(`keyframes[${index}].timingFunction`, timingFunction, ["string", "undefined"]);
52+
if (timingFunction && !timingFunctions[timingFunction])
53+
err(`"keyframes[${index}].timingFunction" is not recognized "${timingFunction}".`);
54+
typeCheck(`keyframes[${index}].callback`, callback, ["function", "undefined"]);
55+
56+
// blobOptions
57+
typeCheck(`keyframes[${index}].blobOptions`, keyframe.blobOptions, ["object"]);
58+
const {seed, extraPoints, randomness, size} = keyframe.blobOptions;
59+
typeCheck(`keyframes[${index}].blobOptions.seed`, seed, ["string", "number"]);
60+
typeCheck(`keyframes[${index}].blobOptions.extraPoints`, extraPoints, ["number"]);
61+
if (extraPoints < 0)
62+
err(`keyframes[${index}].blobOptions.extraPoints is invalid "${extraPoints}".`);
63+
typeCheck(`keyframes[${index}].blobOptions.randomness`, randomness, ["number"]);
64+
if (randomness < 0)
65+
err(`keyframes[${index}].blobOptions.randomness is invalid "${randomness}".`);
66+
typeCheck(`keyframes[${index}].blobOptions.size`, size, ["number"]);
67+
if (size < 0) err(`keyframes[${index}].blobOptions.size is invalid "${size}".`);
68+
69+
// canvasOptions
4370
typeCheck(`keyframes[${index}].canvasOptions`, keyframe.canvasOptions, ["object", "undefined"]);
4471
if (keyframe.canvasOptions) {
4572
const {offsetX, offsetY} = keyframe.canvasOptions;

0 commit comments

Comments
 (0)