@@ -28,15 +28,15 @@ Astro는 로컬과 외부라는 두 가지 유형의 이미지 서비스를 제
2828
2929외부 서비스는 최종 ` <img> ` 태그의 ` src ` 속성으로 사용될 원격 URL을 가리킵니다. 이 원격 URL은 이미지 다운로드, 변환 및 반환을 담당합니다.
3030
31- ``` js
31+ ``` ts
3232import type { ExternalImageService , ImageTransform , AstroConfig } from " astro" ;
3333
3434const service: ExternalImageService = {
3535 validateOptions(options : ImageTransform , imageConfig : AstroConfig [' image' ]) {
3636 const serviceConfig = imageConfig .service .config ;
3737
3838 // 사용자가 설정한 최대 너비를 적용합니다.
39- if (options .width > serviceConfig .maxWidth ) {
39+ if (options .width && options . width > serviceConfig .maxWidth ) {
4040 console .warn (` Image width ${options .width } exceeds max width ${serviceConfig .maxWidth }. Falling back to max width. ` );
4141 options .width = serviceConfig .maxWidth ;
4242 }
@@ -64,11 +64,11 @@ export default service;
6464
6565자신만의 로컬 서비스를 생성하려면 [ 내장된 엔드포인트] ( https://github.com/withastro/astro/blob/main/packages/astro/src/assets/endpoint/generic.ts ) (` /_image ` )를 가리키거나 서비스의 메서드를 호출할 수 있는 자체 엔드포인트를 추가로 생성할 수 있습니다.
6666
67- ` ` ` js
68- import type { LocalImageService , AstroConfig } from " astro" ;
67+ ``` ts
68+ import type { ImageTransform , LocalImageService , AstroConfig } from " astro" ;
6969
70- const service: LocalImageService = {
71- getURL (options : ImageTransform , imageConfig : AstroConfig [ ' image ' ] ) {
70+ const service: LocalImageService < AstroConfig [ " image " ]> = {
71+ getURL(options : ImageTransform , imageConfig ) {
7272 const searchParams = new URLSearchParams ();
7373 searchParams .append (' href' , typeof options .src === " string" ? options .src : options .src .src );
7474 options .width && searchParams .append (' w' , options .width .toString ());
@@ -80,6 +80,7 @@ const service: LocalImageService = {
8080 // 이 함수는 `/_image?${searchParams}`를 반환합니다.
8181 },
8282 parseURL(url : URL , imageConfig ) {
83+ const params = url .searchParams ;
8384 return {
8485 src: params .get (' href' )! ,
8586 width: params .has (' w' ) ? parseInt (params .get (' w' )! ) : undefined ,
@@ -88,8 +89,8 @@ const service: LocalImageService = {
8889 quality: params .get (' q' ),
8990 };
9091 },
91- transform (buffer : Uint8Array , options: { src: string, [key: string]: any }, imageConfig): { data : Uint8Array , format : OutputFormat } {
92- const { buffer } = mySuperLibraryThatEncodesImages (options);
92+ async transform(inputBuffer : Uint8Array , options : { src: string , [key : string ]: any }, imageConfig ) {
93+ const { buffer } = await mySuperLibraryThatEncodesImages (options );
9394 return {
9495 data: buffer ,
9596 format: options .format ,
@@ -159,9 +160,13 @@ export const GET: APIRoute = async ({ request }) => {
159160
160161### ` getURL() `
161162
162- **로컬 및 외부 서비스에 필요함**
163+ < p >
163164
164- ` getURL (options: ImageTransform, imageConfig: AstroConfig[' image' ]): string`
165+ ** 타입:** ` (options: ImageTransform, imageConfig: AstroConfig['image']) => string | Promise<string> ` <br />
166+ <Since v = " 2.1.0" />
167+ </p >
168+
169+ ** 로컬 및 외부 서비스에 필요함**
165170
166171로컬 서비스의 경우 이 후크는 이미지를 생성하는 엔드포인트의 URL을 반환합니다 (요청 시 렌더링 및 개발 모드에서). 빌드 중에는 사용되지 않습니다. ` getURL() ` 이 가리키는 로컬 엔드포인트는 ` parseURL() ` 과 ` transform() ` 을 모두 호출할 수 있습니다.
167172
@@ -171,59 +176,74 @@ export const GET: APIRoute = async ({ request }) => {
171176
172177``` ts
173178export type ImageTransform = {
174- // 이미지를 가져오는 ESM | 원격/public 이미지 경로
175- src : ImageMetadata | string ;
176- width ?: number ;
177- height ?: number ;
178- widths ?: number [] | undefined ;
179- densities ?: (number | `${number }x ` )[] | undefined;
180- quality?: ImageQuality;
181- format?: OutputFormat;
182- alt?: string;
183- [key: string]: any;
179+ // 이미지를 가져오는 ESM | 원격/public 이미지 경로
180+ src: ImageMetadata | string ;
181+ width? : number | undefined ;
182+ height? : number | undefined ;
183+ widths? : number [] | undefined ;
184+ densities? : (number | ` ${number }x ` )[] | undefined ;
185+ quality? : ImageQuality | undefined ;
186+ format? : OutputFormat | undefined ;
187+ fit? : ImageFit | undefined ;
188+ position? : string | undefined ;
189+ [key : string ]: any ;
184190};
185191```
186192
187193### ` parseURL() `
188194
189- ** 로컬 서비스에 필요합니다. 외부 서비스에 사용할 수 없음 **
195+ < p >
190196
191- ` parseURL(url: URL, imageConfig: AstroConfig['image']): { src: string, [key: string]: any}`
197+ ** 타입:** ` (url: URL, imageConfig: AstroConfig['image']) => { src: string, [key: string]: any } | undefined | Promise<{ src: string, [key: string]: any }> | Promise<undefined> ` <br />
198+ <Since v = " 2.1.0" />
199+ </p >
200+
201+ ** 로컬 서비스에만 필요합니다. 외부 서비스에 사용할 수 없음**
192202
193203이 후크는 ` getURL() ` 에 의해 생성된 URL을 ` transform ` (요청 시 렌더링 및 개발 모드에서)에 사용되는 다른 속성을 가진 객체로 다시 구문 분석합니다. 빌드 중에는 사용되지 않습니다.
194204
195205### ` transform() `
196206
197- ** 로컬 서비스에만 필요합니다. 외부 서비스에 사용할 수 없음**
207+ <p >
208+
209+ ** 타입:** ` (inputBuffer: Uint8Array, options: { src: string, [key: string]: any }, imageConfig: AstroConfig['image']) => Promise<{ data: Uint8Array; format: ImageOutputFormat }> ` <br />
210+ <Since v = " 2.1.0" />
211+ </p >
198212
199- ` transform(buffer: Uint8Array, options: { src: string, [key: string]: any }, imageConfig: AstroConfig['image']): { data: Uint8Array, format: OutputFormat } `
213+ ** 로컬 서비스에만 필요합니다. 외부 서비스에 사용할 수 없음 **
200214
201215이 후크는 이미지를 변환하고 반환하며 빌드 중에 호출되어 최종 자산 파일을 생성합니다.
202216
203217요청 시 렌더링 및 개발 모드에서 사용자에게 적절한 MIME 유형이 제공되도록 하려면 ` format ` 을 반환해야 합니다.
204218
205219### ` getHTMLAttributes() `
206220
207- ** 로컬 및 외부 서비스 모두 선택 사항**
221+ <p >
222+
223+ ** 타입:** ` (options: ImageTransform, imageConfig: AstroConfig['image'] ) => Record<string, any> | Promise<Record<string, any>> ` <br />
224+ <Since v = " 2.1.0" />
225+ </p >
208226
209- ` getHTMLAttributes(options: ImageTransform, imageConfig: AstroConfig['image']): Record<string, any> `
227+ ** 로컬 및 외부 서비스 모두 선택 사항 **
210228
211229이 후크는 사용자가 전달한 매개변수 (` options ` )를 기반으로 이미지를 HTML로 렌더링하는 데 사용되는 모든 추가 속성을 반환합니다.
212230
213231### ` getSrcSet() `
214232
215- < p>< Since v = " 3.3.0 " / >< / p >
233+ <p >
216234
217- ** 로컬 및 외부 서비스 모두 선택 사항입니다.**
235+ ** 타입:** ` (options: ImageTransform, imageConfig: AstroConfig['image'] ) => UnresolvedSrcSetValue[] | Promise<UnresolvedSrcSetValue[]> ` <br />
236+ <Since v = " 3.3.0" />
237+ </p >
218238
219- ` getSrcSet?: (options: ImageTransform, imageConfig: AstroConfig['image']): SrcSetValue[] | Promise<SrcSetValue[]>; `
239+ ** 로컬 및 외부 서비스 모두 선택 사항입니다. **
220240
221241이 후크는 ` <img> ` 또는 ` <picture> ` 의 ` source ` 에 ` srcset ` 속성을 생성하기 위해 지정된 이미지의 여러 변형을 생성합니다.
222242
223243이 후크는 다음 속성을 가진 객체 배열을 반환합니다.
224244
225245``` ts
226- export type SrcSetValue = {
246+ export type UnresolvedSrcSetValue = {
227247 transform: ImageTransform ;
228248 descriptor? : string ;
229249 attributes? : Record <string , any >;
@@ -232,9 +252,13 @@ export type SrcSetValue = {
232252
233253### ` validateOptions() `
234254
235- ** 로컬 및 외부 서비스 모두 선택 사항 **
255+ < p >
236256
237- ` validateOptions(options: ImageTransform, imageConfig: AstroConfig['image']): ImageTransform`
257+ ** 타입:** ` (options: ImageTransform, imageConfig: AstroConfig['image'] ) => ImageTransform | Promise<ImageTransform> `
258+ <Since v = " 2.1.4" />
259+ </p >
260+
261+ ** 로컬 및 외부 서비스 모두 선택 사항**
238262
239263이 후크를 사용하면 사용자가 전달한 옵션을 검증하고 강화할 수 있습니다. 이는 기본 옵션을 설정하거나 사용자에게 매개변수가 필요함을 알리는 데 유용합니다.
240264
@@ -276,6 +300,7 @@ import {
276300 resolveSrc ,
277301 imageMetadata ,
278302 emitESMImage ,
303+ emitImageMetadata ,
279304 getOrigQueryParams ,
280305 inferRemoteSize ,
281306 propsToFilename ,
@@ -286,7 +311,7 @@ import {
286311### ` isRemoteAllowed() `
287312
288313<p >
289- ** 타입: ** ` (src: string, { domains, remotePatterns }: {domains: string[], remotePatterns: RemotePattern[] }): boolean` < br / >
314+ ** 타입:** ` (src: string, { domains, remotePatterns }: { domains: string[], remotePatterns: RemotePattern[] }) => boolean ` <br />
290315<Since v = " 4.0.0" />
291316</p >
292317
@@ -310,7 +335,7 @@ console.log(`Is the remote image allowed? ${isAllowed}`);
310335### ` matchHostname() `
311336
312337<p >
313- ** 타입: ** ` (url: URL, hostname?: string, allowWildcard = false): boolean` < br / >
338+ ** 타입:** ` (url: URL, hostname?: string, allowWildcard = false) => boolean ` <br />
314339<Since v = " 4.0.0" />
315340</p >
316341
@@ -336,7 +361,7 @@ console.log(`Does the hostname match with wildcard? ${isMatchWithWildcard}`); //
336361### ` matchPathname() `
337362
338363<p >
339- ** 타입: ** ` (url: URL, pathname?: string, allowWildcard = false): boolean` < br / >
364+ ** 타입:** ` (url: URL, pathname?: string, allowWildcard = false) => boolean ` <br />
340365<Since v = " 4.0.0" />
341366</p >
342367
@@ -363,7 +388,7 @@ console.log(`Does the pathname match with wildcard? ${isMatchWithWildcard}`); //
363388### ` matchPattern() `
364389
365390<p >
366- ** 타입: ** ` (url: URL, remotePattern: RemotePattern): boolean` < br / >
391+ ** 타입:** ` (url: URL, remotePattern: RemotePattern) => boolean ` <br />
367392<Since v = " 4.0.0" />
368393</p >
369394
@@ -391,7 +416,7 @@ console.log(`Does the URL match the remote pattern? ${isPatternMatched}`); //
391416### ` matchPort() `
392417
393418<p >
394- ** 타입: ** ` (url: URL, port?: string): boolean` < br / >
419+ ** 타입:** ` (url: URL, port?: string) => boolean ` <br />
395420<Since v = " 4.0.0" />
396421</p >
397422
@@ -422,7 +447,7 @@ console.log(`Does the port match (no port specified)? ${isPortMatch3}`); // 출
422447### ` matchProtocol() `
423448
424449<p >
425- ** 타입: ** ` (url: URL, protocol?: string): boolean` < br / >
450+ ** 타입:** ` (url: URL, protocol?: string) => boolean ` <br />
426451<Since v = " 4.0.0" />
427452</p >
428453
@@ -453,7 +478,7 @@ console.log(`Does the protocol match (no protocol specified)? ${isProtocolMatch3
453478### ` isESMImportedImage() `
454479
455480<p >
456- ** 타입: ** ` (src: ImageMetadata | string): boolean` < br / >
481+ ** 타입:** ` (src: ImageMetadata | string) => boolean ` <br />
457482 <Since v = " 4.0.0" />
458483</p >
459484
@@ -484,7 +509,7 @@ console.log(`Is filePathExample an ESM imported image? ${isFilePathImage}`); //
484509### ` isRemoteImage() `
485510
486511<p >
487- ** 타입: ** ` (src: ImageMetadata | string): boolean` < br / >
512+ ** 타입:** ` (src: ImageMetadata | string) => boolean ` <br />
488513 <Since v = " 4.0.0" />
489514</p >
490515
@@ -513,7 +538,7 @@ console.log(`Is localImageMetadata a remote image? ${isRemote2}`); // 출력: fa
513538### ` resolveSrc() `
514539
515540<p >
516- ** 타입: ** ` (src: UnresolvedImageTransform['src']): Promise<string | ImageMetadata>` < br / >
541+ ** 타입:** ` (src: UnresolvedImageTransform['src']) => Promise<string | ImageMetadata> ` <br />
517542 <Since v = " 4.0.0" />
518543</p >
519544
@@ -537,7 +562,7 @@ const resolvedDynamic = await resolveSrc(import("./images/dynamic-image.jpg"))
537562### ` imageMetadata() `
538563
539564<p >
540- ** 타입: ** ` (data: Uint8Array, src?: string): Promise<Omit<ImageMetadata, 'src' | 'fsPath'>>` < br / >
565+ ** 타입:** ` (data: Uint8Array, src?: string) => Promise<Omit<ImageMetadata, 'src' | 'fsPath'>> ` <br />
541566 <Since v = " 4.0.0" />
542567</p >
543568
@@ -580,7 +605,7 @@ await extractImageMetadata();
580605:::
581606
582607<p >
583- ** 타입: ** ` (id: string | undefined, _watchMode: boolean, experimentalSvgEnabled: boolean, fileEmitter?: FileEmitter): Promise<ImageMetadataWithContents | undefined>` < br / >
608+ ** 타입:** ` (id: string | undefined, _watchMode: boolean, experimentalSvgEnabled: boolean, fileEmitter?: FileEmitter) => Promise<ImageMetadataWithContents | undefined> ` <br />
584609 <Since v = " 4.0.0" />
585610</p >
586611
@@ -617,7 +642,7 @@ try {
617642### ` emitImageMetadata() `
618643
619644<p >
620- ** 타입: ** ` (id: string | undefined, fileEmitter?: FileEmitter): Promise<ImageMetadataWithContents | undefined>` < br / >
645+ ** 타입:** ` (id: string | undefined, fileEmitter?: FileEmitter) => Promise<ImageMetadataWithContents | undefined> ` <br />
621646 <Since v = " 5.7.0" />
622647</p >
623648
@@ -652,7 +677,7 @@ try {
652677### ` getOrigQueryParams() `
653678
654679<p >
655- ** 타입: ** ` (params: URLSearchParams): Pick<ImageMetadata, 'width' | 'height' | 'format'> | undefined` < br / >
680+ ** 타입:** ` (params: URLSearchParams) => Pick<ImageMetadata, 'width' | 'height' | 'format'> | undefined ` <br />
656681 <Since v = " 4.0.0" />
657682</p >
658683
@@ -685,7 +710,7 @@ if (origParams) {
685710### ` inferRemoteSize() `
686711
687712<p >
688- ** 타입: ** ` (url: string): Promise<Omit<ImageMetadata, 'src' | 'fsPath'>>` < br / >
713+ ** 타입:** ` (url: string) => Promise<Omit<ImageMetadata, 'src' | 'fsPath'>> ` <br />
689714 <Since v = " 4.0.0" />
690715</p >
691716
@@ -720,7 +745,7 @@ await getRemoteImageSize();
720745### ` propsToFilename() `
721746
722747<p >
723- ** 타입: ** ` (filePath: string, transform: ImageTransform, hash: string): string` < br / >
748+ ** 타입:** ` (filePath: string, transform: ImageTransform, hash: string) => string ` <br />
724749 <Since v = " 4.0.0" />
725750</p >
726751
@@ -759,7 +784,7 @@ generateTransformedFilename();
759784### ` hashTransform() `
760785
761786<p >
762- ** 타입: ** ` (transform: ImageTransform, imageService: string, propertiesToHash: string[]): string` < br / >
787+ ** 타입:** ` (transform: ImageTransform, imageService: string, propertiesToHash: string[]) => string ` <br />
763788 <Since v = " 4.0.0" />
764789</p >
765790
@@ -771,6 +796,7 @@ import { hashTransform } from 'astro/assets/utils';
771796
772797function generateTransformHash() {
773798 const transform = {
799+ src: ' /images/photo.jpg' ,
774800 width: 800 ,
775801 height: 600 ,
776802 format: ' jpg' ,
0 commit comments