From 7b04c35c946e0fc746eb23b7dbd8f5fe22757ce2 Mon Sep 17 00:00:00 2001 From: sophie Date: Fri, 30 Aug 2024 03:51:53 +0300 Subject: [PATCH] image optimization --- bun.lockb | Bin 15758 -> 27494 bytes package.json | 9 ++--- src/index.ts | 33 ++++++++++++++----- src/plugins/compile-time-js.ts | 2 +- src/plugins/dev.ts | 5 ++- src/plugins/image-optimization.ts | 53 ++++++++++++++++++++++++++++++ src/plugins/variables.ts | 1 - 7 files changed, 85 insertions(+), 18 deletions(-) create mode 100644 src/plugins/image-optimization.ts diff --git a/bun.lockb b/bun.lockb index 3e59b1ff7ec569b21506fca725f1c92d6b61a696..6fd14661a0196aa5f4747e2bf5c89e574a5e0341 100755 GIT binary patch literal 27494 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 X#3erf@DfnDA^X6?epm4S-+%ufM3f{h literal 15758 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 + ): Promise; } import * as fs from "fs"; @@ -35,13 +36,14 @@ export default class SSSG { } async build() { - for(const plugin of this.plugins) { - if(plugin.build) { + console.time("Building.."); + for (const plugin of this.plugins) { + if (plugin.build) { plugin.build(); } } try { - fs.rmSync(this.outputFolder, {recursive: true}); + fs.rmSync(this.outputFolder, { recursive: true }); } catch {} const sourceFiles = fs.readdirSync(this.inputFolder, { @@ -66,7 +68,6 @@ export default class SSSG { z.rewriteTriggers.includes(type) ); - if (availablePlugins.length == 0) { const oldPath = path.join(file.parentPath, file.name); fs.cpSync( @@ -82,12 +83,20 @@ export default class SSSG { file.parentPath, shortname + "." + - (plugin.rewriteTriggers.includes("*") ? type : plugin.renameTo) + (plugin.rewriteTriggers.includes("*") || plugin.renameTo == "keep" + ? type + : plugin.renameTo) ) .replace(this.inputFolder, this.outputFolder); - let data = fs.readFileSync(oldPath).toString("utf8"); + let data: string | Buffer = fs.readFileSync(oldPath); + + if (!plugin.isBinary) { + data = data.toString("utf8"); + } for await (const globalPlugin of globalPlugins) { + if (!globalPlugin.isBinary && plugin.isBinary) continue; + const rewritten = await globalPlugin.rewriteFile(data, oldPath); if (!rewritten) continue; data = rewritten; @@ -98,8 +107,14 @@ export default class SSSG { if (!rewrite) continue; fs.mkdirSync(path.dirname(newPath), { recursive: true }); - fs.writeFileSync(newPath, rewrite); + fs.writeFileSync( + newPath, + plugin.isBinary + ? new Uint8Array(rewrite as Buffer) + : (rewrite as string) + ); } } + console.timeEnd("Building.."); } } diff --git a/src/plugins/compile-time-js.ts b/src/plugins/compile-time-js.ts index 0ffcbe3..962e3e6 100644 --- a/src/plugins/compile-time-js.ts +++ b/src/plugins/compile-time-js.ts @@ -5,7 +5,7 @@ export default class CompileTimeJS extends Plugin { rewriteTriggers = ["html", "*"] longLasting = false; build = undefined; - + async rewriteFile(file: string, filePath: string): Promise { let input = file; const regex = /{&(.+)&}/gms; diff --git a/src/plugins/dev.ts b/src/plugins/dev.ts index f027aba..d8eef98 100644 --- a/src/plugins/dev.ts +++ b/src/plugins/dev.ts @@ -3,7 +3,7 @@ import SSSG, { Plugin } from ".."; import * as fs from "fs"; import mime from "mime-types"; -const script = `let reconnectTimeout;function connect(){console.log("[--dev] connecting to dev server");let ws=new WebSocket("ws://localhost:8080");ws.addEventListener("message",message=>{if(message.data=="refresh"){location.reload()}});ws.addEventListener("open",()=>{console.log("[--dev] connected")});ws.addEventListener("close",()=>{console.log("[--dev] socket closed, restarting in 1s");clearTimeout(reconnectTimeout);reconnectTimeout=setTimeout(()=>{connect()},1e3)})}window.addEventListener("load",()=>connect());`; +const script = `let reconnectTimeout,waitingForReconnect=!1;function connect(){console.log("[dev] connecting to dev server");var e=new WebSocket("ws://localhost:8080");e.addEventListener("message",e=>{"refresh"==e.data&&location.reload()}),e.addEventListener("open",()=>{console.log("[dev] connected"),waitingForReconnect&&location.reload()}),e.addEventListener("close",()=>{console.log("[dev] socket closed, restarting in 1s"),clearTimeout(reconnectTimeout),reconnectTimeout=setTimeout(()=>{connect(),waitingForReconnect=!0},1e3)})}window.addEventListener("load",()=>connect());`; export default class DevPlugin extends Plugin { build: undefined; @@ -14,10 +14,9 @@ export default class DevPlugin extends Plugin { longLasting = true; server!: Server; allConnections: ServerWebSocket[] = []; - + constructor(sssg: SSSG) { super(); - if (!process.argv.includes("--dev")) return; fs.watch( sssg.inputFolder, diff --git a/src/plugins/image-optimization.ts b/src/plugins/image-optimization.ts new file mode 100644 index 0000000..d4fc641 --- /dev/null +++ b/src/plugins/image-optimization.ts @@ -0,0 +1,53 @@ +import { Plugin } from ".."; +import sharp from "sharp"; + +export default class ImageOptimization extends Plugin { + build: undefined; + + name = "image-optimization"; + rewriteTriggers = ["png", "gif", "jpg", "jpeg", "webp", "avif"]; + renameTo = "keep"; + isBinary = true; + longLasting = false; + + logging = true; + + constructor(logging = true) { + super(); + this.logging = logging; + } + + async rewriteFile(file: Buffer, filePath: string) { + const nonOptimized = file; + + const type = filePath.split(".").at(-1); + let data: Buffer = file; + if (type == "webp") { + data = await sharp(file).webp({ lossless: true }).toBuffer(); + } + if (type == "avif") { + data = await sharp(file).avif({ lossless: true }).toBuffer(); + } + if (type == "jpg" || type == "jpeg") { + data = await sharp(file).jpeg({ quality: 100 }).toBuffer(); + } + if (type == "png") { + data = await sharp(file).png({ quality: 100 }).toBuffer(); + } + if (type == "gif") { + // not heavy optimizations, not a fan tbf, but whatever :shrug: + data = await sharp(file, { animated: true }) + .gif({ colors: 16 }) + .toBuffer(); + } + + if(nonOptimized.byteLength < data.byteLength) { + if(this.logging) { + console.log("❌ " + filePath + "("+nonOptimized.byteLength+"B) optimized was " + data.byteLength + "B. It has been skipped."); + } + data = nonOptimized; + } + + return data; + } +} diff --git a/src/plugins/variables.ts b/src/plugins/variables.ts index f3f8334..bc940da 100644 --- a/src/plugins/variables.ts +++ b/src/plugins/variables.ts @@ -1,7 +1,6 @@ import { Plugin } from ".."; export default class Variables extends Plugin { - name = "variables"; rewriteTriggers = ["html", "*"]; renameTo = undefined;