Compare commits

...

5 Commits

Author SHA1 Message Date
David Barroso
7fa7ef2715 asd 2025-11-13 10:55:44 +01:00
David Barroso
84ebe77b27 asdqasd 2025-11-13 10:02:24 +01:00
David Barroso
effb2ae17f asd 2025-11-13 09:16:11 +01:00
github-actions[bot]
d15717b67a release(cli): 1.34.6 (#3690)
Co-authored-by: dbarrosop <dbarrosop@users.noreply.github.com>
2025-11-13 08:28:30 +01:00
David Barroso
a3c7f89eda fix(cli): mcp: specify items type for arrays in tools (#3687) 2025-11-13 08:23:03 +01:00
14 changed files with 171 additions and 99 deletions

View File

@@ -1,3 +1,14 @@
## [cli@1.34.6] - 2025-11-13
### 🐛 Bug Fixes
- *(cli)* Mcp: specify items type for arrays in tools (#3687)
### ⚙️ Miscellaneous Tasks
- *(cli)* Update bindings (#3689)
## [cli@1.34.5] - 2025-11-06 ## [cli@1.34.5] - 2025-11-06
### ⚙️ Miscellaneous Tasks ### ⚙️ Miscellaneous Tasks

View File

@@ -196,10 +196,12 @@ config validate after making changes to your nhost.toml file to ensure it is val
"mutations": map[string]any{ "mutations": map[string]any{
"description": string("list of mutations to fetch"), "description": string("list of mutations to fetch"),
"type": string("array"), "type": string("array"),
"items": map[string]any{"type": string("string")},
}, },
"queries": map[string]any{ "queries": map[string]any{
"description": string("list of queries to fetch"), "description": string("list of queries to fetch"),
"type": string("array"), "type": string("array"),
"items": map[string]any{"type": string("string")},
}, },
"summary": map[string]any{ "summary": map[string]any{
"default": bool(true), "default": bool(true),

View File

@@ -68,10 +68,12 @@ func (t *Tool) Register(mcpServer *server.MCPServer) {
), ),
mcp.WithArray( mcp.WithArray(
"queries", "queries",
mcp.WithStringItems(),
mcp.Description("list of queries to fetch"), mcp.Description("list of queries to fetch"),
), ),
mcp.WithArray( mcp.WithArray(
"mutations", "mutations",
mcp.WithStringItems(),
mcp.Description("list of mutations to fetch"), mcp.Description("list of mutations to fetch"),
), ),
) )

View File

@@ -792,7 +792,7 @@ Maximum height to resize image to while maintaining aspect ratio. Only applies t
optional q: number; optional q: number;
``` ```
Image quality (1-100). Only applies to JPEG, WebP and PNG files Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
#### w? #### w?
@@ -842,7 +842,7 @@ Maximum height to resize image to while maintaining aspect ratio. Only applies t
optional q: number; optional q: number;
``` ```
Image quality (1-100). Only applies to JPEG, WebP and PNG files Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
#### w? #### w?
@@ -1068,7 +1068,7 @@ buildVersion: string
## OutputImageFormat ## OutputImageFormat
```ts ```ts
type OutputImageFormat = 'auto' | 'same' | 'jpeg' | 'webp' | 'png' | 'avif' type OutputImageFormat = 'auto' | 'same' | 'jpeg' | 'webp' | 'png' | 'avif' | 'heic'
``` ```
Output format for image files. Use 'auto' for content negotiation based on Accept header Output format for image files. Use 'auto' for content negotiation based on Accept header

View File

@@ -148,7 +148,7 @@ paths:
schema: schema:
$ref: '#/components/schemas/RFC2822Date' $ref: '#/components/schemas/RFC2822Date'
- name: q - name: q
description: "Image quality (1-100). Only applies to JPEG, WebP and PNG files" description: "Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files"
in: query in: query
schema: schema:
type: integer type: integer
@@ -332,7 +332,7 @@ paths:
schema: schema:
$ref: '#/components/schemas/RFC2822Date' $ref: '#/components/schemas/RFC2822Date'
- name: q - name: q
description: "Image quality (1-100). Only applies to JPEG, WebP and PNG files" description: "Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files"
in: query in: query
schema: schema:
type: integer type: integer
@@ -614,7 +614,7 @@ paths:
schema: schema:
$ref: '#/components/schemas/RFC2822Date' $ref: '#/components/schemas/RFC2822Date'
- name: q - name: q
description: "Image quality (1-100). Only applies to JPEG, WebP and PNG files" description: "Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files"
in: query in: query
schema: schema:
type: integer type: integer
@@ -1178,4 +1178,5 @@ components:
- webp - webp
- png - png
- avif - avif
- heic
example: same example: same

View File

@@ -275,7 +275,8 @@ export type OutputImageFormat =
| "jpeg" | "jpeg"
| "webp" | "webp"
| "png" | "png"
| "avif"; | "avif"
| "heic";
/** /**
* *
@@ -378,7 +379,7 @@ export interface ListOrphanedFilesResponse200 {
/** /**
* Parameters for the getFile method. * Parameters for the getFile method.
@property q? (number) - Image quality (1-100). Only applies to JPEG, WebP and PNG files @property q? (number) - Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
@property h? (number) - Maximum height to resize image to while maintaining aspect ratio. Only applies to image files @property h? (number) - Maximum height to resize image to while maintaining aspect ratio. Only applies to image files
@@ -391,7 +392,7 @@ export interface ListOrphanedFilesResponse200 {
* Output format for image files. Use 'auto' for content negotiation based on Accept header*/ * Output format for image files. Use 'auto' for content negotiation based on Accept header*/
export interface GetFileParams { export interface GetFileParams {
/** /**
* Image quality (1-100). Only applies to JPEG, WebP and PNG files * Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
*/ */
q?: number; q?: number;
@@ -419,7 +420,7 @@ export interface GetFileParams {
} }
/** /**
* Parameters for the getFileMetadataHeaders method. * Parameters for the getFileMetadataHeaders method.
@property q? (number) - Image quality (1-100). Only applies to JPEG, WebP and PNG files @property q? (number) - Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
@property h? (number) - Maximum height to resize image to while maintaining aspect ratio. Only applies to image files @property h? (number) - Maximum height to resize image to while maintaining aspect ratio. Only applies to image files
@@ -432,7 +433,7 @@ export interface GetFileParams {
* Output format for image files. Use 'auto' for content negotiation based on Accept header*/ * Output format for image files. Use 'auto' for content negotiation based on Accept header*/
export interface GetFileMetadataHeadersParams { export interface GetFileMetadataHeadersParams {
/** /**
* Image quality (1-100). Only applies to JPEG, WebP and PNG files * Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
*/ */
q?: number; q?: number;

View File

@@ -2066,83 +2066,84 @@ func (sh *strictHandler) GetVersion(ctx *gin.Context) {
// Base64 encoded, gzipped, json marshaled Swagger object // Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{ var swaggerSpec = []string{
"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",
"AA==",
} }
// GetSwagger returns the content of the embedded swagger specification file // GetSwagger returns the content of the embedded swagger specification file

View File

@@ -18,6 +18,7 @@ const (
const ( const (
Auto OutputImageFormat = "auto" Auto OutputImageFormat = "auto"
Avif OutputImageFormat = "avif" Avif OutputImageFormat = "avif"
Heic OutputImageFormat = "heic"
Jpeg OutputImageFormat = "jpeg" Jpeg OutputImageFormat = "jpeg"
Png OutputImageFormat = "png" Png OutputImageFormat = "png"
Same OutputImageFormat = "same" Same OutputImageFormat = "same"
@@ -158,7 +159,7 @@ type UploadFilesMultipartBody struct {
// GetFileParams defines parameters for GetFile. // GetFileParams defines parameters for GetFile.
type GetFileParams struct { type GetFileParams struct {
// Q Image quality (1-100). Only applies to JPEG, WebP and PNG files // Q Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
Q *int `form:"q,omitempty" json:"q,omitempty"` Q *int `form:"q,omitempty" json:"q,omitempty"`
// H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files // H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files
@@ -191,7 +192,7 @@ type GetFileParams struct {
// GetFileMetadataHeadersParams defines parameters for GetFileMetadataHeaders. // GetFileMetadataHeadersParams defines parameters for GetFileMetadataHeaders.
type GetFileMetadataHeadersParams struct { type GetFileMetadataHeadersParams struct {
// Q Image quality (1-100). Only applies to JPEG, WebP and PNG files // Q Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
Q *int `form:"q,omitempty" json:"q,omitempty"` Q *int `form:"q,omitempty" json:"q,omitempty"`
// H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files // H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files
@@ -257,7 +258,7 @@ type GetFileWithPresignedURLParams struct {
// XId Use presignedurl endpoint to generate this automatically // XId Use presignedurl endpoint to generate this automatically
XId string `form:"x-id" json:"x-id"` XId string `form:"x-id" json:"x-id"`
// Q Image quality (1-100). Only applies to JPEG, WebP and PNG files // Q Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
Q *int `form:"q,omitempty" json:"q,omitempty"` Q *int `form:"q,omitempty" json:"q,omitempty"`
// H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files // H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files

View File

@@ -28,6 +28,7 @@ const (
const ( const (
Auto OutputImageFormat = "auto" Auto OutputImageFormat = "auto"
Avif OutputImageFormat = "avif" Avif OutputImageFormat = "avif"
Heic OutputImageFormat = "heic"
Jpeg OutputImageFormat = "jpeg" Jpeg OutputImageFormat = "jpeg"
Png OutputImageFormat = "png" Png OutputImageFormat = "png"
Same OutputImageFormat = "same" Same OutputImageFormat = "same"
@@ -168,7 +169,7 @@ type UploadFilesMultipartBody struct {
// GetFileParams defines parameters for GetFile. // GetFileParams defines parameters for GetFile.
type GetFileParams struct { type GetFileParams struct {
// Q Image quality (1-100). Only applies to JPEG, WebP and PNG files // Q Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
Q *int `form:"q,omitempty" json:"q,omitempty"` Q *int `form:"q,omitempty" json:"q,omitempty"`
// H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files // H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files
@@ -201,7 +202,7 @@ type GetFileParams struct {
// GetFileMetadataHeadersParams defines parameters for GetFileMetadataHeaders. // GetFileMetadataHeadersParams defines parameters for GetFileMetadataHeaders.
type GetFileMetadataHeadersParams struct { type GetFileMetadataHeadersParams struct {
// Q Image quality (1-100). Only applies to JPEG, WebP and PNG files // Q Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
Q *int `form:"q,omitempty" json:"q,omitempty"` Q *int `form:"q,omitempty" json:"q,omitempty"`
// H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files // H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files
@@ -267,7 +268,7 @@ type GetFileWithPresignedURLParams struct {
// XId Use presignedurl endpoint to generate this automatically // XId Use presignedurl endpoint to generate this automatically
XId string `form:"x-id" json:"x-id"` XId string `form:"x-id" json:"x-id"`
// Q Image quality (1-100). Only applies to JPEG, WebP and PNG files // Q Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files
Q *int `form:"q,omitempty" json:"q,omitempty"` Q *int `form:"q,omitempty" json:"q,omitempty"`
// H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files // H Maximum height to resize image to while maintaining aspect ratio. Only applies to image files

View File

@@ -37,6 +37,8 @@ func mimeTypeToImageType(mimeType string) (image.ImageType, *APIError) {
return image.ImageTypeJPEG, nil return image.ImageTypeJPEG, nil
case "image/avif": case "image/avif":
return image.ImageTypeAVIF, nil return image.ImageTypeAVIF, nil
case "image/heic", "image/heif":
return image.ImageTypeHEIC, nil
default: default:
return 0, BadDataError( return 0, BadDataError(
fmt.Errorf( //nolint: err113 fmt.Errorf( //nolint: err113
@@ -73,6 +75,8 @@ func chooseImageFormat( //nolint: cyclop
return originalFormat, image.ImageTypeJPEG, nil return originalFormat, image.ImageTypeJPEG, nil
case api.Avif: case api.Avif:
return originalFormat, image.ImageTypeAVIF, nil return originalFormat, image.ImageTypeAVIF, nil
case api.Heic:
return originalFormat, image.ImageTypeHEIC, nil
case api.Auto: case api.Auto:
for _, acceptHeader := range acceptHeader { for _, acceptHeader := range acceptHeader {
acceptedTypes := strings.Split(acceptHeader, ",") acceptedTypes := strings.Split(acceptHeader, ",")
@@ -85,6 +89,8 @@ func chooseImageFormat( //nolint: cyclop
return originalFormat, image.ImageTypeJPEG, nil return originalFormat, image.ImageTypeJPEG, nil
case slices.Contains(acceptedTypes, "image/png"): case slices.Contains(acceptedTypes, "image/png"):
return originalFormat, image.ImageTypePNG, nil return originalFormat, image.ImageTypePNG, nil
case slices.Contains(acceptedTypes, "image/heic"):
return originalFormat, image.ImageTypeHEIC, nil
} }
} }
@@ -92,8 +98,11 @@ func chooseImageFormat( //nolint: cyclop
default: default:
return 0, 0, BadDataError( return 0, 0, BadDataError(
//nolint: err113 //nolint: err113
fmt.Errorf("format must be one of: same, webp, png, jpeg, avif, auto. Got: %s", format), fmt.Errorf(
"format must be one of: same, webp, png, jpeg, avif, auto. Got: "+string(format), "format must be one of: same, webp, png, jpeg, avif, heic, auto. Got: %s",
format,
),
"format must be one of: same, webp, png, jpeg, avif, heic, auto. Got: "+string(format),
) )
} }
} }

View File

@@ -148,7 +148,7 @@ paths:
schema: schema:
$ref: '#/components/schemas/RFC2822Date' $ref: '#/components/schemas/RFC2822Date'
- name: q - name: q
description: "Image quality (1-100). Only applies to JPEG, WebP and PNG files" description: "Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files"
in: query in: query
schema: schema:
type: integer type: integer
@@ -332,7 +332,7 @@ paths:
schema: schema:
$ref: '#/components/schemas/RFC2822Date' $ref: '#/components/schemas/RFC2822Date'
- name: q - name: q
description: "Image quality (1-100). Only applies to JPEG, WebP and PNG files" description: "Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files"
in: query in: query
schema: schema:
type: integer type: integer
@@ -614,7 +614,7 @@ paths:
schema: schema:
$ref: '#/components/schemas/RFC2822Date' $ref: '#/components/schemas/RFC2822Date'
- name: q - name: q
description: "Image quality (1-100). Only applies to JPEG, WebP and PNG files" description: "Image quality (1-100). Only applies to JPEG, WebP, PNG and HEIC files"
in: query in: query
schema: schema:
type: integer type: integer
@@ -1178,4 +1178,5 @@ components:
- webp - webp
- png - png
- avif - avif
- heic
example: same example: same

View File

@@ -24,6 +24,7 @@ const (
ImageTypePNG ImageTypePNG
ImageTypeWEBP ImageTypeWEBP
ImageTypeAVIF ImageTypeAVIF
ImageTypeHEIC
) )
type Options struct { type Options struct {
@@ -54,6 +55,8 @@ func (o Options) FormatMimeType() string {
return "image/webp" return "image/webp"
case ImageTypeAVIF: case ImageTypeAVIF:
return "image/avif" return "image/avif"
case ImageTypeHEIC:
return "image/heic"
} }
return "" return ""
@@ -69,6 +72,8 @@ func (o Options) FileExtension() string {
return "webp" return "webp"
case ImageTypeAVIF: case ImageTypeAVIF:
return "avif" return "avif"
case ImageTypeHEIC:
return "heic"
} }
return "" return ""
@@ -127,6 +132,10 @@ func export(image *vips.ImageRef, opts Options) ([]byte, error) {
ep.Quality = opts.Quality ep.Quality = opts.Quality
ep.Effort = 0 ep.Effort = 0
b, _, err = image.ExportAvif(ep) b, _, err = image.ExportAvif(ep)
case ImageTypeHEIC:
ep := vips.NewHeifExportParams()
ep.Quality = opts.Quality
b, _, err = image.ExportHeif(ep)
} }
return b, err //nolint: wrapcheck return b, err //nolint: wrapcheck

View File

@@ -76,6 +76,39 @@ func TestManipulate(t *testing.T) {
size: 17784, size: 17784,
options: image.Options{Format: image.ImageTypeAVIF}, options: image.Options{Format: image.ImageTypeAVIF},
}, },
{
name: "heic",
filename: "testdata/nhost.heic",
sum: "1a2ab1930eef77710d35254a6fbd3e59f60b929070c44e47d0c6043e05b5ab99",
size: 12968,
options: image.Options{
Width: 300,
Height: 100,
Blur: 2,
Format: image.ImageTypeHEIC,
Quality: 50,
},
},
{
name: "jpeg to heic",
filename: "testdata/nhost.jpg",
sum: "0a86fa5dbfd545656fa97bfcace038440dba154c878b4cd002328d6cf8062249",
size: 33399,
options: image.Options{
Width: 300,
Height: 100,
Blur: 2,
Format: image.ImageTypeHEIC,
Quality: 50,
},
},
{
name: "webp to heic",
filename: "testdata/nhost.webp",
sum: "34f36705183310f9a88f147aca2905a872981920e93e9ab9714413185b395aa1",
size: 17784,
options: image.Options{Width: 300, Height: 100, Blur: 2, Format: image.ImageTypeHEIC},
},
} }
transformer := image.NewTransformer() transformer := image.NewTransformer()

Binary file not shown.