From ac520a6e65a1d6319aa58d670c6ff0d40cd1d3e9 Mon Sep 17 00:00:00 2001 From: babayaga Date: Wed, 27 Aug 2025 21:12:10 +0200 Subject: [PATCH] img tools - cache --- packages/imagetools/plugin/hooks/load.js | 7 ++- packages/imagetools_3/api/utils/getImage.js | 8 +-- .../api/utils/getProcessedImage.js | 30 ++++++---- packages/imagetools_3/api/utils/getSrcPath.js | 4 ++ packages/imagetools_3/api/utils/getSrcset.js | 7 +-- .../api/utils/throwErrorIfUnsupported.js | 1 + .../imagetools_3/astro-imagetools.config.mjs | 20 +++++++ packages/imagetools_3/astroViteConfigs.js | 6 +- .../integration/utils/saveAndCopyAsset.js | 1 - packages/imagetools_3/package.json | 3 +- .../imagetools_3/public/images/default.png | Bin 0 -> 60956 bytes packages/imagetools_3/tests/commons.js | 56 +++++++++++------- packages/imagetools_3/tests/image.js | 44 ++++++++++++++ packages/imagetools_3/vitest.config.ts | 2 +- 14 files changed, 140 insertions(+), 49 deletions(-) create mode 100644 packages/imagetools_3/astro-imagetools.config.mjs create mode 100644 packages/imagetools_3/public/images/default.png create mode 100644 packages/imagetools_3/tests/image.js diff --git a/packages/imagetools/plugin/hooks/load.js b/packages/imagetools/plugin/hooks/load.js index 635f788..f09d5b7 100644 --- a/packages/imagetools/plugin/hooks/load.js +++ b/packages/imagetools/plugin/hooks/load.js @@ -19,12 +19,13 @@ export default async function load(id) { const { search, searchParams } = fileURL; - + id = id.replace(search, ""); - + const ext = path.extname(id).slice(1); - + if (!supportedImageTypes.includes(ext)) return null; + debugger const { default: astroViteConfigs } = await import( // @ts-ignore diff --git a/packages/imagetools_3/api/utils/getImage.js b/packages/imagetools_3/api/utils/getImage.js index a51b367..c857a87 100644 --- a/packages/imagetools_3/api/utils/getImage.js +++ b/packages/imagetools_3/api/utils/getImage.js @@ -33,6 +33,7 @@ export default async function ({ transformConfigs, }) { try { + const args = Array.from(arguments); const hash = objectHash(args); @@ -41,11 +42,6 @@ export default async function ({ return imagesData.get(hash); } - // Caching removed from this level to ensure proper Vite store population - // Cache is now handled at the plugin level where it can properly manage the store - - const start = performance.now(); - const { path, base, @@ -119,6 +115,8 @@ export default async function ({ return returnObject; } catch (error) { console.error(`Error processing images:: ${src}`, error, error.stack); + debugger + throw error; } } diff --git a/packages/imagetools_3/api/utils/getProcessedImage.js b/packages/imagetools_3/api/utils/getProcessedImage.js index 4cc14cd..08a86b3 100644 --- a/packages/imagetools_3/api/utils/getProcessedImage.js +++ b/packages/imagetools_3/api/utils/getProcessedImage.js @@ -1,6 +1,8 @@ // @ts-check -import { fileURLToPath } from "node:url"; -import { extname, relative, resolve } from "node:path"; +import { fileURLToPath, URL } from "node:url"; +import { extname, relative, resolve, join } from "node:path"; +import fs from "node:fs/promises"; +import { existsSync } from "node:fs"; import { getSrcPath } from "./getSrcPath.js"; import getResolvedSrc from "./getResolvedSrc.js"; @@ -16,7 +18,14 @@ export default async function getProcessedImage( transformConfigs, { skipCache = false } = {} ) { - throwErrorIfUnsupported(src, extname(src).slice(1)); + const isRemote = src.startsWith("http"); + + const ext = isRemote + ? extname(new URL(src).pathname).slice(1) + : extname(src).slice(1); + + throwErrorIfUnsupported(src, ext); + let base; if (src.match("(http://|https://|data:image/).*")) { @@ -44,15 +53,14 @@ export default async function getProcessedImage( ...rest } = transformConfigs; - const path = src.replace(/\\/g, `/`); + let path = src.replace(/\\/g, `/`); - const { image, imageWidth, imageHeight, imageFormat } = await getImageDetails( - await getSrcPath(src), - width, - height, - aspect, - skipCache - ); + let imagePath = isRemote ? join(cwd, path) : await getSrcPath(src); + + const imageBuffer = await fs.readFile(imagePath); + + const { image, imageWidth, imageHeight, imageFormat } = + await getImageDetails(imageBuffer, width, height, aspect, skipCache); return { path, diff --git a/packages/imagetools_3/api/utils/getSrcPath.js b/packages/imagetools_3/api/utils/getSrcPath.js index 3a7a7da..5c9c5af 100644 --- a/packages/imagetools_3/api/utils/getSrcPath.js +++ b/packages/imagetools_3/api/utils/getSrcPath.js @@ -27,6 +27,10 @@ export async function getSrcPath(src) { const publicTest = publicPath.replace(paramPattern, ""); if (fs.existsSync(publicTest)) return publicPath; + // @todo : remove this + const cwdTest = path.join(process.cwd(), src); + if (fs.existsSync(cwdTest)) return cwdTest; + // Fallback return src; } diff --git a/packages/imagetools_3/api/utils/getSrcset.js b/packages/imagetools_3/api/utils/getSrcset.js index 14b3bf5..75f411d 100644 --- a/packages/imagetools_3/api/utils/getSrcset.js +++ b/packages/imagetools_3/api/utils/getSrcset.js @@ -29,20 +29,19 @@ export default async function getSrcset( const [cleanSrc] = src.split("?"); const id = `${cleanSrc}?${params.slice(1)}`; - - const fullPath = await getSrcPath(id); - + const fullPath = await getSrcPath(cleanSrc); const { default: load } = await import("../../plugin/hooks/load.js"); // @ts-ignore let srcset = null try { + const loaded = await load(fullPath, base); if (loaded) { srcset = loaded.slice(16, -1); } } catch (error) { - console.error(`Error loading image ${fullPath}:`, error); + console.error(`getSrcset::Error loading image ${fullPath}:`, error.message); return null; } diff --git a/packages/imagetools_3/api/utils/throwErrorIfUnsupported.js b/packages/imagetools_3/api/utils/throwErrorIfUnsupported.js index 581ca16..5ef7e73 100644 --- a/packages/imagetools_3/api/utils/throwErrorIfUnsupported.js +++ b/packages/imagetools_3/api/utils/throwErrorIfUnsupported.js @@ -2,6 +2,7 @@ import { supportedImageTypes } from "../../utils/runtimeChecks.js"; export default function throwErrorIfUnsupported(src, ext) { + if (!ext && typeof ext !== "string") { throw new Error(`Failed to load ${src}; Invalid image format`); } diff --git a/packages/imagetools_3/astro-imagetools.config.mjs b/packages/imagetools_3/astro-imagetools.config.mjs new file mode 100644 index 0000000..f1d3193 --- /dev/null +++ b/packages/imagetools_3/astro-imagetools.config.mjs @@ -0,0 +1,20 @@ +import { defineConfig } from "imagetools/config" +// https://astro-imagetools-docs.vercel.app/en/global-config-options/ +export default defineConfig({ + placeholder: "blurred", + format: ["webp", "avif", "jpg"], + fallbackFormat: "jpg", + includeSourceFormat: false, + cacheRoot:".test_cache2", + formatOptions: { + jpg: { + quality: 80, + }, + png: { + quality: 80, + }, + webp: { + quality: 50, + } + } +}); \ No newline at end of file diff --git a/packages/imagetools_3/astroViteConfigs.js b/packages/imagetools_3/astroViteConfigs.js index 2f7b5cc..af59ac4 100644 --- a/packages/imagetools_3/astroViteConfigs.js +++ b/packages/imagetools_3/astroViteConfigs.js @@ -2,10 +2,10 @@ export default { "environment": "build", "isSsrBuild": false, "projectBase": "", - "publicDir": "C:\\Users\\zx\\Desktop\\polymech\\site2\\public\\", - "rootDir": "C:\\Users\\zx\\Desktop\\polymech\\site2\\", + "publicDir": "C:\\Users\\zx\\Desktop\\polymech\\site-min\\public\\", + "rootDir": "C:\\Users\\zx\\Desktop\\polymech\\site-min\\", "mode": "production", - "outDir": "C:\\Users\\zx\\Desktop\\polymech\\site2\\dist\\", + "outDir": "C:\\Users\\zx\\Desktop\\polymech\\site-min\\dist\\", "assetsDir": "_astro", "sourcemap": false, "assetFileNames": "/_astro/[name]@[width].[hash][extname]" diff --git a/packages/imagetools_3/integration/utils/saveAndCopyAsset.js b/packages/imagetools_3/integration/utils/saveAndCopyAsset.js index 8ab63ca..f075377 100644 --- a/packages/imagetools_3/integration/utils/saveAndCopyAsset.js +++ b/packages/imagetools_3/integration/utils/saveAndCopyAsset.js @@ -30,7 +30,6 @@ export async function saveAndCopyAsset( assetsDirExists = true; } - console.log(`cp ${src} ${dest}`); await fs.copyFile(src, dest).catch(async (error) => { if (error.code === "ENOENT") { const imageBuffer = buffer || (await image.toBuffer()); diff --git a/packages/imagetools_3/package.json b/packages/imagetools_3/package.json index d452f47..5919f56 100644 --- a/packages/imagetools_3/package.json +++ b/packages/imagetools_3/package.json @@ -14,7 +14,8 @@ "scripts": { "test:watch": "vitest", "test": "vitest run", - "test:src": "vitest run tests/src.js" + "test:src": "vitest run tests/src.js", + "test:image": "vitest run tests/image.js" }, "repository": { "type": "git", diff --git a/packages/imagetools_3/public/images/default.png b/packages/imagetools_3/public/images/default.png new file mode 100644 index 0000000000000000000000000000000000000000..48180db5d0b77b0b887654d6025b9a8cc1938336 GIT binary patch literal 60956 zcmd3O^1)f zP1O*JhK5Um`aD8Q&!hmpd<4~2Q9!F0qS*z0z_69qkViwSipRaRc!Gv@Q1wztUdQLr zpEkoXlkK#uHf!&>uiTJivG_dImo!Qm&)Bt|v8pA{*+|6A6A%@Q#-hnHV}HcJ77!Y- zXV8~_eB0EkO!P~YcMXkJXsv#}n$3tw_{$nYRKDuV%x(E^O1?WRQzWk{cx4ieqLy$xV76|oD(E*n9^~(nG<+Td(sO6czwY;O%M{@YQEefn_Bjz$i&pzD8&CSPsgcl_(-li~T_ zzw`5)H2vSz#s$d6{Oah#HOa6am6cz3)_*OC^)Td)U+Oc*T#O4d{Njc()bIBKYudzx3 zdcWm5=9rw+YhxJgfO>gD(<(V2=;CnxqUS7OteF>h*mjZI4`;#muQlBEbN|luEMFT3 zm%c!)dt|9Hm&(?=PW5o~aM!VRx{2%_4!W#i`F`DqeIvxYRk zcRwlQ3;fY|wUzPpc#Cp$5yo}k69Fh}TzV!^WJ{Ezo^gYYIla=fMbAIrw2!?TK_8r% zoraJwinrDH`cIFPuxYw+vXx%c#f0B;Z(=Rk*yVYVdYX2?Nwj&{f&RR<2MhVI(SJ~| z`V1hUL;h-uqD$^PTgtau%zZ;ugS!TAT>hisM`Pe)L{ObgdN$(d9DgM?{gq9F(`Go^ zR6R#V+L_s=^x{uI9co{+0C>)*^Oy%67q+`T6OwNaWvTs6n!$`WU^m)_%YV|6!j0VD z@nMeXdwI4Zy#EvbQVs9@$y#^!LK8IlWF0YW$v`~fRe(}R6+&U|oF(dIuY9swQgnuG zB&!?g^oW#+RZ~~%)D5A`zwcr`$M5E347cNDt~ny@mbQm#>S>FWGUm4(%B)qFGQ((Gqeq>e(v-VE<24f_&nk5{ zw`EFe6{jsj8SD3aA{(lY$$!)1Iqr_T2%`gUE(;H`rTs<3$JDLFF^Rz^gY}@!2#Y58 zoL4~Qox8eJ(EV9XvG1RFPv0poBBYeZ!W`eW$99%CnOZV8rF+f)j4TG9Y^;b~UI`{6 zI4Q_$+WZav+}CF5OboiE4gqAb!OQgpMEhQeW1smA<-gBoYTq88^rOkuUoH6`v4UYz%|MUS_0WRI_=j9oPpj6k?c%ywz)`eG837x3~+62~{_ zmN{qsHwO*lE8wB8>k73{Zkn%C#SYj9cKRUDB{OW5*^qq+e@{^v)Z?4w98`y4i zo#QlHV(d?4buPrhq36oNET6*lNUmb{eq~2?rUT7c-&gkH^|b)V24(6$zcH-)FzP;fq@wG6jDn`V6V$+1?S56+r2nvOXFj zBb^5=ztb|b>W(6PIl@!{YCRy@fAcjB%zZ}pIekGyE2%PIlk24v^Rezr4EZ*f#pc?h z9TSufwb=k1PyQ=2=};_%gwBA*p<$^rb$5%t$6WpjD5BE3G{zq*MWS~(m1O3EAnB%k31Un*@3ZX=T%qtRhO%}#j z!6AVGW-^5VtHE^Px-H(h9Owkf(`*BtFh2^;wiZ7Wf~`Pfhrwid+@Hkt{3wRw{V#^l zlhnAGIP`!0VHRmna4DT18_sv%nzA{bqG5%*AjLe|Vo2$(-P+ha(|A(hn|W z!aRbMu>J&1W4kV?g_QO{)5PLj+?XGkveiNn#;RfnmvG_8FmZT%?nUqlxnx3-LU*{}MC+ z+gW^$xDzse#s97CGY8D7=2_%Sqek@vwTKhP{W0Og OvRN|B3uy+bdTfaV_*PY3! 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 literal 0 HcmV?d00001 diff --git a/packages/imagetools_3/tests/commons.js b/packages/imagetools_3/tests/commons.js index 5561298..6cf469d 100644 --- a/packages/imagetools_3/tests/commons.js +++ b/packages/imagetools_3/tests/commons.js @@ -1,36 +1,52 @@ import fs from "node:fs"; import path from "node:path"; -import { vi } from "vitest"; -const testCachePath = path.join(process.cwd(), ".test_cache/"); +const testCachePath = path.join(process.cwd(), "test_cache/"); + +export const invalid_urls = ["https://example.com/non-existent-image.jpg"]; + +export const real_urls = [ + "https://picsum.photos/200/300", + "https://fastly.picsum.photos/id/343/200/300.jpg?hmac=_7ttvLezG-XONDvp0ILwQCv50ivQa_oewm7m6xV2uZA", + "https://assets.osr-plastic.org//products/sheetpress/cassandra-edczmax-rc2/media/gallery/latest_controller.jpg", + "https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=800&h=400&fit=crop", + "https://assets.osr-plastic.org//products/sheetpress/cassandra-edczmax-rc2/media/samples/30mm.jpg", + "https://assets.osr-plastic.org//products/sheetpress/cassandra-edczmax-rc2/media/samples/DSC05051.JPG", +]; + +export const default_options = { + format: ["webp", "avif", "jpg"], + formatOptions: { + jpg: { + quality: 80, + }, + png: { + quality: 80, + }, + webp: { + quality: 50, + }, + }, + placeholder: "blurred", + includeSourceFormat: false, + fallbackFormat: ["webp", "avif", "jpg"], + // cacheRoot: testCachePath, + sizes: (breakpoints) => { + const maxWidth = breakpoints[breakpoints.length - 1]; + return `(min-width: ${maxWidth}px) ${maxWidth}px, 100vw`; + }, +}; export function setup() { // Create a temporary cache directory for tests if (!fs.existsSync(testCachePath)) { fs.mkdirSync(testCachePath, { recursive: true }); } - - // Mock runtimeChecks to use the test cache path - vi.mock("../utils/runtimeChecks.js", () => ({ - cwd: process.cwd(), - fsCachePath: testCachePath, - supportedImageTypes: [ - "avif", - "jpeg", - "jpg", - "png", - "webp", - "heic", - "heif", - "tiff", - "gif", - ], - })); } export function teardown() { // Clean up the temporary cache directory if (fs.existsSync(testCachePath)) { - fs.rmSync(testCachePath, { recursive: true, force: true }); + // fs.rmSync(testCachePath, { recursive: true, force: true }); } } diff --git a/packages/imagetools_3/tests/image.js b/packages/imagetools_3/tests/image.js new file mode 100644 index 0000000..47ccf8b --- /dev/null +++ b/packages/imagetools_3/tests/image.js @@ -0,0 +1,44 @@ +import { describe, it, expect, beforeAll, afterAll, vi, beforeEach } from "vitest"; +import getImage from "../api/utils/getImage.js"; +import { + setup, + teardown, + invalid_urls, + real_urls, + default_options, +} from "./commons.js"; + +describe("getImage", () => { + beforeAll(() => setup()); + afterAll(teardown); + + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should return a default image for invalid URLs", async () => { + for (const src of invalid_urls) { + const result = await getImage({ + src, + ...default_options, + transformConfigs: {}, + }); + expect(result.images[0].sources[0].srcset).toContain("default"); + } + }, 20000); + + it("should process and return image data for valid URLs", async () => { + + for (const src of real_urls) { + const result = await getImage({ + src, + ...default_options, + transformConfigs: {}, + }); + expect(result).toHaveProperty("uuid"); + expect(result).toHaveProperty("images"); + expect(Array.isArray(result.images)).toBe(true); + expect(result.images.length).toBeGreaterThan(0); + } + }, 20000); +}); diff --git a/packages/imagetools_3/vitest.config.ts b/packages/imagetools_3/vitest.config.ts index 295c03c..58258f2 100644 --- a/packages/imagetools_3/vitest.config.ts +++ b/packages/imagetools_3/vitest.config.ts @@ -4,5 +4,5 @@ export default defineConfig({ test: { include: ["tests/**/*.js"], }, - root: ".", + root: ".", });