Skip to content

Commit fc618a1

Browse files
authored
Switch opencollective images to self-hosted spritesheet (#4318)
* Generate sprite sheets from opencollective avatars to serve them quicker * Update assetgraph-builder to 8.0.1 * Filter out anonymous donors * Remove sprite padding * Move all supporter names to a title attribute that always exists * Root relative CSS hrefs * Update package-lock.json * Get rid of avatars.js since the sprites don't work that way * Always https protocol on opencollective badges * Add local netlify folder to gitignore * Avoid supporter spritesheet ending up as external stylesheet in body. Caused render flush that resulted in confusing layout shift on reload * Add missing newline in .gitignore
1 parent 612fa31 commit fc618a1

File tree

9 files changed

+273
-159
lines changed

9 files changed

+273
-159
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Mocha-specific
22
docs/_site
33
docs/_dist
4+
docs/images/supporters
45
mocha.js
56
.karma/
67
!lib/mocha.js
@@ -141,3 +142,6 @@ Temporary Items
141142

142143
# SauceConnect
143144
*.sock
145+
146+
# Local Netlify folder
147+
.netlify

docs/_data/supporters.js

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#!/usr/bin/env node
22
'use strict';
33

4+
const {mkdirSync} = require('fs');
5+
const {writeFile} = require('fs').promises;
6+
const {resolve} = require('path');
47
const debug = require('debug')('mocha:docs:data:supporters');
58
const needle = require('needle');
69
const imageSize = require('image-size');
@@ -16,6 +19,7 @@ const query = `query account($limit: Int, $offset: Int, $slug: String) {
1619
totalCount
1720
nodes {
1821
fromAccount {
22+
id
1923
name
2024
slug
2125
website
@@ -35,6 +39,7 @@ const query = `query account($limit: Int, $offset: Int, $slug: String) {
3539
const graphqlPageSize = 1000;
3640

3741
const nodeToSupporter = node => ({
42+
id: node.fromAccount.id,
3843
name: node.fromAccount.name,
3944
slug: node.fromAccount.slug,
4045
website: node.fromAccount.website,
@@ -101,10 +106,12 @@ module.exports = async () => {
101106
.reduce(
102107
(supporters, supporter) => {
103108
if (supporter.type === 'INDIVIDUAL') {
104-
supporters.backers.push({
105-
...supporter,
106-
avatar: supporter.imgUrlSmall
107-
});
109+
if (supporter.name !== 'anonymous') {
110+
supporters.backers.push({
111+
...supporter,
112+
avatar: supporter.imgUrlSmall
113+
});
114+
}
108115
} else {
109116
supporters.sponsors.push({...supporter, avatar: supporter.imgUrlMed});
110117
}
@@ -113,13 +120,26 @@ module.exports = async () => {
113120
{sponsors: [], backers: []}
114121
);
115122

123+
const supporterImagePath = resolve(__dirname, '../images/supporters');
124+
125+
mkdirSync(supporterImagePath, {recursive: true});
126+
116127
// Fetch images for sponsors and save their image dimensions
117128
await Promise.all(
118129
supporters.sponsors.map(async sponsor => {
119-
for await (const chunk of needle.get(sponsor.avatar)) {
120-
sponsor.dimensions = imageSize(chunk);
121-
break;
122-
}
130+
const filePath = resolve(supporterImagePath, sponsor.id + '.png');
131+
const {body} = await needle('get', sponsor.avatar);
132+
sponsor.dimensions = imageSize(body);
133+
await writeFile(filePath, body);
134+
})
135+
);
136+
137+
// Fetch images for backers and save their image dimensions
138+
await Promise.all(
139+
supporters.backers.map(async backer => {
140+
const filePath = resolve(supporterImagePath, backer.id + '.png');
141+
const {body} = await needle('get', backer.avatar);
142+
await writeFile(filePath, body);
123143
})
124144
);
125145

docs/_includes/default.liquid

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
<meta charset="utf-8" />
55
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
66
<title>{{ title }}</title>
7-
<link rel="stylesheet" href="css/normalize.css" />
8-
<link rel="stylesheet" href="css/style.css" />
9-
<link rel="stylesheet" href="css/prism.css" />
7+
<link rel="stylesheet" href="/css/normalize.css" />
8+
<link rel="stylesheet" href="/css/style.css" />
9+
<link rel="stylesheet" href="/css/supporters.css" />
10+
<link rel="stylesheet" href="/css/prism.css" />
1011
<link rel="icon" href="favicon.ico" />
1112

1213
<!--[if lt IE 9]> <script src="js/html5shiv.min.js"></script> <![endif]-->

docs/_includes/supporters.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ Use Mocha at Work? Ask your manager or marketing team if they'd help [support](h
66
{%- for supporter in supporters.sponsors -%}
77
<li>
88
{%- if supporter.website -%}
9-
<a href="{{ supporter.website }}" target="_blank" rel="noopener" title="{{ supporter.name }}">
9+
<a href="{{ supporter.website }}" target="_blank" rel="noopener">
1010
{%- endif -%}
11-
<img src="{{ supporter.avatar }}" width="{{ supporter.dimensions.width }}" height="{{ supporter.dimensions.height }}" alt="{{ supporter.name }}" />
11+
<div class="sponsor" title="{{ supporter.name }}" style="width: {{ supporter.dimensions.width }}px; background-image: url(/images/supporters/{{ supporter.id }}.png?sprite=sponsors)"></div>
1212
{%- if supporter.website -%}
1313
</a>
1414
{%- endif -%}
@@ -24,14 +24,12 @@ Find Mocha helpful? Become a [backer](https://opencollective.com/mochajs#support
2424
{%- for supporter in supporters.backers -%}
2525
<li>
2626
{%- if supporter.website -%}
27-
<a href="{{ supporter.website }}" target="_blank" rel="noopener" title="{{ supporter.name }}">
27+
<a href="{{ supporter.website }}" target="_blank" rel="noopener">
2828
{%- endif -%}
29-
<img src="{{ supporter.avatar }}" alt="{{ supporter.name }}" />
29+
<div class="backer backer-{{ forloop.index }}" title="{{ supporter.name }}" style="background-image: url(/images/supporters/{{ supporter.id }}.png?sprite=backers)"></div>
3030
{%- if supporter.website -%}
3131
</a>
3232
{%- endif -%}
3333
</li>
3434
{%- endfor -%}
3535
</ul>
36-
37-
<script src="/js/avatars.js"></script>

docs/css/supporters.css

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
.sponsor {
2+
-sprite-selector-for-group: sponsors;
3+
-sprite-location: url(/images/sprite-sponsors.png?pngquant);
4+
-sprite-image-format: png;
5+
height: 64px;
6+
}
7+
.backer {
8+
-sprite-selector-for-group: backers;
9+
-sprite-location: url(/images/sprite-backers.png?pngquant);
10+
-sprite-image-format: png;
11+
width: 32px;
12+
height: 32px;
13+
}

docs/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js][] and in
88

99
<nav class="badges">
1010
<a href="https://gitter.im/mochajs/mocha"><img src="/images/join-chat.svg" height="18" alt="Gitter"></a>
11-
<a href="#sponsors"><img src="//opencollective.com/mochajs/sponsors/badge.svg" height="18" alt="OpenCollective sponsors"></a>
12-
<a href="#backers"><img src="//opencollective.com/mochajs/backers/badge.svg" height="18" alt="OpenCollective backers"></a>
11+
<a href="#sponsors"><img src="https://opencollective.com/mochajs/sponsors/badge.svg" height="18" alt="OpenCollective sponsors"></a>
12+
<a href="#backers"><img src="https://opencollective.com/mochajs/backers/badge.svg" height="18" alt="OpenCollective backers"></a>
1313
</nav>
1414

1515
{% include supporters.md %}

docs/js/avatars.js

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)