summaryrefslogtreecommitdiff
path: root/packages/integrations/vercel/src/image/dev-service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/vercel/src/image/dev-service.ts')
-rw-r--r--packages/integrations/vercel/src/image/dev-service.ts43
1 files changed, 8 insertions, 35 deletions
diff --git a/packages/integrations/vercel/src/image/dev-service.ts b/packages/integrations/vercel/src/image/dev-service.ts
index a335c8d23..c9702cff9 100644
--- a/packages/integrations/vercel/src/image/dev-service.ts
+++ b/packages/integrations/vercel/src/image/dev-service.ts
@@ -1,10 +1,9 @@
import type { LocalImageService } from 'astro';
-import squooshService from 'astro/assets/services/squoosh';
-import { sharedValidateOptions } from './shared.js';
+import sharpService from 'astro/assets/services/sharp';
+import { baseDevService } from './shared-dev-service.js';
const service: LocalImageService = {
- validateOptions: (options, serviceOptions) =>
- sharedValidateOptions(options, serviceOptions.service.config, 'development'),
+ ...baseDevService,
getHTMLAttributes(options, serviceOptions) {
const { inputtedWidth, ...props } = options;
@@ -13,45 +12,19 @@ const service: LocalImageService = {
props.width = inputtedWidth;
}
- return squooshService.getHTMLAttributes
- ? squooshService.getHTMLAttributes(props, serviceOptions)
+ return sharpService.getHTMLAttributes
+ ? sharpService.getHTMLAttributes(props, serviceOptions)
: {};
},
- getURL(options) {
- const fileSrc = typeof options.src === 'string' ? options.src : options.src.src;
-
- const searchParams = new URLSearchParams();
- searchParams.append('href', fileSrc);
-
- options.width && searchParams.append('w', options.width.toString());
- options.quality && searchParams.append('q', options.quality.toString());
-
- return '/_image?' + searchParams;
- },
- parseURL(url) {
- const params = url.searchParams;
-
- if (!params.has('href')) {
- return undefined;
- }
-
- const transform = {
- src: params.get('href')!,
- width: params.has('w') ? parseInt(params.get('w')!) : undefined,
- quality: params.get('q'),
- };
-
- return transform;
- },
transform(inputBuffer, transform, serviceOptions) {
// NOTE: Hardcoding webp here isn't accurate to how the Vercel Image Optimization API works, normally what we should
// do is setup a custom endpoint that sniff the user's accept-content header and serve the proper format based on the
// user's Vercel config. However, that's: a lot of work for: not much. The dev service is inaccurate to the prod service
// in many more ways, this is one of the less offending cases and is, imo, okay, erika - 2023-04-27
- transform.format = 'webp';
+ transform.format = transform.src.endsWith('svg') ? 'svg' : 'webp';
- // The base Squoosh service works the same way as the Vercel Image Optimization API, so it's a safe fallback in local
- return squooshService.transform(inputBuffer, transform, serviceOptions);
+ // The base sharp service works the same way as the Vercel Image Optimization API, so it's a safe fallback in local
+ return sharpService.transform(inputBuffer, transform, serviceOptions);
},
};