Skip to content

Commit

Permalink
Merge branch 'master' into DOMMatrix
Browse files Browse the repository at this point in the history
  • Loading branch information
Fil committed Jun 4, 2020
2 parents 372a62c + ec754d4 commit 975936b
Show file tree
Hide file tree
Showing 33 changed files with 758 additions and 483 deletions.
2 changes: 1 addition & 1 deletion .gitignore
@@ -1,5 +1,5 @@
*.sublime-workspace
.DS_Store
build/
dist/
node_modules
npm-debug.log
3 changes: 0 additions & 3 deletions .npmignore

This file was deleted.

99 changes: 53 additions & 46 deletions README.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion d3-interpolate.sublime-project
Expand Up @@ -3,7 +3,7 @@
{
"path": ".",
"file_exclude_patterns": ["*.sublime-workspace"],
"folder_exclude_patterns": ["build"]
"folder_exclude_patterns": ["dist"]
}
],
"build_systems": [
Expand Down
20 changes: 0 additions & 20 deletions index.js

This file was deleted.

28 changes: 17 additions & 11 deletions package.json
@@ -1,6 +1,6 @@
{
"name": "d3-interpolate",
"version": "1.3.0",
"version": "1.4.0",
"description": "Interpolate numbers, colors, strings, arrays, objects, whatever!",
"keywords": [
"d3",
Expand All @@ -15,26 +15,32 @@
"name": "Mike Bostock",
"url": "http://bost.ocks.org/mike"
},
"main": "build/d3-interpolate.js",
"module": "index",
"jsnext:main": "index",
"main": "dist/d3-interpolate.js",
"unpkg": "dist/d3-interpolate.min.js",
"jsdelivr": "dist/d3-interpolate.min.js",
"module": "src/index.js",
"repository": {
"type": "git",
"url": "https://github.com/d3/d3-interpolate.git"
},
"files": [
"dist/**/*.js",
"src/**/*.js"
],
"scripts": {
"pretest": "rm -rf build && mkdir build && rollup -c",
"test": "tape 'test/**/*-test.js' && eslint index.js src test",
"prepublish": "yarn test",
"postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3-interpolate/build/d3-interpolate.js d3-interpolate.v1.js && cp ../d3-interpolate/build/d3-interpolate.min.js d3-interpolate.v1.min.js && git add d3-interpolate.v1.js d3-interpolate.v1.min.js && git commit -m \"d3-interpolate ${npm_package_version}\" && git push && cd - && zip -j build/d3-interpolate.zip -- LICENSE README.md build/d3-interpolate.js build/d3-interpolate.min.js"
"pretest": "rollup -c",
"test": "tape 'test/**/*-test.js' && eslint src",
"prepublishOnly": "rm -rf dist && yarn test",
"postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js"
},
"dependencies": {
"d3-color": "1"
},
"sideEffects": false,
"devDependencies": {
"eslint": "5",
"rollup": "0.64",
"rollup-plugin-terser": "1",
"eslint": "6",
"rollup": "1",
"rollup-plugin-terser": "5",
"tape": "4"
}
}
13 changes: 7 additions & 6 deletions rollup.config.js
Expand Up @@ -2,15 +2,16 @@ import {terser} from "rollup-plugin-terser";
import * as meta from "./package.json";

const config = {
input: "index.js",
external: Object.keys(meta.dependencies),
input: "src/index.js",
external: Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)),
output: {
file: `build/${meta.name}.js`,
file: `dist/${meta.name}.js`,
name: "d3",
format: "umd",
indent: false,
extend: true,
banner: `// ${meta.homepage} Version ${meta.version} Copyright ${(new Date).getFullYear()} ${meta.author.name}.`,
globals: Object.assign({}, ...Object.keys(meta.dependencies).map(key => ({[key]: "d3"})))
banner: `// ${meta.homepage} v${meta.version} Copyright ${(new Date).getFullYear()} ${meta.author.name}`,
globals: Object.assign({}, ...Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)).map(key => ({[key]: "d3"})))
},
plugins: []
};
Expand All @@ -21,7 +22,7 @@ export default [
...config,
output: {
...config.output,
file: `build/${meta.name}.min.js`
file: `dist/${meta.name}.min.js`
},
plugins: [
...config.plugins,
Expand Down
7 changes: 6 additions & 1 deletion src/array.js
@@ -1,6 +1,11 @@
import value from "./value";
import value from "./value.js";
import numberArray, {isNumberArray} from "./numberArray.js";

export default function(a, b) {
return (isNumberArray(b) ? numberArray : genericArray)(a, b);
}

export function genericArray(a, b) {
var nb = b ? b.length : 0,
na = a ? Math.min(nb, a.length) : 0,
x = new Array(na),
Expand Down
2 changes: 1 addition & 1 deletion src/basisClosed.js
@@ -1,4 +1,4 @@
import {basis} from "./basis";
import {basis} from "./basis.js";

export default function(values) {
var n = values.length;
Expand Down
2 changes: 1 addition & 1 deletion src/color.js
@@ -1,4 +1,4 @@
import constant from "./constant";
import constant from "./constant.js";

function linear(a, d) {
return function(t) {
Expand Down
2 changes: 1 addition & 1 deletion src/cubehelix.js
@@ -1,5 +1,5 @@
import {cubehelix as colorCubehelix} from "d3-color";
import color, {hue} from "./color";
import color, {hue} from "./color.js";

function cubehelix(hue) {
return (function cubehelixGamma(y) {
Expand Down
4 changes: 2 additions & 2 deletions src/date.js
@@ -1,6 +1,6 @@
export default function(a, b) {
var d = new Date;
return a = +a, b -= a, function(t) {
return d.setTime(a + b * t), d;
return a = +a, b = +b, function(t) {
return d.setTime(a * (1 - t) + b * t), d;
};
}
2 changes: 1 addition & 1 deletion src/hcl.js
@@ -1,5 +1,5 @@
import {hcl as colorHcl} from "d3-color";
import color, {hue} from "./color";
import color, {hue} from "./color.js";

function hcl(hue) {
return function(start, end) {
Expand Down
2 changes: 1 addition & 1 deletion src/hsl.js
@@ -1,5 +1,5 @@
import {hsl as colorHsl} from "d3-color";
import color, {hue} from "./color";
import color, {hue} from "./color.js";

function hsl(hue) {
return function(start, end) {
Expand Down
2 changes: 1 addition & 1 deletion src/hue.js
@@ -1,4 +1,4 @@
import {hue} from "./color";
import {hue} from "./color.js";

export default function(a, b) {
var i = hue(+a, +b);
Expand Down
21 changes: 21 additions & 0 deletions src/index.js
@@ -0,0 +1,21 @@
export {default as interpolate} from "./value.js";
export {default as interpolateArray} from "./array.js";
export {default as interpolateBasis} from "./basis.js";
export {default as interpolateBasisClosed} from "./basisClosed.js";
export {default as interpolateDate} from "./date.js";
export {default as interpolateDiscrete} from "./discrete.js";
export {default as interpolateHue} from "./hue.js";
export {default as interpolateNumber} from "./number.js";
export {default as interpolateNumberArray} from "./numberArray.js";
export {default as interpolateObject} from "./object.js";
export {default as interpolateRound} from "./round.js";
export {default as interpolateString} from "./string.js";
export {interpolateTransformCss, interpolateTransformSvg} from "./transform/index.js";
export {default as interpolateZoom} from "./zoom.js";
export {default as interpolateRgb, rgbBasis as interpolateRgbBasis, rgbBasisClosed as interpolateRgbBasisClosed} from "./rgb.js";
export {default as interpolateHsl, hslLong as interpolateHslLong} from "./hsl.js";
export {default as interpolateLab} from "./lab.js";
export {default as interpolateHcl, hclLong as interpolateHclLong} from "./hcl.js";
export {default as interpolateCubehelix, cubehelixLong as interpolateCubehelixLong} from "./cubehelix.js";
export {default as piecewise} from "./piecewise.js";
export {default as quantize} from "./quantize.js";
2 changes: 1 addition & 1 deletion src/lab.js
@@ -1,5 +1,5 @@
import {lab as colorLab} from "d3-color";
import color from "./color";
import color from "./color.js";

export default function lab(start, end) {
var l = color((start = colorLab(start)).l, (end = colorLab(end)).l),
Expand Down
4 changes: 2 additions & 2 deletions src/number.js
@@ -1,5 +1,5 @@
export default function(a, b) {
return a = +a, b -= a, function(t) {
return a + b * t;
return a = +a, b = +b, function(t) {
return a * (1 - t) + b * t;
};
}
14 changes: 14 additions & 0 deletions src/numberArray.js
@@ -0,0 +1,14 @@
export default function(a, b) {
if (!b) b = [];
var n = a ? Math.min(b.length, a.length) : 0,
c = b.slice(),
i;
return function(t) {
for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;
return c;
};
}

export function isNumberArray(x) {
return ArrayBuffer.isView(x) && !(x instanceof DataView);
}
2 changes: 1 addition & 1 deletion src/object.js
@@ -1,4 +1,4 @@
import value from "./value";
import value from "./value.js";

export default function(a, b) {
var i = {},
Expand Down
6 changes: 3 additions & 3 deletions src/rgb.js
@@ -1,7 +1,7 @@
import {rgb as colorRgb} from "d3-color";
import basis from "./basis";
import basisClosed from "./basisClosed";
import nogamma, {gamma} from "./color";
import basis from "./basis.js";
import basisClosed from "./basisClosed.js";
import nogamma, {gamma} from "./color.js";

export default (function rgbGamma(y) {
var color = gamma(y);
Expand Down
4 changes: 2 additions & 2 deletions src/round.js
@@ -1,5 +1,5 @@
export default function(a, b) {
return a = +a, b -= a, function(t) {
return Math.round(a + b * t);
return a = +a, b = +b, function(t) {
return Math.round(a * (1 - t) + b * t);
};
}
2 changes: 1 addition & 1 deletion src/string.js
@@ -1,4 +1,4 @@
import number from "./number";
import number from "./number.js";

var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
reB = new RegExp(reA.source, "g");
Expand Down
4 changes: 2 additions & 2 deletions src/transform/index.js
@@ -1,5 +1,5 @@
import number from "../number";
import {parseCss, parseSvg} from "./parse";
import number from "../number.js";
import {parseCss, parseSvg} from "./parse.js";

function interpolateTransform(parse, pxComma, pxParen, degParen) {

Expand Down
2 changes: 1 addition & 1 deletion src/transform/parse.js
@@ -1,4 +1,4 @@
import decompose, {identity} from "./decompose";
import decompose, {identity} from "./decompose.js";

var svgNode;

Expand Down
18 changes: 10 additions & 8 deletions src/value.js
@@ -1,11 +1,12 @@
import {color} from "d3-color";
import rgb from "./rgb";
import array from "./array";
import date from "./date";
import number from "./number";
import object from "./object";
import string from "./string";
import constant from "./constant";
import rgb from "./rgb.js";
import {genericArray} from "./array.js";
import date from "./date.js";
import number from "./number.js";
import object from "./object.js";
import string from "./string.js";
import constant from "./constant.js";
import numberArray, {isNumberArray} from "./numberArray.js";

export default function(a, b) {
var t = typeof b, c;
Expand All @@ -14,7 +15,8 @@ export default function(a, b) {
: t === "string" ? ((c = color(b)) ? (b = c, rgb) : string)
: b instanceof color ? rgb
: b instanceof Date ? date
: Array.isArray(b) ? array
: isNumberArray(b) ? numberArray
: Array.isArray(b) ? genericArray
: typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
: number)(a, b);
}
7 changes: 7 additions & 0 deletions test/array-test.js
Expand Up @@ -38,3 +38,10 @@ tape("interpolateArray(a, b) interpolates array-like objects", function(test) {
test.deepEqual(interpolate.interpolateArray(args, [4, 24])(0.5), [3, 18]);
test.end();
});

tape("interpolateArray(a, b) gives exact ends for t=0 and t=1", function(test) {
var a = [2e+42], b = [335];
test.deepEqual(interpolate.interpolateArray(a, b)(1), b);
test.deepEqual(interpolate.interpolateArray(a, b)(0), a);
test.end();
});
7 changes: 7 additions & 0 deletions test/date-test.js
Expand Up @@ -16,3 +16,10 @@ tape("interpolateDate(a, b) reuses the output datea", function(test) {
test.strictEqual(i(0.2), i(0.4));
test.end();
});

tape("interpolateDate(a, b) gives exact ends for t=0 and t=1", function(test) {
var a = new Date(1e8 * 24 * 60 * 60 * 1000), b = new Date(-1e8 * 24 * 60 * 60 * 1000 +1);
test.equal(+interpolate.interpolateDate(a, b)(1), +b);
test.equal(+interpolate.interpolateDate(a, b)(0), +a);
test.end();
});
8 changes: 8 additions & 0 deletions test/number-test.js
Expand Up @@ -18,3 +18,11 @@ tape("interpolateNumber(a, b) interpolates between two numbers a and b", functio
test.inDelta(i(1.0), 42.0);
test.end();
});


tape("interpolateNumber(a, b) gives exact ends for t=0 and t=1", function(test) {
var a = 2e+42, b = 335;
test.equal(interpolate.interpolateNumber(a, b)(1), b);
test.equal(interpolate.interpolateNumber(a, b)(0), a);
test.end();
});
44 changes: 44 additions & 0 deletions test/numberArray-test.js
@@ -0,0 +1,44 @@
var tape = require("tape"),
interpolate = require("../");

tape("interpolateNumberArray(a, b) interpolates defined elements in a and b", function(test) {
test.deepEqual(interpolate.interpolateNumberArray(Float64Array.of(2, 12), Float64Array.of(4, 24))(0.5), Float64Array.of(3, 18));
test.end();
});

tape("interpolateNumberArray(a, b) ignores elements in a that are not in b", function(test) {
test.deepEqual(interpolate.interpolateNumberArray(Float64Array.of(2, 12, 12), Float64Array.of(4, 24))(0.5), Float64Array.of(3, 18));
test.end();
});

tape("interpolateNumberArray(a, b) uses constant elements in b that are not in a", function(test) {
test.deepEqual(interpolate.interpolateNumberArray(Float64Array.of(2, 12), Float64Array.of(4, 24, 12))(0.5), Float64Array.of(3, 18, 12));
test.end();
});

tape("interpolateNumberArray(a, b) treats undefined as an empty array", function(test) {
test.deepEqual(interpolate.interpolateNumberArray(undefined, [2, 12])(0.5), [2, 12]);
test.deepEqual(interpolate.interpolateNumberArray([2, 12], undefined)(0.5), []);
test.deepEqual(interpolate.interpolateNumberArray(undefined, undefined)(0.5), []);
test.end();
});

tape("interpolateNumberArray(a, b) uses b’s array type", function(test) {
test.ok(interpolate.interpolateNumberArray(Float64Array.of(2, 12), Float64Array.of(4, 24, 12))(0.5) instanceof Float64Array);
test.ok(interpolate.interpolateNumberArray(Float64Array.of(2, 12), Float32Array.of(4, 24, 12))(0.5) instanceof Float32Array);
test.ok(interpolate.interpolateNumberArray(Float64Array.of(2, 12), Uint8Array.of(4, 24, 12))(0.5) instanceof Uint8Array);
test.ok(interpolate.interpolateNumberArray(Float64Array.of(2, 12), Uint16Array.of(4, 24, 12))(0.5) instanceof Uint16Array);
test.end();
});

tape("interpolateNumberArray(a, b) works with unsigned data", function(test) {
test.deepEqual(interpolate.interpolateNumberArray(Uint8Array.of(1, 12), Uint8Array.of(255, 0))(0.5), Uint8Array.of(128, 6));
test.end();
});

tape("interpolateNumberArray(a, b) gives exact ends", function(test) {
var i = interpolate.interpolateNumberArray(Float64Array.of(2e42), Float64Array.of(355));
test.deepEqual(i(0), Float64Array.of(2e42));
test.deepEqual(i(1), Float64Array.of(355));
test.end();
});

0 comments on commit 975936b

Please sign in to comment.