mirror of
https://github.com/svg/svgo.git
synced 2026-01-27 07:02:06 +03:00
232 lines
13 KiB
JavaScript
232 lines
13 KiB
JavaScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import stream from 'stream';
|
|
import util from 'util';
|
|
import zlib from 'zlib';
|
|
import tarStream from 'tar-stream';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
const pipeline = util.promisify(stream.pipeline);
|
|
|
|
/** Files to skip regression testing. We need to work on emptying this list. */
|
|
const exclude = [
|
|
// animated
|
|
'W3C_SVG_11_TestSuite/svg/filters-light-04-f.svg',
|
|
'W3C_SVG_11_TestSuite/svg/filters-composite-05-f.svg',
|
|
// messed gradients
|
|
'W3C_SVG_11_TestSuite/svg/pservers-grad-18-b.svg',
|
|
// rect is converted to path which matches wrong styles
|
|
'W3C_SVG_11_TestSuite/svg/styling-css-08-f.svg',
|
|
// complex selectors are messed because of converting shapes to paths
|
|
'W3C_SVG_11_TestSuite/svg/struct-use-10-f.svg',
|
|
'W3C_SVG_11_TestSuite/svg/struct-use-11-f.svg',
|
|
'W3C_SVG_11_TestSuite/svg/styling-css-01-b.svg',
|
|
'W3C_SVG_11_TestSuite/svg/styling-css-04-f.svg',
|
|
// strange artifact inconsistently breaks regression tests
|
|
'W3C_SVG_11_TestSuite/svg/filters-conv-05-f.svg',
|
|
// broken and pending fix
|
|
'oxygen-icons-5.116.0/scalable/actions/hidef/tools-rip-audio-cd.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/im-ban-kick-user.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/im-ban-user.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/irc-close-channel.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/irc-remove-operator.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/irc-unvoice.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/list-add.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/list-remove-user.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/list-remove.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/mail-send.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/player-volume.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/document-edit-decrypt.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/document-edit-encrypt.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/document-edit-sign.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/document-edit-verify.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/im-ban-user.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/im-yahoo.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/irc-close-channel.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/irc-remove-operator.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/irc-unvoice.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/list-add-user.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/mail-encrypted-full.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/mail-encrypted-part.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/mail-encrypted.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/mail-signature-unknown.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/mail-signed-full.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/mail-signed-part.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/mail-signed.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/mail-tagged.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/tools-media-optical-burn-image.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/view-calendar-list.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/16x16/view-time-schedule-calculus.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/edit-select-none.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/im-google.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/irc-close-channel.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/list-add-user.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/mail-forward.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/mail-forward.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/mail-queue.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/mail-receive.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/mixer-cd.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/news-unsubscribe.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/tools-media-optical-burn-image.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/tools-media-optical-copy.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/view-calendar-list.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/22x22/view-time-schedule-baselined-remove.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/documentation.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/edit-table-delete-column.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/edit-table-delete-row.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/im-ban-kick-user.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/im-ban-user.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/im-google.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/mail-mark-junk.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/tools-media-optical-burn-image.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/tools-rip-video-dvd.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-calendar-birthday.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-calendar-holiday.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-calendar-special-occasion.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-calendar-wedding-anniversary.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule-baselined-add.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule-baselined-remove.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule-baselined-remove.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule-baselined.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule-calculus.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule-child-insert.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule-edit.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule-insert.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/32x32/view-time-schedule.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/48x48/im-google.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/48x48/preflight-verifier.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/48x48/tools-media-optical-burn-image.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/small/48x48/view-time-schedule-calculus.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/tools-media-optical-burn-image.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/tools-rip-audio-cd.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/user-properties.svg',
|
|
'oxygen-icons-5.116.0/scalable/actions/view-pim-mail.svg',
|
|
'oxygen-icons-5.116.0/scalable/applets/org.kde.plasma.clipboard.svg',
|
|
'oxygen-icons-5.116.0/scalable/applets/org.kde.plasma.devicenotifier.svg',
|
|
'oxygen-icons-5.116.0/scalable/applets/org.kde.plasma.icontasks.svg',
|
|
'oxygen-icons-5.116.0/scalable/applets/org.kde.plasma.kickerdash.svg',
|
|
'oxygen-icons-5.116.0/scalable/applets/org.kde.plasma.quicklaunch.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/accessories-text-editor.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/basket.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/graphics-viewer-document.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/hardware.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/hidef/kmail2.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/hidef/preferences-desktop-locale.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/hwinfo.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/kde-gtk-config.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/kjournal.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/kmail2.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/kmymoney.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/kplato.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/ksudoku.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/okteta.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/picmi.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/preferences-desktop-user-password.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/preferences-system-time.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/scribus.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/small/22x22/basket.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/small/32x32/preferences-system-windows-move.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/small/48x48/kig.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/small/64x64/kplato.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/strigi.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/timevault.svg',
|
|
'oxygen-icons-5.116.0/scalable/apps/utilities-log-viewer.svg',
|
|
'oxygen-icons-5.116.0/scalable/categories/applications-education-preschool.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/audio-card.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/camera-web.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/hidef/input-keyboard.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/hidef/media-optical-audio.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/input-keyboard.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/media-optical-audio.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/scanner.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/small/16x16/media-optical-audio.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/small/16x16/media-optical-data.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/small/22x22/media-optical-audio.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/small/22x22/media-optical-data.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/small/32x32/media-optical-audio.svg',
|
|
'oxygen-icons-5.116.0/scalable/devices/small/48x48/media-optical-audio.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/application-x-cd-image.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/application-x-cue.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/application-x-kvtml.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/hidef/application-rtf.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/hidef/application-sxw.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/22x22/application-javascript.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/22x22/application-pdf.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/22x22/application-x-javascript.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/22x22/application-x-srt.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/22x22/application-x-subrip.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/22x22/text-css.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/22x22/text-plain.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/22x22/text-x-csharp.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/32x32/application-x-applix-word.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/32x32/application-x-lyx.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/48x48/application-x-cd-image.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/48x48/application-x-cue.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/48x48/help.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/48x48/text-xmcd.svg',
|
|
'oxygen-icons-5.116.0/scalable/mimetypes/small/64x64/application-x-cue.svg',
|
|
'oxygen-icons-5.116.0/scalable/places/small/64x64/folder-tar.svg',
|
|
'oxygen-icons-5.116.0/scalable/places/small/64x64/network-server-database.svg',
|
|
'oxygen-icons-5.116.0/scalable/places/small/64x64/server-database.svg',
|
|
'W3C_SVG_11_TestSuite/svg/color-prop-04-t.svg',
|
|
'W3C_SVG_11_TestSuite/svg/coords-units-03-b.svg',
|
|
'W3C_SVG_11_TestSuite/svg/filters-displace-01-f.svg',
|
|
'W3C_SVG_11_TestSuite/svg/fonts-kern-01-t.svg',
|
|
'W3C_SVG_11_TestSuite/svg/interact-pevents-01-b.svg',
|
|
'W3C_SVG_11_TestSuite/svg/struct-cond-03-t.svg',
|
|
'wikimedia-commons/Italy_-_Regions_and_provinces.svg',
|
|
'wikimedia-commons/Saariston_Rengastie_route_labels.svg',
|
|
// SVGO can not handle this SVG in a reasonable amount of time
|
|
'wikimedia-commons/1_42_polytope_7-cube.svg',
|
|
];
|
|
|
|
/**
|
|
* @param {string} url
|
|
* @param {string} baseDir
|
|
*/
|
|
const extractTarGz = async (url, baseDir) => {
|
|
const extract = tarStream.extract();
|
|
extract.on('entry', async (header, stream, next) => {
|
|
const name = header.name.slice(16);
|
|
|
|
try {
|
|
if (
|
|
name.endsWith('.svg') &&
|
|
!exclude.includes(name) &&
|
|
!name.startsWith('W3C_SVG_11_TestSuite/svg/animate-')
|
|
) {
|
|
const file = path.join(baseDir, name);
|
|
await fs.promises.mkdir(path.dirname(file), { recursive: true });
|
|
await pipeline(stream, fs.createWriteStream(file));
|
|
}
|
|
} catch (error) {
|
|
console.error(error);
|
|
process.exit(1);
|
|
}
|
|
stream.resume();
|
|
next();
|
|
});
|
|
const { body } = await fetch(url);
|
|
|
|
if (!body) {
|
|
throw Error('No body returned when fetching SVGO Test Suite.');
|
|
}
|
|
|
|
await pipeline(body, zlib.createGunzip(), extract);
|
|
};
|
|
|
|
(async () => {
|
|
try {
|
|
console.info('Downloading SVGO Test Suite and extracting files');
|
|
await extractTarGz(
|
|
'https://svg.github.io/svgo-test-suite/svgo-test-suite.tar.gz',
|
|
path.join(__dirname, 'regression-fixtures'),
|
|
);
|
|
} catch (error) {
|
|
console.error(error);
|
|
process.exit(1);
|
|
}
|
|
})();
|