diff --git a/.circleci/images/prepare-container.sh b/.circleci/images/prepare-container.sh index 4b702627918b1db92a004b6610e8bfcefa3a7bdf..60bae5fec938108d5e36f44570223fda42a7b435 100755 --- a/.circleci/images/prepare-container.sh +++ b/.circleci/images/prepare-container.sh @@ -3,7 +3,6 @@ set -eo pipefail apt-get -y update -apt-get install -y --no-install-recommends fonts-dejavu-core apt-get clean rm -rf /var/lib/apt/lists/* diff --git a/Dockerfile b/Dockerfile index 1f6b4e51f29dee0bc8e28296d40cef07aa7c819e..411f7589090ad137d5c6168164a72a342fc53646 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,6 @@ FROM node:8.9.4-alpine RUN apk add --no-cache gettext imagemagick librsvg ttf-dejavu git -ENV FONT_PATH /usr/share/fonts/ttf-dejavu/DejaVuSans.ttf RUN mkdir -p /usr/src/app RUN mkdir /usr/src/app/private diff --git a/__snapshots__/make-badge.spec.js b/__snapshots__/make-badge.spec.js index 964b16a9dbb58b0a79ab0bf560f7135251c575b0..1809cb5d145374fa4c32b88e7b5fbb91c4a77566 100644 --- a/__snapshots__/make-badge.spec.js +++ b/__snapshots__/make-badge.spec.js @@ -1,5 +1,5 @@ exports['The badge generator SVG should always produce the same SVG (unless we have changed something!) 1'] = ` -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="88" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="88" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h45v20H0z"/><path fill="#4c1" d="M45 0h43v20H45z"/><path fill="url(#b)" d="M0 0h88v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"> <text x="235" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="350">cactus</text><text x="235" y="140" transform="scale(.1)" textLength="350">cactus</text><text x="655" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="330">grown</text><text x="655" y="140" transform="scale(.1)" textLength="330">grown</text></g> </svg> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="90" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="90" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h45v20H0z"/><path fill="#4c1" d="M45 0h45v20H45z"/><path fill="url(#b)" d="M0 0h90v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"> <text x="235" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="350">cactus</text><text x="235" y="140" transform="scale(.1)" textLength="350">cactus</text><text x="665" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="350">grown</text><text x="665" y="140" transform="scale(.1)" textLength="350">grown</text></g> </svg> ` exports['The badge generator JSON should always produce the same JSON (unless we have changed something!) 1'] = ` diff --git a/gh-badges/README.md b/gh-badges/README.md index 0150bc090b7b6f7e7950b089e62da5266d607756..9f3dd8a2e030c18285d7dccda86e4f062d8ad1ee 100644 --- a/gh-badges/README.md +++ b/gh-badges/README.md @@ -23,7 +23,7 @@ badge build passed :green .png > mybadge.png ```js const { BadgeFactory } = require('gh-badges') -const bf = new BadgeFactory({ fontPath: '/path/to/Verdana.ttf' }) +const bf = new BadgeFactory() const format = { text: ['build', 'passed'], @@ -84,28 +84,3 @@ You can also use the `"colorA"` and `"colorB"` fields directly in the badges if you don't want to make a color scheme for it. In that case, remove the `"colorscheme"` field altogether. -## Text Width Computation - -`BadgeFactory`'s constructor takes an optional boolean -`precomputeWidths` parameter which defaults to `false`. - -Pre-computing the font width table adds some overhead to constructing the -`BadgeFactory` object (so will slow down generation of a single image), -but will speed up each badge generation if you are creating a lot of images. -As a rule of thumb: - -If you are generating just one image, use: - -```js -const bf = new BadgeFactory( - { fontPath: '/path/to/Verdana.ttf' } -) -``` - -If you are generating many images with a single instance of `BadgeFactory`: - -```js -const bf = new BadgeFactory( - { fontPath: '/path/to/Verdana.ttf', precomputeWidths: true } -) -``` diff --git a/gh-badges/lib/badge-cli.js b/gh-badges/lib/badge-cli.js index 13c20198960ea024b82c9af2f8dd252f686bf578..719bed9a17ce7c73807528007ae211af73a60e64 100755 --- a/gh-badges/lib/badge-cli.js +++ b/gh-badges/lib/badge-cli.js @@ -2,11 +2,9 @@ 'use strict' -const { PDFKitTextMeasurer } = require('./text-measurer') -const { makeBadge } = require('./make-badge') +const makeBadge = require('./make-badge') const svg2img = require('./svg-to-img') const colorscheme = require('./colorscheme.json') -const defaults = require('./defaults') if (process.argv.length < 4) { console.log('Usage: badge subject status [:colorscheme] [.output] [@style]') @@ -27,8 +25,6 @@ if (process.argv.length < 4) { process.exit() } -const fontPath = process.env.FONT_PATH || defaults.font.path - // Find a format specifier. let format = 'svg' let style = '' @@ -71,10 +67,7 @@ if (color[0] === ':') { } async function main() { - // The widths are going to be off if Helvetica-Bold is used, though this - // should print a warning. - const measurer = new PDFKitTextMeasurer(fontPath, 'Helvetica-Bold') - const svg = makeBadge(measurer, badgeData) + const svg = makeBadge(badgeData) if (/png|jpg|gif/.test(format)) { const data = await svg2img(svg, format) diff --git a/gh-badges/lib/defaults.js b/gh-badges/lib/defaults.js deleted file mode 100644 index 5f7f7a1c37ebd2b03832ca0ae7be258bce63d821..0000000000000000000000000000000000000000 --- a/gh-badges/lib/defaults.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const path = require('path') - -module.exports = { - font: { - // i.e. Verdana.ttf in the root of the project. - path: path.join(__dirname, '..', 'Verdana.ttf'), - }, -} diff --git a/gh-badges/lib/index.js b/gh-badges/lib/index.js index c0ed0bec570346deef9545d4a596e56b4350fc0c..92f03bfc35d0d1099c9a62c6316bfaf4075bdf2f 100644 --- a/gh-badges/lib/index.js +++ b/gh-badges/lib/index.js @@ -1,13 +1,14 @@ 'use strict' -const { makeBadge } = require('./make-badge') -const { PDFKitTextMeasurer, QuickTextMeasurer } = require('./text-measurer') +const makeBadge = require('./make-badge') class BadgeFactory { - constructor({ fontPath, fallbackFontPath, precomputeWidths = false }) { - this.measurer = precomputeWidths - ? new QuickTextMeasurer(fontPath, fallbackFontPath) - : new PDFKitTextMeasurer(fontPath, fallbackFontPath) + constructor(options) { + if (options !== undefined) { + console.error( + 'BadgeFactory: Constructor options are deprecated and will be ignored' + ) + } } /** @@ -24,7 +25,7 @@ class BadgeFactory { * @see https://github.com/badges/shields/tree/master/gh-badges/README.md */ create(format) { - return makeBadge(this.measurer, format) + return makeBadge(format) } } diff --git a/gh-badges/lib/make-badge-test-helpers.js b/gh-badges/lib/make-badge-test-helpers.js deleted file mode 100644 index 6b54dfda6ec9ce8a850a9f35f341f6f49ddff012..0000000000000000000000000000000000000000 --- a/gh-badges/lib/make-badge-test-helpers.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -const path = require('path') -const { PDFKitTextMeasurer } = require('./text-measurer') -const { makeMakeBadgeFn } = require('./make-badge') - -module.exports = { - font: { - path: path.join( - __dirname, - '..', - '..', - 'node_modules', - 'dejavu-fonts-ttf', - 'ttf', - 'DejaVuSans.ttf' - ), - }, - measurer() { - return new PDFKitTextMeasurer(this.font.path) - }, - makeBadge() { - return makeMakeBadgeFn(this.measurer()) - }, -} diff --git a/gh-badges/lib/make-badge.js b/gh-badges/lib/make-badge.js index fcc7662a0235f88ce958daa8c2d8909553fd0406..a86622a096f853f7073d7c6b0194cfc07d0f51be 100644 --- a/gh-badges/lib/make-badge.js +++ b/gh-badges/lib/make-badge.js @@ -4,12 +4,9 @@ const fs = require('fs') const path = require('path') const SVGO = require('svgo') const dot = require('dot') -const LruCache = require('./lru-cache') +const anafanafo = require('anafanafo') const isCSSColor = require('is-css-color') -// Holds widths of badge keys (left hand side of badge). -const badgeKeyWidthCache = new LruCache(1000) - // cache templates. const templates = {} const templateFiles = fs.readdirSync(path.join(__dirname, '..', 'templates')) @@ -109,21 +106,18 @@ function assignColor(color = '', colorschemeType = 'colorB') { const definedColorschemes = require(path.join(__dirname, 'colorscheme.json')) // Inject the measurer to avoid placing any persistent state in this module. -function makeBadge( - measurer, - { - format, - template, - text, - colorscheme, - colorA, - colorB, - logo, - logoPosition, - logoWidth, - links = ['', ''], - } -) { +function makeBadge({ + format, + template, + text, + colorscheme, + colorA, + colorB, + logo, + logoPosition, + logoWidth, + links = ['', ''], +}) { // String coercion. text = text.map(value => `${value}`) @@ -156,16 +150,12 @@ function makeBadge( colorB = assignColor(colorB, 'colorB') const [left, right] = text - let leftWidth = badgeKeyWidthCache.get(left) - if (leftWidth === undefined) { - leftWidth = measurer.widthOf(left) | 0 - // Increase chances of pixel grid alignment. - if (leftWidth % 2 === 0) { - leftWidth++ - } - badgeKeyWidthCache.set(left, leftWidth) + let leftWidth = (anafanafo(left) / 10) | 0 + // Increase chances of pixel grid alignment. + if (leftWidth % 2 === 0) { + leftWidth++ } - let rightWidth = measurer.widthOf(right) | 0 + let rightWidth = (anafanafo(right) / 10) | 0 // Increase chances of pixel grid alignment. if (rightWidth % 2 === 0) { rightWidth++ @@ -200,9 +190,4 @@ function makeBadge( return templateFn(context) } -module.exports = { - makeBadge, - makeMakeBadgeFn: measurer => data => makeBadge(measurer, data), - // Expose for testing. - _badgeKeyWidthCache: badgeKeyWidthCache, -} +module.exports = makeBadge diff --git a/gh-badges/lib/make-badge.spec.js b/gh-badges/lib/make-badge.spec.js index 135e64e6205979a1a72f5ce970fe05b1a8e6b525..63442cbb115ee772ad1c73e1991b235a36695423 100644 --- a/gh-badges/lib/make-badge.spec.js +++ b/gh-badges/lib/make-badge.spec.js @@ -4,13 +4,10 @@ const { test, given, forCases } = require('sazerac') const { expect } = require('chai') const snapshot = require('snap-shot-it') const eol = require('eol') -const { _badgeKeyWidthCache } = require('./make-badge') const isSvg = require('is-svg') -const testHelpers = require('./make-badge-test-helpers') +const makeBadge = require('./make-badge') const colorschemes = require('./colorscheme.json') -const makeBadge = testHelpers.makeBadge() - function testColor(color = '') { return JSON.parse( makeBadge({ @@ -23,10 +20,6 @@ function testColor(color = '') { } describe('The badge generator', function() { - beforeEach(function() { - _badgeKeyWidthCache.clear() - }) - describe('color test', function() { test(testColor, () => { // valid hex @@ -82,11 +75,6 @@ describe('The badge generator', function() { const svg = makeBadge({ text: ['cactus', 'grown'], format: 'svg' }) snapshot(svg) }) - - it('should cache width of badge key', function() { - makeBadge({ text: ['cached', 'not-cached'], format: 'svg' }) - expect(_badgeKeyWidthCache.cache).to.have.keys('cached') - }) }) describe('JSON', function() { diff --git a/gh-badges/lib/svg-to-img.spec.js b/gh-badges/lib/svg-to-img.spec.js index d87f9370b346b39b48ec0b083951280e47765307..3406d19db01bac5b0ac7f9060bcb7d6a34e1c656 100644 --- a/gh-badges/lib/svg-to-img.spec.js +++ b/gh-badges/lib/svg-to-img.spec.js @@ -4,9 +4,7 @@ const { expect } = require('chai') const isPng = require('is-png') const sinon = require('sinon') const svg2img = require('./svg-to-img') -const testHelpers = require('./make-badge-test-helpers') - -const makeBadge = testHelpers.makeBadge() +const makeBadge = require('./make-badge') describe('The rasterizer', function() { let cacheGet diff --git a/gh-badges/lib/text-measurer.js b/gh-badges/lib/text-measurer.js deleted file mode 100644 index dae729a6a581c434495de4bf5effb6c3faf7da99..0000000000000000000000000000000000000000 --- a/gh-badges/lib/text-measurer.js +++ /dev/null @@ -1,94 +0,0 @@ -'use strict' - -const PDFDocument = require('pdfkit') - -class PDFKitTextMeasurer { - constructor(fontPath, fallbackFontPath) { - this.document = new PDFDocument({ - size: 'A4', - layout: 'landscape', - }).fontSize(11) - try { - this.document.font(fontPath) - } catch (e) { - if (fallbackFontPath) { - console.error( - `Text-width computation may be incorrect. Unable to load font at ${fontPath}. Using fallback font ${fallbackFontPath} instead.` - ) - this.document.font(fallbackFontPath) - } else { - console.error('No fallback font set.') - throw e - } - } - } - - widthOf(str) { - return this.document.widthOfString(str) - } -} - -class QuickTextMeasurer { - constructor(fontPath, fallbackFontPath) { - this.baseMeasurer = new PDFKitTextMeasurer(fontPath, fallbackFontPath) - - // This will be a Map of characters -> numbers. - this.characterWidths = new Map() - // This will be Map of Maps of characters -> numbers. - this.kerningPairs = new Map() - this._prepare() - } - - static printableAsciiCharacters() { - const printableRange = [32, 126] - const length = printableRange[1] - printableRange[0] + 1 - return Array.from({ length }, (value, i) => printableRange[0] + i).map( - charCode => String.fromCharCode(charCode) - ) - } - - _prepare() { - const charactersToCache = this.constructor.printableAsciiCharacters() - - charactersToCache.forEach(char => { - this.characterWidths.set(char, this.baseMeasurer.widthOf(char)) - this.kerningPairs.set(char, new Map()) - }) - - charactersToCache.forEach(first => { - charactersToCache.forEach(second => { - const individually = - this.characterWidths.get(first) + this.characterWidths.get(second) - const asPair = this.baseMeasurer.widthOf(`${first}${second}`) - const kerningAdjustment = asPair - individually - this.kerningPairs.get(first).set(second, kerningAdjustment) - }) - }) - } - - widthOf(str) { - const { characterWidths, kerningPairs } = this - - let result = 0 - let previous = null - for (const character of str) { - if (!characterWidths.has(character)) { - // Bail. - return this.baseMeasurer.widthOf(str) - } - - result += characterWidths.get(character) - if (previous !== null) { - result += kerningPairs.get(previous).get(character) - } - - previous = character - } - return result - } -} - -module.exports = { - PDFKitTextMeasurer, - QuickTextMeasurer, -} diff --git a/gh-badges/lib/text-measurer.spec.js b/gh-badges/lib/text-measurer.spec.js deleted file mode 100644 index 93241f60fb98222f62a3ba4766fb49374aa26bc1..0000000000000000000000000000000000000000 --- a/gh-badges/lib/text-measurer.spec.js +++ /dev/null @@ -1,153 +0,0 @@ -'use strict' - -const { expect } = require('chai') -const path = require('path') -const fs = require('fs') -const sinon = require('sinon') -const { PDFKitTextMeasurer, QuickTextMeasurer } = require('./text-measurer') -const defaults = require('./defaults') -const testHelpers = require('./make-badge-test-helpers') -const almostEqual = require('almost-equal') - -const EPSILON_PIXELS = 1e-3 - -describe('PDFKitTextMeasurer with DejaVu Sans', function() { - it('should produce the same length as before', function() { - const measurer = new PDFKitTextMeasurer(testHelpers.font.path) - expect( - measurer.widthOf('This is the dawning of the Age of Aquariums') - ).to.equal(243.546875) - }) -}) - -function registerTests(fontPath, skip) { - // Invoke `.skip()` within the `it`'s so we get logging of the skipped tests. - const displayName = path.basename(fontPath, path.extname(fontPath)) - - describe(`QuickTextMeasurer with ${displayName}`, function() { - let quickMeasurer - if (!skip) { - before(function() { - // Since this is slow, share it across all tests. - quickMeasurer = new QuickTextMeasurer(fontPath) - }) - } - - let sandbox - let pdfKitWidthOf - let pdfKitMeasurer - if (!skip) { - // Boo, the sandbox doesn't get cleaned up after a skipped test. - beforeEach(function() { - // This often times out: https://circleci.com/gh/badges/shields/2786 - this.timeout(5000) - sandbox = sinon.createSandbox() - pdfKitWidthOf = sandbox.spy(PDFKitTextMeasurer.prototype, 'widthOf') - pdfKitMeasurer = new PDFKitTextMeasurer(fontPath) - }) - - afterEach(function() { - if (sandbox) { - sandbox.restore() - sandbox = null - } - }) - } - - context('when given ASCII strings', function() { - const strings = [ - 'This is the dawning of the Age of Aquariums', - 'v1.2.511', - '5 passed, 2 failed, 1 skipped', - '[prismic "1.1"]', - ] - - strings.forEach(str => { - it(`should measure '${str}' in parity with PDFKit`, function() { - if (skip) { - this.skip() - } - expect(quickMeasurer.widthOf(str)).to.be.closeTo( - pdfKitMeasurer.widthOf(str), - EPSILON_PIXELS - ) - }) - }) - - strings.forEach(str => { - it(`should measure '${str}' without invoking PDFKit`, function() { - if (skip) { - this.skip() - } - quickMeasurer.widthOf(str) - expect(pdfKitWidthOf).not.to.have.been.called - }) - }) - - context('when the font includes a kerning pair', function() { - const stringsWithKerningPairs = [ - 'Q-tips', // In DejaVu, Q- is a kerning pair. - 'B-flat', // In Verdana, B- is a kerning pair. - ] - - function widthByMeasuringCharacters(str) { - let result = 0 - for (const char of str) { - result += pdfKitMeasurer.widthOf(char) - } - return result - } - - it(`should apply a width correction`, function() { - if (skip) { - this.skip() - } - - const adjustedStrings = [] - - stringsWithKerningPairs.forEach(str => { - const actual = quickMeasurer.widthOf(str) - const unadjusted = widthByMeasuringCharacters(str) - if (!almostEqual(actual, unadjusted, EPSILON_PIXELS)) { - adjustedStrings.push(str) - } - }) - - expect(adjustedStrings).to.be.an('array').that.is.not.empty - }) - }) - }) - - context('when given non-ASCII strings', function() { - const strings = ['★★★½☆', '\u2026'] - - strings.forEach(str => { - it(`should measure '${str}' in parity with PDFKit`, function() { - if (skip) { - this.skip() - } - expect(quickMeasurer.widthOf(str)).to.be.closeTo( - pdfKitMeasurer.widthOf(str), - EPSILON_PIXELS - ) - }) - }) - - strings.forEach(str => { - it(`should invoke the base when measuring '${str}'`, function() { - if (skip) { - this.skip() - } - quickMeasurer.widthOf(str) - expect(pdfKitWidthOf).to.have.been.called - }) - }) - }) - }) -} - -// i.e. Verdana -registerTests(defaults.font.path, !fs.existsSync(defaults.font.path)) - -// i.e. DejaVu Sans -registerTests(testHelpers.font.path) diff --git a/gh-badges/package.json b/gh-badges/package.json index 1814dbdcde7356c547d396b5dc4a8a1e7d829ec7..b94a66bb807eee659be4b04937fdca3fce648a6f 100644 --- a/gh-badges/package.json +++ b/gh-badges/package.json @@ -33,6 +33,7 @@ "logo": "https://opencollective.com/opencollective/logo.txt" }, "dependencies": { + "anafanafo": "^0.1.0", "dot": "~1.1.2", "gm": "^1.23.0", "is-css-color": "^1.0.0", diff --git a/lib/request-handler.js b/lib/request-handler.js index 47c0a4f3c7ecf6a59c25f39c5d30500626cdda04..cfca8780e229b9db1040ddc094eae70f95dae17b 100644 --- a/lib/request-handler.js +++ b/lib/request-handler.js @@ -6,6 +6,7 @@ const request = require('request') const { makeBadgeData: getBadgeData } = require('./badge-data') const log = require('./log') const LruCache = require('../gh-badges/lib/lru-cache') +const makeBadge = require('../gh-badges/lib/make-badge') const analytics = require('./analytics') const { makeSend } = require('./result-sender') const queryString = require('query-string') @@ -88,9 +89,7 @@ function getBadgeMaxAge(handlerOptions, queryParams) { // (undesirable and hard to debug). // // Pass just the handler function as shorthand. -// -// Inject `makeBadge` as a dependency. -function handleRequest(makeBadge, handlerOptions) { +function handleRequest(handlerOptions) { if (typeof handlerOptions === 'function') { handlerOptions = { handler: handlerOptions } } @@ -276,8 +275,6 @@ function isInt(number) { module.exports = { handleRequest, - makeHandleRequestFn: makeBadge => handlerOptions => - handleRequest(makeBadge, handlerOptions), clearRequestCache, // Expose for testing. _requestCache: requestCache, diff --git a/lib/request-handler.spec.js b/lib/request-handler.spec.js index 31053b4119dff9c0170da249cbdfcaf1ec060204..26b46e3e528508e3e31aec603f339f73cd131adb 100644 --- a/lib/request-handler.spec.js +++ b/lib/request-handler.spec.js @@ -8,14 +8,11 @@ const Camp = require('camp') const analytics = require('./analytics') const { makeBadgeData: getBadgeData } = require('./badge-data') const { - makeHandleRequestFn, + handleRequest, clearRequestCache, _requestCache, getBadgeMaxAge, } = require('./request-handler') -const testHelpers = require('../gh-badges/lib/make-badge-test-helpers') - -const handleRequest = makeHandleRequestFn(testHelpers.makeBadge()) const baseUri = `http://127.0.0.1:${config.port}` diff --git a/lib/server-config.js b/lib/server-config.js index 87aad29a0a001d5afd334b7a724e4b0b246f0fb1..01832d822cbad8e45b34ccb11470c95b34e91a9d 100644 --- a/lib/server-config.js +++ b/lib/server-config.js @@ -5,7 +5,6 @@ const url = require('url') const envFlag = require('node-env-flag') -const defaults = require('../gh-badges/lib/defaults') function envArray(envVar, defaultValue, delimiter) { delimiter = delimiter || ',' @@ -69,10 +68,6 @@ const config = { }, trace: envFlag(process.env.TRACE_SERVICES), }, - font: { - path: process.env.FONT_PATH || defaults.font.path, - fallbackPath: process.env.FALLBACK_FONT_PATH, - }, profiling: { makeBadge: envFlag(process.env.PROFILE_MAKE_BADGE), }, @@ -80,8 +75,4 @@ const config = { handleInternalErrors: envFlag(process.env.HANDLE_INTERNAL_ERRORS, true), } -if (config.font.fallbackPath) { - console.log('FALLBACK_FONT_PATH is deprecated. Please use FONT_PATH.') -} - module.exports = config diff --git a/package-lock.json b/package-lock.json index be20a4a0941207f0614837e278842b9a3cdaf1d2..94da22e64a3ddb9f4279116e26fb49c72bb9f30c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -932,7 +932,7 @@ "dependencies": { "core-js": { "version": "2.5.7", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", "dev": true }, @@ -1032,7 +1032,7 @@ "dependencies": { "core-js": { "version": "2.5.7", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", "dev": true } @@ -1050,7 +1050,7 @@ "dependencies": { "core-js": { "version": "2.5.7", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", "dev": true }, @@ -1296,8 +1296,7 @@ "acorn": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", - "optional": true + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" }, "acorn-dynamic-import": { "version": "2.0.2", @@ -1411,6 +1410,14 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "optional": true }, + "anafanafo": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-0.1.0.tgz", + "integrity": "sha512-Uh4dXx3/DHxLF/sfpl627VPRKi6AM7Z9bsIzAjZZG8ywe6vEppms0B9kdHr320IrNznf8W4THsiLe00qjTp4dg==", + "requires": { + "char-width-table-consumer": "^0.2.0" + } + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -1599,7 +1606,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -1763,13 +1770,13 @@ }, "babel-plugin-react-require": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/babel-plugin-react-require/-/babel-plugin-react-require-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-react-require/-/babel-plugin-react-require-3.0.0.tgz", "integrity": "sha1-Lk57RJa5OmVKHIAEInbeTk7rIOM=", "dev": true }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", "dev": true }, @@ -1906,6 +1913,11 @@ "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", "dev": true }, + "binary-search": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.4.tgz", + "integrity": "sha512-dPxU/vZLnH0tEVjVPgi015oSwqu6oLfCeHywuFRhBE0yM0mYocvleTl8qsdM1YFhRzTRhM1+VzS8XLDVrHPopg==" + }, "bintrees": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", @@ -2144,7 +2156,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2203,7 +2215,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -2536,6 +2548,14 @@ } } }, + "char-width-table-consumer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/char-width-table-consumer/-/char-width-table-consumer-0.2.0.tgz", + "integrity": "sha512-XMaaBnOH/xkBRoq1VXMc5yWaSztfi9uWceRizXUEqU6dHti431K5CG8Racgk+KrwIvzzHTqVzDZDEkqWf9WKVA==", + "requires": { + "binary-search": "^1.3.4" + } + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3308,7 +3328,7 @@ }, "core-js": { "version": "2.5.1", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" }, "core-util-is": { @@ -3474,8 +3494,7 @@ "cssom": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "optional": true + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" }, "cssstyle": { "version": "0.2.37", @@ -3503,7 +3522,7 @@ }, "d": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { @@ -3567,7 +3586,7 @@ }, "json5": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", "dev": true, "requires": { @@ -3729,12 +3748,6 @@ } } }, - "dejavu-fonts-ttf": { - "version": "2.37.3", - "resolved": "https://registry.npmjs.org/dejavu-fonts-ttf/-/dejavu-fonts-ttf-2.37.3.tgz", - "integrity": "sha1-I/K/WvWUyiqKOlMiQiSwNGem4Lg=", - "dev": true - }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -3929,7 +3942,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -4862,7 +4875,7 @@ }, "events": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, @@ -5197,7 +5210,7 @@ "dependencies": { "core-js": { "version": "1.2.7", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", "dev": true }, @@ -5366,7 +5379,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5531,7 +5544,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -5607,8 +5620,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -5629,14 +5641,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5651,20 +5661,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -5781,8 +5788,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -5794,7 +5800,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5809,7 +5814,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5817,14 +5821,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -5843,7 +5845,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -5924,8 +5925,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5937,7 +5937,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -6023,8 +6022,7 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -6060,7 +6058,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6080,7 +6077,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6124,14 +6120,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -6201,6 +6195,7 @@ "gh-badges": { "version": "file:gh-badges", "requires": { + "anafanafo": "^0.1.0", "dot": "~1.1.2", "gm": "^1.23.0", "is-css-color": "^1.0.0", @@ -6612,7 +6607,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -6648,7 +6643,7 @@ }, "htmlescape": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, @@ -7719,7 +7714,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, @@ -8034,7 +8029,7 @@ "dependencies": { "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -8092,7 +8087,7 @@ "dependencies": { "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -8124,7 +8119,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, @@ -8379,7 +8374,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, @@ -8589,7 +8584,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -10254,7 +10249,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -10448,7 +10443,6 @@ "resolved": false, "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, - "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -10587,7 +10581,7 @@ }, "convert-source-map": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "resolved": false, "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { @@ -10606,7 +10600,7 @@ }, "debug": { "version": "3.1.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { @@ -10727,7 +10721,7 @@ }, "glob": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "resolved": false, "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { @@ -10818,8 +10812,7 @@ "version": "1.1.6", "resolved": false, "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true + "dev": true }, "is-builtin-module": { "version": "1.0.0", @@ -10865,7 +10858,7 @@ }, "istanbul-lib-report": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", + "resolved": false, "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", "dev": true, "requires": { @@ -10897,7 +10890,7 @@ }, "istanbul-reports": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", + "resolved": false, "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", "dev": true, "requires": { @@ -10915,7 +10908,6 @@ "resolved": false, "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, - "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -10968,8 +10960,7 @@ "version": "1.0.1", "resolved": false, "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true + "dev": true }, "lru-cache": { "version": "4.1.3", @@ -11071,7 +11062,7 @@ }, "ms": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, @@ -11272,8 +11263,7 @@ "version": "1.6.1", "resolved": false, "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true + "dev": true }, "require-directory": { "version": "2.1.1", @@ -11314,7 +11304,7 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, @@ -12029,7 +12019,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -12981,7 +12971,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14147,7 +14137,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -14359,7 +14349,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -14420,7 +14410,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { diff --git a/package.json b/package.json index 73b8280e3e0ab69dc252d6440405042fb2d511b1..f83d87ae960fb707b654a9a0ca2e5c44f3fe7da4 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,6 @@ "concurrently": "^4.0.1", "danger": "^6.0.5", "danger-plugin-no-test-shortcuts": "^2.0.0", - "dejavu-fonts-ttf": "^2.37.3", "eol": "^0.9.1", "eslint": "^5.0.1", "eslint-config-prettier": "^3.0.1", diff --git a/server.js b/server.js index bd6ab288eac1287ac68d5e559d48ea7486a50e65..d386545070a743314641ff514480928a0c487a4d 100644 --- a/server.js +++ b/server.js @@ -19,8 +19,7 @@ const GithubConstellation = require('./services/github/github-constellation') const PrometheusMetrics = require('./lib/sys/prometheus-metrics') const sysMonitor = require('./lib/sys/monitor') const log = require('./lib/log') -const { makeMakeBadgeFn } = require('./gh-badges/lib/make-badge') -const { QuickTextMeasurer } = require('./gh-badges/lib/text-measurer') +const makeBadge = require('./gh-badges/lib/make-badge') const suggest = require('./lib/suggest') const { makeColorB, @@ -29,7 +28,7 @@ const { setBadgeColor, } = require('./lib/badge-data') const { - makeHandleRequestFn, + handleRequest: cache, clearRequestCache, } = require('./lib/request-handler') const { clearRegularUpdateCache } = require('./lib/regular-update') @@ -75,16 +74,6 @@ module.exports = { log(`Server is starting up: ${config.baseUri}`) -let measurer -try { - measurer = new QuickTextMeasurer(config.font.path, config.font.fallbackPath) -} catch (e) { - console.log(`Unable to load fallback font. Using Helvetica-Bold instead.`) - measurer = new QuickTextMeasurer('Helvetica') -} -const makeBadge = makeMakeBadgeFn(measurer) -const cache = makeHandleRequestFn(makeBadge) - analytics.load() analytics.scheduleAutosaving() analytics.setRoutes(camp) diff --git a/services/base-svg-scraping.spec.js b/services/base-svg-scraping.spec.js index 64a30646d3f454d45a8b37422e54bf04ade3293d..f234dc166a35ebf4fa088623c18806b76c1a0ec1 100644 --- a/services/base-svg-scraping.spec.js +++ b/services/base-svg-scraping.spec.js @@ -5,7 +5,7 @@ const { expect } = require('chai') const sinon = require('sinon') const Joi = require('joi') const { makeBadgeData } = require('../lib/badge-data') -const testHelpers = require('../gh-badges/lib/make-badge-test-helpers') +const makeBadge = require('../gh-badges/lib/make-badge') const BaseSvgScrapingService = require('./base-svg-scraping') chai.use(require('chai-as-promised')) @@ -13,7 +13,7 @@ chai.use(require('chai-as-promised')) function makeExampleSvg({ label, message }) { const badgeData = makeBadgeData('this is the label', {}) badgeData.text[1] = 'this is the result!' - return testHelpers.makeBadge()(badgeData) + return makeBadge(badgeData) } const schema = Joi.object({