Repository: nuxt/image
Pull request #1154 (2023-12-17 08:47:34)

feat: add `caisy` provider
I made this one a while back. Why not contribute it to the repo? Let's do it!

nuxt-studio[bot]: 
### <span aria-hidden="true">✅</span> Live Preview ready!

| Name | Edit | Preview | Latest Commit |
| :--- | :----- | :------ | :------ |
| **Image** | [Edit on Studio ↗︎](https://nuxt.studio/@nuxt/image/studio/content?refId=%231154) | [View Live Preview](https://image.nuxt.com?preview=b3e588ae4a6a5155dbcf8da5cf07ed19) | 9fd797abfea60f1a2e312c0eb3f9931e05b03f9b |

<!-- This comment is generated by [Nuxt Studio](https://nuxt.studio) -->
<!-- Do not remove or edit this comment. -->

timbenniks: @danielroe it looks like some older commits are also shown in this PR. I only want that last one to be added. Anything I should do differently?
codecov-commenter: ## [Codecov](https://app.codecov.io/gh/nuxt/image/pull/1154?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt) Report
Attention: `21 lines` in your changes are missing coverage. Please review.
> Comparison is base [(`bebad4f`)](https://app.codecov.io/gh/nuxt/image/commit/bebad4f7edd960617cdda38cd99f86126fe8a0db?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt) 69.61% compared to head [(`9fd797a`)](https://app.codecov.io/gh/nuxt/image/pull/1154?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt) 69.26%.

| [Files](https://app.codecov.io/gh/nuxt/image/pull/1154?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt) | Patch % | Lines |
|---|---|---|
| [src/runtime/providers/caisy.ts](https://app.codecov.io/gh/nuxt/image/pull/1154?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt#diff-c3JjL3J1bnRpbWUvcHJvdmlkZXJzL2NhaXN5LnRz) | 0.00% | [19 Missing and 1 partial :warning: ](https://app.codecov.io/gh/nuxt/image/pull/1154?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt) |
| [docs/pages/index.vue](https://app.codecov.io/gh/nuxt/image/pull/1154?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt#diff-ZG9jcy9wYWdlcy9pbmRleC52dWU=) | 0.00% | [1 Missing :warning: ](https://app.codecov.io/gh/nuxt/image/pull/1154?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt) |

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main    #1154      +/-   ##
==========================================
- Coverage   69.61%   69.26%   -0.36%     
==========================================
  Files          72       73       +1     
  Lines        4131     4152      +21     
  Branches      385      386       +1     
==========================================
  Hits         2876     2876              
- Misses       1229     1250      +21     
  Partials       26       26              
```



</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/nuxt/image/pull/1154?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nuxt).


Patch:
diff --git a/docs/content/3.providers/caisy.md b/docs/content/3.providers/caisy.md
new file mode 100644
index 0000000..a6b6cdd
--- /dev/null
+++ b/docs/content/3.providers/caisy.md
@@ -0,0 +1,35 @@
+---
+title: Caisy
+description: Nuxt Image with Caisy integration.
+links:
+  - label: Source
+    icon: i-simple-icons-github
+    to: https://github.com/nuxt/image/blob/main/src/runtime/providers/caisy.ts
+    size: xs
+---
+
+Integration between [Caisy](https://caisy.io/) and the image module.
+
+To use this provider you just need to specify the base URL of your project.
+
+```ts [nuxt.config.ts]
+export default defineNuxtConfig({
+  image: {
+    caisy: {},
+  },
+});
+```
+
+## Modifiers
+
+All the default modifiers from [Caisy's documentation](https://caisy.io/developer/docs/libraries/rendering-images) are available.
+
+```vue
+<NuxtImg
+  provider="caisy"
+  src="https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg"
+  height="512"
+  width="512"
+  :quality="90"
+/>
+```
diff --git a/docs/pages/index.vue b/docs/pages/index.vue
index 6b4c877..379225b 100644
--- a/docs/pages/index.vue
+++ b/docs/pages/index.vue
@@ -16,7 +16,7 @@ useSeoMeta({
 const source = ref('npm i @nuxt/image')
 const { copy, copied } = useClipboard({ source })
 
-const providers = ['cloudflare', 'cloudimage', 'cloudinary', 'directus', 'edgio', 'fastly', 'glide', 'gumlet', 'hygraph', 'imageengine', 'imagekit', 'imgix', 'ipx', 'netlify', 'prepr', 'prismic', 'sanity', 'storyblok', 'strapi', 'twicpics', 'unsplash', 'uploadcare', 'vercel', 'weserv']
+const providers = ['caisy', 'cloudflare', 'cloudimage', 'cloudinary', 'directus', 'edgio', 'fastly', 'glide', 'gumlet', 'hygraph', 'imageengine', 'imagekit', 'imgix', 'ipx', 'netlify', 'prepr', 'prismic', 'sanity', 'storyblok', 'strapi', 'twicpics', 'unsplash', 'uploadcare', 'vercel', 'weserv']
 // Disabling because svg to png does not work now with SSG
 // Related issue: https://github.com/unjs/ipx/issues/160
 // const img = useImage()
diff --git a/docs/public/providers/caisy.svg b/docs/public/providers/caisy.svg
new file mode 100644
index 0000000..46bddcf
--- /dev/null
+++ b/docs/public/providers/caisy.svg
@@ -0,0 +1,15 @@
+<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g clip-path="url(#clip0_3633_1119)">
+<path d="M64 0H8C3.58172 0 0 3.58172 0 8V64C0 68.4183 3.58172 72 8 72H64C68.4183 72 72 68.4183 72 64V8C72 3.58172 68.4183 0 64 0Z" fill="white"/>
+<rect x="8" y="7" width="57" height="57" fill="url(#pattern0)"/>
+</g>
+<defs>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_3633_1119" transform="scale(0.00833333)"/>
+</pattern>
+<clipPath id="clip0_3633_1119">
+<rect width="72" height="72" fill="white"/>
+</clipPath>
+<image id="image0_3633_1119" width="120" height="120" xlink:href="data:image/png;base64,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"/>
+</defs>
+</svg>
diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts
index 40af785..7e3d793 100644
--- a/playground/nuxt.config.ts
+++ b/playground/nuxt.config.ts
@@ -107,6 +107,8 @@ export default defineNuxtConfig({
     weserv: {
       baseURL: '/'
     },
+    caisy: {
+    },
     providers: {
       custom: {
         provider: '~/providers/custom',
diff --git a/playground/providers.ts b/playground/providers.ts
index f4a9082..daf1dc6 100644
--- a/playground/providers.ts
+++ b/playground/providers.ts
@@ -1048,5 +1048,17 @@ export const providers: Provider[] = [
         format: 'jpeg'
       }
     ]
+  },
+  // Caisy
+  {
+    name: 'caisy',
+    samples: [
+      {
+        src: 'https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg',
+        width: 500,
+        height: 500,
+        quality: 90
+      }
+    ]
   }
 ]
diff --git a/src/provider.ts b/src/provider.ts
index 3377e25..3e18058 100644
--- a/src/provider.ts
+++ b/src/provider.ts
@@ -13,6 +13,7 @@ import { ipxSetup } from './ipx'
 const BuiltInProviders = [
   'aliyun',
   'awsAmplify',
+  'caisy',
   'cloudflare',
   'cloudimage',
   'cloudinary',
diff --git a/src/runtime/providers/caisy.ts b/src/runtime/providers/caisy.ts
new file mode 100644
index 0000000..fbfda76
--- /dev/null
+++ b/src/runtime/providers/caisy.ts
@@ -0,0 +1,20 @@
+import { joinURL } from 'ufo'
+import type { ProviderGetImage } from '../../types'
+import { createOperationsGenerator } from '#image'
+
+export const operationsGenerator = createOperationsGenerator({
+  keyMap: {
+    width: 'w',
+    height: 'h',
+    quality: 'q'
+  },
+  joinWith: '&',
+  formatter: (key, value) => `${key}=${value}`
+})
+
+export const getImage: ProviderGetImage = (src, { modifiers = {} } = {}) => {
+  const operations = operationsGenerator(modifiers)
+  return {
+    url: joinURL(src + (operations ? ('?' + operations) : ''))
+  }
+}


Test patch:
diff --git a/test/e2e/__snapshots__/no-ssr.test.ts.snap b/test/e2e/__snapshots__/no-ssr.test.ts.snap
index e0d7529..7f953a4 100644
--- a/test/e2e/__snapshots__/no-ssr.test.ts.snap
+++ b/test/e2e/__snapshots__/no-ssr.test.ts.snap
@@ -30,6 +30,18 @@ exports[`browser (ssr: false) > awsAmplify should render images 2`] = `
 ]
 `;
 
+exports[`browser (ssr: false) > caisy should render images 1`] = `
+[
+  "https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?w=500&h=500&q=90",
+]
+`;
+
+exports[`browser (ssr: false) > caisy should render images 2`] = `
+[
+  "https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?w=500&h=500&q=90",
+]
+`;
+
 exports[`browser (ssr: false) > cloudflare should render images 1`] = `
 [
   "https://that-test.site/cdn-cgi/image/h=300,fit=contain/https://s3.that-test.site/burger.jpeg",
diff --git a/test/e2e/__snapshots__/ssr.test.ts.snap b/test/e2e/__snapshots__/ssr.test.ts.snap
index b14e0d0..41f6f12 100644
--- a/test/e2e/__snapshots__/ssr.test.ts.snap
+++ b/test/e2e/__snapshots__/ssr.test.ts.snap
@@ -30,6 +30,18 @@ exports[`browser (ssr: true) > awsAmplify should render images 2`] = `
 ]
 `;
 
+exports[`browser (ssr: true) > caisy should render images 1`] = `
+[
+  "https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?w=500&h=500&q=90",
+]
+`;
+
+exports[`browser (ssr: true) > caisy should render images 2`] = `
+[
+  "https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?w=500&h=500&q=90",
+]
+`;
+
 exports[`browser (ssr: true) > cloudflare should render images 1`] = `
 [
   "https://that-test.site/cdn-cgi/image/h=300,fit=contain/https://s3.that-test.site/burger.jpeg",
diff --git a/test/providers.ts b/test/providers.ts
index 4a0e1c6..5ec1db0 100644
--- a/test/providers.ts
+++ b/test/providers.ts
@@ -29,7 +29,8 @@ export const images = [
     uploadcare: { url: 'https://ucarecdn.com/c160afba-8b42-45a9-a46a-d393248b0072/' },
     weserv: { url: 'https://wsrv.nl/?filename=test.png&we&url=https://my-website.com/test.png' },
     sirv: { url: 'https://demo.sirv.com/test.png' },
-    hygraph: { url: 'https://media.graphassets.com/JL6e2yJERUyQtTiZIzPb' }
+    hygraph: { url: 'https://media.graphassets.com/JL6e2yJERUyQtTiZIzPb' },
+    caisy: { url: 'https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg' }
   },
   {
     args: ['/test.png', { width: 200 }],
@@ -61,7 +62,8 @@ export const images = [
     uploadcare: { url: 'https://ucarecdn.com/c160afba-8b42-45a9-a46a-d393248b0072/-/resize/200x/' },
     weserv: { url: 'https://wsrv.nl/?filename=test.png&we&w=200&url=https://my-website.com/test.png' },
     sirv: { url: 'https://demo.sirv.com/test.png?w=200' },
-    hygraph: { url: 'https://media.graphassets.com/auto_image/resize=width:200/JL6e2yJERUyQtTiZIzPb' }
+    hygraph: { url: 'https://media.graphassets.com/auto_image/resize=width:200/JL6e2yJERUyQtTiZIzPb' },
+    caisy: { url: 'https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?w=200' }
   },
   {
     args: ['/test.png', { height: 200 }],
@@ -93,7 +95,8 @@ export const images = [
     uploadcare: { url: 'https://ucarecdn.com/c160afba-8b42-45a9-a46a-d393248b0072/-/resize/x200/' },
     weserv: { url: 'https://wsrv.nl/?filename=test.png&we&h=200&url=https://my-website.com/test.png' },
     sirv: { url: 'https://demo.sirv.com/test.png?h=200' },
-    hygraph: { url: 'https://media.graphassets.com/auto_image/resize=height:200/JL6e2yJERUyQtTiZIzPb' }
+    hygraph: { url: 'https://media.graphassets.com/auto_image/resize=height:200/JL6e2yJERUyQtTiZIzPb' },
+    caisy: { url: 'https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?h=200' }
   },
   {
     args: ['/test.png', { width: 200, height: 200 }],
@@ -125,7 +128,8 @@ export const images = [
     uploadcare: { url: 'https://ucarecdn.com/c160afba-8b42-45a9-a46a-d393248b0072/-/resize/200x200/' },
     weserv: { url: 'https://wsrv.nl/?filename=test.png&we&w=200&h=200&url=https://my-website.com/test.png' },
     sirv: { url: 'https://demo.sirv.com/test.png?w=200&h=200' },
-    hygraph: { url: 'https://media.graphassets.com/auto_image/resize=width:200,height:200/JL6e2yJERUyQtTiZIzPb' }
+    hygraph: { url: 'https://media.graphassets.com/auto_image/resize=width:200,height:200/JL6e2yJERUyQtTiZIzPb' },
+    caisy: { url: 'https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?w=200&h=200' }
   },
   {
     args: ['/test.png', { width: 200, height: 200, fit: 'contain' }],
@@ -157,7 +161,8 @@ export const images = [
     uploadcare: { url: 'https://ucarecdn.com/c160afba-8b42-45a9-a46a-d393248b0072/-/resize/200x200/-/stretch/off/' },
     weserv: { url: 'https://wsrv.nl/?filename=test.png&we&w=200&h=200&fit=contain&url=https://my-website.com/test.png' },
     sirv: { url: 'https://demo.sirv.com/test.png?w=200&h=200&scale.option=fit' },
-    hygraph: { url: 'https://media.graphassets.com/auto_image/resize=width:200,height:200,fit:max/JL6e2yJERUyQtTiZIzPb' }
+    hygraph: { url: 'https://media.graphassets.com/auto_image/resize=width:200,height:200,fit:max/JL6e2yJERUyQtTiZIzPb' },
+    caisy: { url: 'https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?w=200&h=200' }
   },
   {
     args: ['/test.png', { width: 200, height: 200, fit: 'contain', format: 'jpeg' }],
@@ -189,7 +194,8 @@ export const images = [
     uploadcare: { url: 'https://ucarecdn.com/c160afba-8b42-45a9-a46a-d393248b0072/-/format/jpeg/-/resize/200x200/-/stretch/off/' },
     weserv: { url: 'https://wsrv.nl/?filename=test.png&we&w=200&h=200&fit=contain&output=jpg&url=https://my-website.com/test.png' },
     sirv: { url: 'https://demo.sirv.com/test.png?w=200&h=200&scale.option=fit&format=jpg' },
-    hygraph: { url: 'https://media.graphassets.com/output=format:jpg/resize=width:200,height:200,fit:max/JL6e2yJERUyQtTiZIzPb' }
+    hygraph: { url: 'https://media.graphassets.com/output=format:jpg/resize=width:200,height:200,fit:max/JL6e2yJERUyQtTiZIzPb' },
+    caisy: { url: 'https://assets.caisy.io/assets/b76210be-a043-4989-98df-ecaf6c6e68d8/056c27e2-81f5-4cd3-b728-cef181dfe7dc/d83ea6f0-f90a-462c-aebd-b8bc615fdce0pexelsmiguelapadrinan1591056.jpg?w=200&h=200' }
   }
 ] as const