vite-imagetools
Advanced tools
+70
-21
| import path, { basename, extname } from 'node:path'; | ||
| import { join } from 'node:path/posix'; | ||
| import { statSync, mkdirSync, createReadStream } from 'node:fs'; | ||
| import { writeFile, readFile, opendir, stat, rm } from 'node:fs/promises'; | ||
| import { builtins, builtinOutputFormats, parseURL, extractEntries, resolveConfigs, generateTransforms, applyTransforms, urlFormat, getMetadata } from 'imagetools-core'; | ||
@@ -7,3 +10,2 @@ export * from 'imagetools-core'; | ||
| import { createHash } from 'node:crypto'; | ||
| import { statSync } from 'node:fs'; | ||
@@ -13,7 +15,6 @@ const createBasePath = (base) => { | ||
| }; | ||
| async function generateImageID(url, config, originalImage) { | ||
| async function generateImageID(url, config, imageBuffer) { | ||
| if (url.host) { | ||
| const baseURL = new URL(url.origin + url.pathname); | ||
| const buffer = await originalImage.toBuffer(); | ||
| return hash([baseURL.href, JSON.stringify(config), buffer]); | ||
| return hash([baseURL.href, JSON.stringify(config), imageBuffer]); | ||
| } | ||
@@ -40,3 +41,10 @@ // baseURL isn't a valid URL, but just a string used for an identifier | ||
| function imagetools(userOptions = {}) { | ||
| var _a, _b, _c, _d, _e; | ||
| const pluginOptions = { ...defaultOptions, ...userOptions }; | ||
| const cacheOptions = { | ||
| enabled: (_b = (_a = pluginOptions.cache) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true, | ||
| dir: (_d = (_c = pluginOptions.cache) === null || _c === void 0 ? void 0 : _c.dir) !== null && _d !== void 0 ? _d : './node_modules/.cache/imagetools', | ||
| retention: (_e = pluginOptions.cache) === null || _e === void 0 ? void 0 : _e.retention | ||
| }; | ||
| mkdirSync(`${cacheOptions.dir}`, { recursive: true }); | ||
| const filter = createFilter(pluginOptions.include, pluginOptions.exclude); | ||
@@ -58,6 +66,7 @@ const transformFactories = pluginOptions.extendTransforms ? pluginOptions.extendTransforms(builtins) : builtins; | ||
| async load(id) { | ||
| var _a, _b, _c, _d, _e, _f, _g; | ||
| var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; | ||
| if (!filter(id)) | ||
| return null; | ||
| const srcURL = parseURL(id); | ||
| const pathname = decodeURIComponent(srcURL.pathname); | ||
| // lazy loaders so that we can load the metadata in defaultDirectives if needed | ||
@@ -69,3 +78,3 @@ // but if there are no directives then we can just skip loading | ||
| return lazyImg; | ||
| return (lazyImg = sharp(decodeURIComponent(srcURL.pathname))); | ||
| return (lazyImg = sharp(pathname)); | ||
| }; | ||
@@ -110,14 +119,34 @@ let lazyMetadata; | ||
| }; | ||
| const imageBuffer = await img.clone().toBuffer(); | ||
| for (const config of imageConfigs) { | ||
| const { transforms } = generateTransforms(config, transformFactories, srcURL.searchParams, logger); | ||
| const { image, metadata } = await applyTransforms(transforms, img.clone(), pluginOptions.removeMetadata); | ||
| if (viteConfig.command === 'serve') { | ||
| const id = await generateImageID(srcURL, config, img); | ||
| generatedImages.set(id, image); | ||
| metadata.src = basePath + id; | ||
| const id = await generateImageID(srcURL, config, imageBuffer); | ||
| let image; | ||
| let metadata; | ||
| if (cacheOptions.enabled && ((_d = (_c = statSync(`${cacheOptions.dir}/${id}`, { throwIfNoEntry: false })) === null || _c === void 0 ? void 0 : _c.size) !== null && _d !== void 0 ? _d : 0) > 0) { | ||
| metadata = (await sharp(`${cacheOptions.dir}/${id}`).metadata()); | ||
| } | ||
| else { | ||
| const { transforms } = generateTransforms(config, transformFactories, srcURL.searchParams, logger); | ||
| const res = await applyTransforms(transforms, img, pluginOptions.removeMetadata); | ||
| metadata = res.metadata; | ||
| if (cacheOptions.enabled) { | ||
| await writeFile(`${cacheOptions.dir}/${id}`, await res.image.toBuffer()); | ||
| } | ||
| else { | ||
| image = res.image; | ||
| } | ||
| } | ||
| generatedImages.set(id, { image, metadata }); | ||
| if (directives.has('inline')) { | ||
| metadata.src = `data:image/${metadata.format};base64,${(image | ||
| ? await image.toBuffer() | ||
| : await readFile(`${cacheOptions.dir}/${id}`)).toString('base64')}`; | ||
| } | ||
| else if (viteConfig.command === 'serve') { | ||
| metadata.src = join((_f = (_e = viteConfig === null || viteConfig === void 0 ? void 0 : viteConfig.server) === null || _e === void 0 ? void 0 : _e.origin) !== null && _f !== void 0 ? _f : '', basePath) + id; | ||
| } | ||
| else { | ||
| const fileHandle = this.emitFile({ | ||
| name: basename(srcURL.pathname, extname(srcURL.pathname)) + `.${metadata.format}`, | ||
| source: await image.toBuffer(), | ||
| name: basename(pathname, extname(pathname)) + `.${metadata.format}`, | ||
| source: image ? await image.toBuffer() : await readFile(`${cacheOptions.dir}/${id}`), | ||
| type: 'asset' | ||
@@ -131,3 +160,3 @@ }); | ||
| let outputFormat = urlFormat(); | ||
| const asParam = (_c = directives.get('as')) === null || _c === void 0 ? void 0 : _c.split(':'); | ||
| const asParam = (_g = directives.get('as')) === null || _g === void 0 ? void 0 : _g.split(':'); | ||
| const as = asParam ? asParam[0] : undefined; | ||
@@ -141,4 +170,4 @@ for (const [key, format] of Object.entries(outputFormats)) { | ||
| return dataToEsm(await outputFormat(outputMetadatas), { | ||
| namedExports: (_f = (_d = pluginOptions.namedExports) !== null && _d !== void 0 ? _d : (_e = viteConfig.json) === null || _e === void 0 ? void 0 : _e.namedExports) !== null && _f !== void 0 ? _f : true, | ||
| compact: (_g = !!viteConfig.build.minify) !== null && _g !== void 0 ? _g : false, | ||
| namedExports: (_k = (_h = pluginOptions.namedExports) !== null && _h !== void 0 ? _h : (_j = viteConfig.json) === null || _j === void 0 ? void 0 : _j.namedExports) !== null && _k !== void 0 ? _k : true, | ||
| compact: (_l = !!viteConfig.build.minify) !== null && _l !== void 0 ? _l : false, | ||
| preferConst: true | ||
@@ -149,8 +178,12 @@ }); | ||
| server.middlewares.use((req, res, next) => { | ||
| var _a; | ||
| var _a, _b; | ||
| if ((_a = req.url) === null || _a === void 0 ? void 0 : _a.startsWith(basePath)) { | ||
| const [, id] = req.url.split(basePath); | ||
| const image = generatedImages.get(id); | ||
| if (!image) | ||
| const { image, metadata } = (_b = generatedImages.get(id)) !== null && _b !== void 0 ? _b : {}; | ||
| if (!metadata) | ||
| throw new Error(`vite-imagetools cannot find image with id "${id}" this is likely an internal error`); | ||
| if (!image) { | ||
| res.setHeader('Content-Type', `image/${metadata.format}`); | ||
| return createReadStream(`${cacheOptions.dir}/${id}`).pipe(res); | ||
| } | ||
| if (pluginOptions.removeMetadata === false) { | ||
@@ -160,3 +193,2 @@ image.withMetadata(); | ||
| res.setHeader('Content-Type', `image/${getMetadata(image, 'format')}`); | ||
| res.setHeader('Cache-Control', 'max-age=360000'); | ||
| return image.clone().pipe(res); | ||
@@ -166,2 +198,19 @@ } | ||
| }); | ||
| }, | ||
| async buildEnd(error) { | ||
| if (!error && cacheOptions.enabled && cacheOptions.retention !== undefined && viteConfig.command !== 'serve') { | ||
| const dir = await opendir(cacheOptions.dir); | ||
| for await (const dirent of dir) { | ||
| if (dirent.isFile()) { | ||
| if (generatedImages.has(dirent.name)) | ||
| continue; | ||
| const imagePath = `${cacheOptions.dir}/${dirent.name}`; | ||
| const stats = await stat(imagePath); | ||
| if (Date.now() - stats.mtimeMs > cacheOptions.retention * 1000) { | ||
| console.debug(`deleting stale cached image ${dirent.name}`); | ||
| await rm(imagePath); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
@@ -168,0 +217,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport path from 'node:path'\nimport { statSync } from 'node:fs'\nimport type { ImageConfig } from 'imagetools-core'\nimport type { Sharp } from 'sharp'\n\nexport const createBasePath = (base?: string) => {\n return (base?.replace(/\\/$/, '') || '') + '/@imagetools/'\n}\n\nexport async function generateImageID(url: URL, config: ImageConfig, originalImage: Sharp) {\n if (url.host) {\n const baseURL = new URL(url.origin + url.pathname)\n const buffer = await originalImage.toBuffer()\n return hash([baseURL.href, JSON.stringify(config), buffer])\n }\n\n // baseURL isn't a valid URL, but just a string used for an identifier\n // use a relative path in the local case so that it's consistent across machines\n const baseURL = new URL(url.protocol + path.relative(process.cwd(), url.pathname))\n const { mtime } = statSync(path.resolve(process.cwd(), decodeURIComponent(url.pathname)))\n return hash([baseURL.href, JSON.stringify(config), mtime.getTime().toString()])\n}\n\nfunction hash(keyParts: Array<string | NodeJS.ArrayBufferView>) {\n let hash = createHash('sha1')\n for (const keyPart of keyParts) {\n hash = hash.update(keyPart)\n }\n return hash.digest('hex')\n}\n","import { basename, extname } from 'node:path'\nimport type { Plugin, ResolvedConfig } from 'vite'\nimport {\n applyTransforms,\n builtins,\n builtinOutputFormats,\n extractEntries,\n generateTransforms,\n getMetadata,\n parseURL,\n urlFormat,\n resolveConfigs,\n type Logger,\n type OutputFormat,\n type ProcessedImageMetadata\n} from 'imagetools-core'\nimport { createFilter, dataToEsm } from '@rollup/pluginutils'\nimport sharp, { type Metadata, type Sharp } from 'sharp'\nimport { createBasePath, generateImageID } from './utils.js'\nimport type { VitePluginOptions } from './types.js'\n\nexport type {\n Include,\n Exclude,\n DefaultDirectives,\n ExtendTransforms,\n ExtendOutputFormats,\n ResolveConfigs,\n VitePluginOptions\n} from './types.js'\n\nconst defaultOptions: VitePluginOptions = {\n include: /^[^?]+\\.(avif|gif|heif|jpeg|jpg|png|tiff|webp)(\\?.*)?$/,\n exclude: 'public/**/*',\n removeMetadata: true\n}\n\nexport * from 'imagetools-core'\n\nexport function imagetools(userOptions: Partial<VitePluginOptions> = {}): Plugin {\n const pluginOptions: VitePluginOptions = { ...defaultOptions, ...userOptions }\n\n const filter = createFilter(pluginOptions.include, pluginOptions.exclude)\n\n const transformFactories = pluginOptions.extendTransforms ? pluginOptions.extendTransforms(builtins) : builtins\n\n const outputFormats: Record<string, OutputFormat> = pluginOptions.extendOutputFormats\n ? pluginOptions.extendOutputFormats(builtinOutputFormats)\n : builtinOutputFormats\n\n let viteConfig: ResolvedConfig\n let basePath: string\n\n const generatedImages = new Map<string, Sharp>()\n\n return {\n name: 'imagetools',\n enforce: 'pre',\n configResolved(cfg) {\n viteConfig = cfg\n basePath = createBasePath(viteConfig.base)\n },\n async load(id) {\n if (!filter(id)) return null\n\n const srcURL = parseURL(id)\n\n // lazy loaders so that we can load the metadata in defaultDirectives if needed\n // but if there are no directives then we can just skip loading\n let lazyImg: Sharp\n const lazyLoadImage = () => {\n if (lazyImg) return lazyImg\n return (lazyImg = sharp(decodeURIComponent(srcURL.pathname)))\n }\n\n let lazyMetadata: Metadata\n const lazyLoadMetadata = async () => {\n if (lazyMetadata) return lazyMetadata\n return (lazyMetadata = await lazyLoadImage().metadata())\n }\n\n const defaultDirectives =\n typeof pluginOptions.defaultDirectives === 'function'\n ? await pluginOptions.defaultDirectives(srcURL, lazyLoadMetadata)\n : pluginOptions.defaultDirectives || new URLSearchParams()\n const directives = new URLSearchParams({\n ...Object.fromEntries(defaultDirectives),\n ...Object.fromEntries(srcURL.searchParams)\n })\n\n if (!directives.toString()) return null\n\n const img = lazyLoadImage()\n const widthParam = directives.get('w')\n const heightParam = directives.get('h')\n if (directives.get('allowUpscale') !== 'true' && (widthParam || heightParam)) {\n const metadata = await lazyLoadMetadata()\n const clamp = (s: string, intrinsic: number) =>\n [...new Set(s.split(';').map((d): string => (parseInt(d) <= intrinsic ? d : intrinsic.toString())))].join(';')\n\n if (widthParam) {\n const intrinsicWidth = metadata.width || 0\n directives.set('w', clamp(widthParam, intrinsicWidth))\n }\n\n if (heightParam) {\n const intrinsicHeight = metadata.height || 0\n directives.set('h', clamp(heightParam, intrinsicHeight))\n }\n }\n\n const parameters = extractEntries(directives)\n const imageConfigs =\n pluginOptions.resolveConfigs?.(parameters, outputFormats) ?? resolveConfigs(parameters, outputFormats)\n\n const outputMetadatas: Array<ProcessedImageMetadata> = []\n\n const logger: Logger = {\n info: (msg) => viteConfig.logger.info(msg),\n warn: (msg) => this.warn(msg),\n error: (msg) => this.error(msg)\n }\n\n for (const config of imageConfigs) {\n const { transforms } = generateTransforms(config, transformFactories, srcURL.searchParams, logger)\n const { image, metadata } = await applyTransforms(transforms, img.clone(), pluginOptions.removeMetadata)\n\n if (viteConfig.command === 'serve') {\n const id = await generateImageID(srcURL, config, img)\n generatedImages.set(id, image)\n metadata.src = basePath + id\n } else {\n const fileHandle = this.emitFile({\n name: basename(srcURL.pathname, extname(srcURL.pathname)) + `.${metadata.format}`,\n source: await image.toBuffer(),\n type: 'asset'\n })\n\n metadata.src = `__VITE_ASSET__${fileHandle}__`\n }\n\n metadata.image = image\n\n outputMetadatas.push(metadata as ProcessedImageMetadata)\n }\n\n let outputFormat = urlFormat()\n const asParam = directives.get('as')?.split(':')\n const as = asParam ? asParam[0] : undefined\n for (const [key, format] of Object.entries(outputFormats)) {\n if (as === key) {\n outputFormat = format(asParam && asParam[1] ? asParam[1].split(';') : undefined)\n break\n }\n }\n\n return dataToEsm(await outputFormat(outputMetadatas), {\n namedExports: pluginOptions.namedExports ?? viteConfig.json?.namedExports ?? true,\n compact: !!viteConfig.build.minify ?? false,\n preferConst: true\n })\n },\n\n configureServer(server) {\n server.middlewares.use((req, res, next) => {\n if (req.url?.startsWith(basePath)) {\n const [, id] = req.url.split(basePath)\n\n const image = generatedImages.get(id)\n\n if (!image)\n throw new Error(`vite-imagetools cannot find image with id \"${id}\" this is likely an internal error`)\n\n if (pluginOptions.removeMetadata === false) {\n image.withMetadata()\n }\n\n res.setHeader('Content-Type', `image/${getMetadata(image, 'format')}`)\n res.setHeader('Cache-Control', 'max-age=360000')\n return image.clone().pipe(res)\n }\n\n next()\n })\n }\n }\n}\n"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport path from 'node:path'\nimport { statSync } from 'node:fs'\nimport type { ImageConfig } from 'imagetools-core'\n\nexport const createBasePath = (base?: string) => {\n return (base?.replace(/\\/$/, '') || '') + '/@imagetools/'\n}\n\nexport async function generateImageID(url: URL, config: ImageConfig, imageBuffer: Buffer) {\n if (url.host) {\n const baseURL = new URL(url.origin + url.pathname)\n return hash([baseURL.href, JSON.stringify(config), imageBuffer])\n }\n\n // baseURL isn't a valid URL, but just a string used for an identifier\n // use a relative path in the local case so that it's consistent across machines\n const baseURL = new URL(url.protocol + path.relative(process.cwd(), url.pathname))\n const { mtime } = statSync(path.resolve(process.cwd(), decodeURIComponent(url.pathname)))\n return hash([baseURL.href, JSON.stringify(config), mtime.getTime().toString()])\n}\n\nfunction hash(keyParts: Array<string | NodeJS.ArrayBufferView>) {\n let hash = createHash('sha1')\n for (const keyPart of keyParts) {\n hash = hash.update(keyPart)\n }\n return hash.digest('hex')\n}\n","import { basename, extname } from 'node:path'\nimport { join } from 'node:path/posix'\nimport { statSync, mkdirSync, createReadStream } from 'node:fs'\nimport { writeFile, readFile, opendir, stat, rm } from 'node:fs/promises'\nimport type { Plugin, ResolvedConfig } from 'vite'\nimport {\n applyTransforms,\n builtins,\n builtinOutputFormats,\n extractEntries,\n generateTransforms,\n getMetadata,\n parseURL,\n urlFormat,\n resolveConfigs,\n type Logger,\n type OutputFormat,\n type ProcessedImageMetadata,\n type ImageMetadata\n} from 'imagetools-core'\nimport { createFilter, dataToEsm } from '@rollup/pluginutils'\nimport sharp, { type Metadata, type Sharp } from 'sharp'\nimport { createBasePath, generateImageID } from './utils.js'\nimport type { VitePluginOptions } from './types.js'\n\nexport type {\n Include,\n Exclude,\n DefaultDirectives,\n ExtendTransforms,\n ExtendOutputFormats,\n ResolveConfigs,\n VitePluginOptions\n} from './types.js'\n\nconst defaultOptions: VitePluginOptions = {\n include: /^[^?]+\\.(avif|gif|heif|jpeg|jpg|png|tiff|webp)(\\?.*)?$/,\n exclude: 'public/**/*',\n removeMetadata: true\n}\n\nexport * from 'imagetools-core'\n\nexport function imagetools(userOptions: Partial<VitePluginOptions> = {}): Plugin {\n const pluginOptions: VitePluginOptions = { ...defaultOptions, ...userOptions }\n\n const cacheOptions = {\n enabled: pluginOptions.cache?.enabled ?? true,\n dir: pluginOptions.cache?.dir ?? './node_modules/.cache/imagetools',\n retention: pluginOptions.cache?.retention\n }\n mkdirSync(`${cacheOptions.dir}`, { recursive: true })\n\n const filter = createFilter(pluginOptions.include, pluginOptions.exclude)\n\n const transformFactories = pluginOptions.extendTransforms ? pluginOptions.extendTransforms(builtins) : builtins\n\n const outputFormats: Record<string, OutputFormat> = pluginOptions.extendOutputFormats\n ? pluginOptions.extendOutputFormats(builtinOutputFormats)\n : builtinOutputFormats\n\n let viteConfig: ResolvedConfig\n let basePath: string\n\n const generatedImages = new Map<string, { image?: Sharp; metadata: ImageMetadata }>()\n\n return {\n name: 'imagetools',\n enforce: 'pre',\n configResolved(cfg) {\n viteConfig = cfg\n basePath = createBasePath(viteConfig.base)\n },\n async load(id) {\n if (!filter(id)) return null\n\n const srcURL = parseURL(id)\n const pathname = decodeURIComponent(srcURL.pathname)\n\n // lazy loaders so that we can load the metadata in defaultDirectives if needed\n // but if there are no directives then we can just skip loading\n let lazyImg: Sharp\n const lazyLoadImage = () => {\n if (lazyImg) return lazyImg\n return (lazyImg = sharp(pathname))\n }\n\n let lazyMetadata: Metadata\n const lazyLoadMetadata = async () => {\n if (lazyMetadata) return lazyMetadata\n return (lazyMetadata = await lazyLoadImage().metadata())\n }\n\n const defaultDirectives =\n typeof pluginOptions.defaultDirectives === 'function'\n ? await pluginOptions.defaultDirectives(srcURL, lazyLoadMetadata)\n : pluginOptions.defaultDirectives || new URLSearchParams()\n const directives = new URLSearchParams({\n ...Object.fromEntries(defaultDirectives),\n ...Object.fromEntries(srcURL.searchParams)\n })\n\n if (!directives.toString()) return null\n\n const img = lazyLoadImage()\n const widthParam = directives.get('w')\n const heightParam = directives.get('h')\n if (directives.get('allowUpscale') !== 'true' && (widthParam || heightParam)) {\n const metadata = await lazyLoadMetadata()\n const clamp = (s: string, intrinsic: number) =>\n [...new Set(s.split(';').map((d): string => (parseInt(d) <= intrinsic ? d : intrinsic.toString())))].join(';')\n\n if (widthParam) {\n const intrinsicWidth = metadata.width || 0\n directives.set('w', clamp(widthParam, intrinsicWidth))\n }\n\n if (heightParam) {\n const intrinsicHeight = metadata.height || 0\n directives.set('h', clamp(heightParam, intrinsicHeight))\n }\n }\n\n const parameters = extractEntries(directives)\n const imageConfigs =\n pluginOptions.resolveConfigs?.(parameters, outputFormats) ?? resolveConfigs(parameters, outputFormats)\n\n const outputMetadatas: Array<ProcessedImageMetadata> = []\n\n const logger: Logger = {\n info: (msg) => viteConfig.logger.info(msg),\n warn: (msg) => this.warn(msg),\n error: (msg) => this.error(msg)\n }\n\n const imageBuffer = await img.clone().toBuffer()\n\n for (const config of imageConfigs) {\n const id = await generateImageID(srcURL, config, imageBuffer)\n let image: Sharp | undefined\n let metadata: ImageMetadata\n\n if (cacheOptions.enabled && (statSync(`${cacheOptions.dir}/${id}`, { throwIfNoEntry: false })?.size ?? 0) > 0) {\n metadata = (await sharp(`${cacheOptions.dir}/${id}`).metadata()) as ImageMetadata\n } else {\n const { transforms } = generateTransforms(config, transformFactories, srcURL.searchParams, logger)\n const res = await applyTransforms(transforms, img, pluginOptions.removeMetadata)\n metadata = res.metadata\n if (cacheOptions.enabled) {\n await writeFile(`${cacheOptions.dir}/${id}`, await res.image.toBuffer())\n } else {\n image = res.image\n }\n }\n\n generatedImages.set(id, { image, metadata })\n\n if (directives.has('inline')) {\n metadata.src = `data:image/${metadata.format};base64,${(image\n ? await image.toBuffer()\n : await readFile(`${cacheOptions.dir}/${id}`)\n ).toString('base64')}`\n } else if (viteConfig.command === 'serve') {\n metadata.src = join(viteConfig?.server?.origin ?? '', basePath) + id\n } else {\n const fileHandle = this.emitFile({\n name: basename(pathname, extname(pathname)) + `.${metadata.format}`,\n source: image ? await image.toBuffer() : await readFile(`${cacheOptions.dir}/${id}`),\n type: 'asset'\n })\n\n metadata.src = `__VITE_ASSET__${fileHandle}__`\n }\n\n metadata.image = image\n\n outputMetadatas.push(metadata as ProcessedImageMetadata)\n }\n\n let outputFormat = urlFormat()\n const asParam = directives.get('as')?.split(':')\n const as = asParam ? asParam[0] : undefined\n for (const [key, format] of Object.entries(outputFormats)) {\n if (as === key) {\n outputFormat = format(asParam && asParam[1] ? asParam[1].split(';') : undefined)\n break\n }\n }\n\n return dataToEsm(await outputFormat(outputMetadatas), {\n namedExports: pluginOptions.namedExports ?? viteConfig.json?.namedExports ?? true,\n compact: !!viteConfig.build.minify ?? false,\n preferConst: true\n })\n },\n\n configureServer(server) {\n server.middlewares.use((req, res, next) => {\n if (req.url?.startsWith(basePath)) {\n const [, id] = req.url.split(basePath)\n\n const { image, metadata } = generatedImages.get(id) ?? {}\n\n if (!metadata)\n throw new Error(`vite-imagetools cannot find image with id \"${id}\" this is likely an internal error`)\n\n if (!image) {\n res.setHeader('Content-Type', `image/${metadata.format}`)\n return createReadStream(`${cacheOptions.dir}/${id}`).pipe(res)\n }\n\n if (pluginOptions.removeMetadata === false) {\n image.withMetadata()\n }\n\n res.setHeader('Content-Type', `image/${getMetadata(image, 'format')}`)\n return image.clone().pipe(res)\n }\n\n next()\n })\n },\n\n async buildEnd(error) {\n if (!error && cacheOptions.enabled && cacheOptions.retention !== undefined && viteConfig.command !== 'serve') {\n const dir = await opendir(cacheOptions.dir)\n\n for await (const dirent of dir) {\n if (dirent.isFile()) {\n if (generatedImages.has(dirent.name)) continue\n\n const imagePath = `${cacheOptions.dir}/${dirent.name}`\n const stats = await stat(imagePath)\n\n if (Date.now() - stats.mtimeMs > cacheOptions.retention * 1000) {\n console.debug(`deleting stale cached image ${dirent.name}`)\n await rm(imagePath)\n }\n }\n }\n }\n }\n }\n}\n"],"names":[],"mappings":"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"} |
+18
-0
@@ -77,3 +77,21 @@ import type { TransformFactory, OutputFormat, resolveConfigs } from 'imagetools-core'; | ||
| namedExports?: boolean; | ||
| /** | ||
| * Whether to cache transformed images and options for caching. | ||
| */ | ||
| cache?: CacheOptions; | ||
| } | ||
| export interface CacheOptions { | ||
| /** | ||
| * Should the image cache be enabled. Default is true | ||
| */ | ||
| enabled?: boolean; | ||
| /** | ||
| * Where should the cached images be stored. Default is './node_modules/.cache/imagetools' | ||
| */ | ||
| dir?: string; | ||
| /** | ||
| * For how many seconds to keep transformed images cached. Default is undefined, which keeps the images forever. | ||
| */ | ||
| retention?: number; | ||
| } | ||
| export {}; |
+2
-2
@@ -0,4 +1,4 @@ | ||
| /// <reference types="node" resolution-mode="require"/> | ||
| import type { ImageConfig } from 'imagetools-core'; | ||
| import type { Sharp } from 'sharp'; | ||
| export declare const createBasePath: (base?: string) => string; | ||
| export declare function generateImageID(url: URL, config: ImageConfig, originalImage: Sharp): Promise<string>; | ||
| export declare function generateImageID(url: URL, config: ImageConfig, imageBuffer: Buffer): Promise<string>; |
+10
-10
| { | ||
| "name": "vite-imagetools", | ||
| "description": "Load and transform images using a toolbox of import directives!", | ||
| "version": "6.2.9", | ||
| "version": "7.0.0", | ||
| "type": "module", | ||
@@ -29,7 +29,7 @@ "types": "dist/index.d.ts", | ||
| "engines": { | ||
| "node": ">=12.0.0" | ||
| "node": ">=18.0.0" | ||
| }, | ||
| "dependencies": { | ||
| "@rollup/pluginutils": "^5.0.5", | ||
| "imagetools-core": "^6.0.4" | ||
| "imagetools-core": "^7.0.0" | ||
| }, | ||
@@ -41,13 +41,13 @@ "devDependencies": { | ||
| "@types/picomatch": "^2.3.0", | ||
| "@vitest/coverage-v8": "^0.34.0", | ||
| "@vitest/coverage-v8": "^1.4.0", | ||
| "jest-image-snapshot": "^6.2.0", | ||
| "jsdom": "^23.0.0", | ||
| "picomatch": "^3.0.0", | ||
| "rollup": "^4.5.0", | ||
| "jsdom": "^24.0.0", | ||
| "picomatch": "^4.0.0", | ||
| "rollup": "^4.13.0", | ||
| "sharp": "^0.33.1", | ||
| "tslib": "^2.6.1", | ||
| "typescript": "^5.1.6", | ||
| "vite": "^5.0.5", | ||
| "vitest": "^0.34.0", | ||
| "imagetools-core": "^6.0.4" | ||
| "vite": "^5.2.6", | ||
| "vitest": "^1.4.0", | ||
| "imagetools-core": "^7.0.0" | ||
| }, | ||
@@ -54,0 +54,0 @@ "scripts": { |
43816
25.37%312
27.35%+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated