You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

73 lines
2.1 KiB

#!/usr/bin/env node
// Script to download and self-host Google Fonts
// This improves performance and privacy
import { mkdir, writeFile } from 'fs/promises';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const FONT_URL = 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap';
const FONTS_DIR = join(__dirname, '..', 'src', 'assets', 'fonts', 'inter');
async function downloadFont() {
console.log('Downloading Inter font family...');
try {
// Create fonts directory
await mkdir(FONTS_DIR, { recursive: true });
// Fetch the CSS
const response = await fetch(FONT_URL, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
});
let css = await response.text();
// Extract font URLs
const fontUrls = css.match(/url\((https:\/\/[^)]+)\)/g);
if (!fontUrls) {
console.error('No font URLs found in CSS');
return;
}
// Download each font file
for (const urlMatch of fontUrls) {
const url = urlMatch.match(/url\((https:\/\/[^)]+)\)/)[1];
const filename = url.split('/').pop().split('?')[0];
console.log(`Downloading ${filename}...`);
const fontResponse = await fetch(url);
const fontBuffer = await fontResponse.arrayBuffer();
await writeFile(
join(FONTS_DIR, filename),
Buffer.from(fontBuffer)
);
// Update CSS to use local path
css = css.replace(url, `/assets/fonts/inter/${filename}`);
}
// Save the updated CSS
const cssPath = join(__dirname, '..', 'src', 'scss', '_fonts.scss');
await writeFile(cssPath, css);
console.log('✅ Fonts downloaded successfully!');
console.log(`📁 Font files saved to: ${FONTS_DIR}`);
console.log(`📄 CSS saved to: ${cssPath}`);
console.log('\nUpdate your main.scss to import _fonts.scss instead of the Google Fonts URL');
} catch (error) {
console.error('Error downloading fonts:', error);
}
}
downloadFont();