Browse Source

Support node-canvas v2 (#81)

Co-authored-by: Luke Childs <lukechilds123@gmail.com>
pull/91/head
Tom Jenkinson 5 years ago
committed by Luke Childs
parent
commit
7eba0aa353
  1. 5
      README.md
  2. 2
      package.json
  3. 10
      src/index.js
  4. 4
      test/errors.js
  5. 4
      test/types.js
  6. 21
      test/unit.js

5
README.md

@ -102,10 +102,11 @@ Usage in Node.js is the same, however you'll need to also require [node-canvas](
```js ```js
const mergeImages = require('merge-images'); const mergeImages = require('merge-images');
const Canvas = require('canvas'); const { Canvas, Image } = require('canvas');
mergeImages(['./body.png', './eyes.png', './mouth.png'], { mergeImages(['./body.png', './eyes.png', './mouth.png'], {
Canvas: Canvas Canvas: Canvas,
Image: Image
}) })
.then(b64 => ...); .then(b64 => ...);
// data:image/png;base64,iVBORw0KGgoAA... // data:image/png;base64,iVBORw0KGgoAA...

2
package.json

@ -43,7 +43,7 @@
"devDependencies": { "devDependencies": {
"ava": "^0.25.0", "ava": "^0.25.0",
"camelcase": "^5.0.0", "camelcase": "^5.0.0",
"canvas": "^1.6.2", "canvas": "^2.6.1",
"coveralls": "^3.0.0", "coveralls": "^3.0.0",
"datauri": "^1.0.5", "datauri": "^1.0.5",
"eslint-config-xo-lukechilds": "^1.0.0", "eslint-config-xo-lukechilds": "^1.0.0",

10
src/index.js

@ -14,10 +14,7 @@ const mergeImages = (sources = [], options = {}) => new Promise(resolve => {
// Setup browser/Node.js specific variables // Setup browser/Node.js specific variables
const canvas = options.Canvas ? new options.Canvas() : window.document.createElement('canvas'); const canvas = options.Canvas ? new options.Canvas() : window.document.createElement('canvas');
const Image = options.Canvas ? options.Canvas.Image : window.Image; const Image = options.Image || window.Image;
if (options.Canvas) {
options.quality *= 100;
}
// Load sources // Load sources
const images = sources.map(source => new Promise((resolve, reject) => { const images = sources.map(source => new Promise((resolve, reject) => {
@ -53,13 +50,14 @@ const mergeImages = (sources = [], options = {}) => new Promise(resolve => {
if (options.Canvas && options.format === 'image/jpeg') { if (options.Canvas && options.format === 'image/jpeg') {
// Resolve data URI for node-canvas jpeg async // Resolve data URI for node-canvas jpeg async
return new Promise(resolve => { return new Promise((resolve, reject) => {
canvas.toDataURL(options.format, { canvas.toDataURL(options.format, {
quality: options.quality, quality: options.quality,
progressive: false progressive: false
}, (err, jpeg) => { }, (err, jpeg) => {
if (err) { if (err) {
throw err; reject(err);
return;
} }
resolve(jpeg); resolve(jpeg);
}); });

4
test/errors.js

@ -1,5 +1,5 @@
import test from 'ava'; import test from 'ava';
import Canvas from 'canvas'; import { Canvas, Image } from 'canvas';
import mergeImages from '../'; import mergeImages from '../';
test('mergeImages rejects Promise if node-canvas instance isn\'t passed in', async t => { test('mergeImages rejects Promise if node-canvas instance isn\'t passed in', async t => {
@ -9,5 +9,5 @@ test('mergeImages rejects Promise if node-canvas instance isn\'t passed in', asy
test('mergeImages rejects Promise if image load errors', async t => { test('mergeImages rejects Promise if image load errors', async t => {
t.plan(1); t.plan(1);
await t.throws(mergeImages([1], { Canvas })); await t.throws(mergeImages(['nothing-here.jpg'], { Canvas, Image }));
}); });

4
test/types.js

@ -1,5 +1,5 @@
import test from 'ava'; import test from 'ava';
import Canvas from 'canvas'; import { Canvas, Image } from 'canvas';
import mergeImages from '../'; import mergeImages from '../';
test('mergeImages is a function', t => { test('mergeImages is a function', t => {
@ -7,5 +7,5 @@ test('mergeImages is a function', t => {
}); });
test('mergeImages returns a Promise', t => { test('mergeImages returns a Promise', t => {
t.true(mergeImages([], { Canvas }) instanceof Promise); t.true(mergeImages([], { Canvas, Image }) instanceof Promise);
}); });

21
test/unit.js

@ -1,17 +1,17 @@
import test from 'ava'; import test from 'ava';
import Canvas from 'canvas'; import { Canvas, Image } from 'canvas';
import mergeImages from '../'; import mergeImages from '../';
import fixtures from './fixtures'; import fixtures from './fixtures';
test('mergeImages returns empty b64 string if nothing is passed in', async t => { test('mergeImages returns empty b64 string if nothing is passed in', async t => {
t.plan(1); t.plan(1);
await mergeImages([], { Canvas }).then(b64 => t.true(b64 === 'data:,')); await mergeImages([], { Canvas, Image }).then(b64 => t.true(b64 === 'data:,'));
}); });
test('mergeImages returns correct data URI', async t => { test('mergeImages returns correct data URI', async t => {
t.plan(1); t.plan(1);
const image = await fixtures.getImage('face.png'); const image = await fixtures.getImage('face.png');
const b64 = await mergeImages([image], { Canvas }); const b64 = await mergeImages([image], { Canvas, Image });
const expectedB64 = await fixtures.getDataURI('face.png'); const expectedB64 = await fixtures.getDataURI('face.png');
@ -24,7 +24,8 @@ test('mergeImages returns correct data URI', async t => {
const image = await fixtures.getImage('face.png'); const image = await fixtures.getImage('face.png');
const b64 = await mergeImages([image], { const b64 = await mergeImages([image], {
format: `image/${format}`, format: `image/${format}`,
Canvas Canvas,
Image
}); });
const expectedB64 = await fixtures.getDataURI(`face.${format}`); const expectedB64 = await fixtures.getDataURI(`face.${format}`);
@ -36,7 +37,7 @@ test('mergeImages returns correct data URI', async t => {
test('mergeImages correctly merges images', async t => { test('mergeImages correctly merges images', async t => {
t.plan(1); t.plan(1);
const images = await Promise.all(['body.png', 'mouth.png', 'eyes.png'].map(image => fixtures.getImage(image))); const images = await Promise.all(['body.png', 'mouth.png', 'eyes.png'].map(image => fixtures.getImage(image)));
const b64 = await mergeImages(images, { Canvas }); const b64 = await mergeImages(images, { Canvas, Image });
const expectedB64 = await fixtures.getDataURI('face.png'); const expectedB64 = await fixtures.getDataURI('face.png');
@ -49,7 +50,8 @@ test('mergeImages uses custom dimensions', async t => {
const b64 = await mergeImages([image], { const b64 = await mergeImages([image], {
width: 128, width: 128,
height: 128, height: 128,
Canvas Canvas,
Image
}); });
const expectedB64 = await fixtures.getDataURI('face-custom-dimension.png'); const expectedB64 = await fixtures.getDataURI('face-custom-dimension.png');
@ -67,7 +69,7 @@ test('mergeImages uses custom positions', async t => {
image.src = src; image.src = src;
return image; return image;
}))); })));
const b64 = await mergeImages(images, { Canvas }); const b64 = await mergeImages(images, { Canvas, Image });
const expectedB64 = await fixtures.getDataURI('face-custom-positions.png'); const expectedB64 = await fixtures.getDataURI('face-custom-positions.png');
@ -80,7 +82,8 @@ test('mergeImages uses custom jpeg quality', async t => {
const b64 = await mergeImages([image], { const b64 = await mergeImages([image], {
format: 'image/jpeg', format: 'image/jpeg',
quality: 0.1, quality: 0.1,
Canvas Canvas,
Image
}); });
const expectedB64 = await fixtures.getDataURI('face-low-quality.jpeg'); const expectedB64 = await fixtures.getDataURI('face-low-quality.jpeg');
@ -98,7 +101,7 @@ test('mergeImages uses opacity', async t => {
image.src = src; image.src = src;
return image; return image;
}))); })));
const b64 = await mergeImages(images, { Canvas }); const b64 = await mergeImages(images, { Canvas, Image });
const expectedB64 = await fixtures.getDataURI('face-opacity.png'); const expectedB64 = await fixtures.getDataURI('face-opacity.png');

Loading…
Cancel
Save