football-assets.ts (53 lines of code) (raw):

import sharp from 'sharp'; import fs from 'fs/promises'; import { join } from 'path'; import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'; const shouldUpload = process.argv.includes('--upload'); const processFile = async (file: string) => { const contents = await fs.readFile(`source/crests/${file}`); sharp(contents).resize({ width: 120 }).png({ quality: 50}).toFile(`build/crests/120/${file}`); sharp(contents).resize({ width: 60 }).png({ quality: 50}).toFile(`build/crests/60/${file}`); }; const walk = async (path: string): Promise<string[]> => { let files: string[] = []; for (const file of await fs.readdir(path)) { // Don't include hidden files if (file.startsWith('.')) { continue; } const newFile = join(path, file); const isDirectory = (await fs.stat(newFile)).isDirectory(); const newFiles = isDirectory ? await walk(newFile) : [newFile]; files.push(...newFiles); } return files; }; const upload = async (s3: S3Client, path: string) => { const command = new PutObjectCommand({ Bucket: 'aws-frontend-sport', Key: join('football', path.substring(6)), // substring(6) - Remove `build/` prefix. Body: await fs.readFile(path), }); await s3.send(command); }; const startTime = Date.now(); console.log('🗑️ clearing old build files!'); await fs.rm('build', { recursive: true, force: true }); console.log('📁 creating output folders.'); await fs.mkdir('build/crests/120', { recursive: true }); await fs.mkdir('build/crests/60', { recursive: true }); console.log('📋 copying source files to output folder.'); await fs.cp('source', 'build', { recursive: true }); console.log('🪄 compressing and resizing images.'); const imageFiles = (await fs.readdir('source/crests/')) .filter((file) => file.endsWith('.png')) .map(processFile); await Promise.all(imageFiles); if (shouldUpload) { console.log('🪣 uploading files to S3 bucket.'); const s3 = new S3Client({ region: 'eu-west-1', }); const filesToUpload = await walk('build'); await Promise.all(filesToUpload.map((file) => upload(s3, file))); } console.log(`✨ done in ${Date.now() - startTime}ms`);