Pete Bacon Darwin 5bc0a472bd refactor(docs-infra): remove image size exclusion list (#41292)
In #41253 the size of contributor images was limited, but
some images were already too large. So an exclusion list
was added. These images have now been reduced, so
the exclusion list is no longer needed.

The files were reduced by a combination of running them through the
https://tinyjpg.com/ online service and manually setting their size to
168px wide or tall using the MacOS Image Preview app.

PR Close #41292
2021-03-22 08:55:53 -07:00

70 lines
2.8 KiB
JavaScript

#!/usr/bin/env node
// Imports
const {existsSync, readFileSync, statSync} = require('fs');
const {join, resolve} = require('path');
// Constants
const MAX_IMAGE_SIZE = 30 * 1024; // 30kb
const CONTENT_DIR = resolve(__dirname, '../../content');
const IMAGES_DIR = join(CONTENT_DIR, 'images/bios');
const CONTRIBUTORS_PATH = join(CONTENT_DIR, 'marketing/contributors.json');
const EXISTING_GROUPS = new Set(['Angular', 'GDE', 'Collaborators']);
// Run
_main();
// Functions - Definitions
function _main() {
const contributors = JSON.parse(readFileSync(CONTRIBUTORS_PATH, 'utf8'));
// Check that there are no missing images.
const expectedImages = Object.keys(contributors)
.filter(key => !!contributors[key].picture)
.map(key => join(IMAGES_DIR, contributors[key].picture));
const missingImages = expectedImages.filter(path => !existsSync(path));
if (missingImages.length > 0) {
throw new Error(
'The following pictures are referenced in \'contributors.json\' but do not exist:' +
missingImages.map(path => `\n - ${path}`).join(''));
}
// Check that there are no images that exceed the size limit.
const tooLargeImages = expectedImages.filter(path => statSync(path).size > MAX_IMAGE_SIZE);
if (tooLargeImages.length > 0) {
throw new Error(
`The following pictures exceed maximum size limit of ${MAX_IMAGE_SIZE / 1024}kb:` +
tooLargeImages.map(path => `\n - ${path}`).join(''));
}
// Verify that all keys are sorted alphabetically
const keys = Object.keys(contributors);
for (let i = 1; i < keys.length; i++) {
if (keys[i - 1].toLowerCase() > keys[i].toLowerCase()) {
throw new Error(
`The following keys in 'contributors.json' are not in alphabetical order: '${keys[i - 1]}' and '${keys[i]}'.`
);
}
}
Object.entries(contributors).forEach(([key, entry]) => {
// Make sure `lead` and `mentor` fields refer to existing entries
if (entry.lead && !contributors[entry.lead]) {
throw new Error(`The '${key}' entry contains 'lead' field, but it refers to non-existing entry ('${entry.lead}').`);
}
if (entry.mentor && !contributors[entry.mentor]) {
throw new Error(`The '${key}' entry contains 'mentor' field, but it refers to non-existing entry ('${entry.mentor}').`);
}
// Verify that `groups` field is always present and contains existing groups
if (!entry.groups || !Array.isArray(entry.groups) || entry.groups.length === 0) {
throw new Error(`The 'groups' field should be defined as a non-empty array (entry: '${key}').`);
}
if (entry.groups.some(group => !EXISTING_GROUPS.has(group))) {
throw new Error(`The '${key}' entry contains 'groups' field with unknown values ` +
`(groups: ${JSON.stringify(entry.groups)}, known values: ${JSON.stringify(Array.from(EXISTING_GROUPS))}).`);
}
});
}