From b3eaa34ab931681b3a5b962af204c6ea2f6ba91a Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 1 Nov 2023 11:44:54 +0000 Subject: [PATCH 1/3] chore: change demo toml (#90) --- demo/netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/netlify.toml b/demo/netlify.toml index ebd90ac..b71e928 100644 --- a/demo/netlify.toml +++ b/demo/netlify.toml @@ -3,5 +3,5 @@ command = "yarn build" publish = "dist" ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF .." -[image_cdn] +[images] remote_images = ["https://placekitten.com/*"] From cb03686afc998cbd106163098397813a114e1cff Mon Sep 17 00:00:00 2001 From: Cingala David Date: Tue, 7 Nov 2023 08:37:20 +0100 Subject: [PATCH 2/3] feat: add imagekit support (#91) * feat: Add imagekit support * fix: wrong title in examples.json * chore: change sample image --------- Co-authored-by: Matt Kane --- data/subdomains.json | 3 +- demo/src/examples.json | 4 ++ src/parse.ts | 2 + src/transform.ts | 2 + src/transformers/imagekit.test.ts | 79 +++++++++++++++++++++++++++++++ src/transformers/imagekit.ts | 69 +++++++++++++++++++++++++++ src/types.ts | 3 +- 7 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 src/transformers/imagekit.test.ts create mode 100644 src/transformers/imagekit.ts diff --git a/data/subdomains.json b/data/subdomains.json index df57b60..0921c7c 100644 --- a/data/subdomains.json +++ b/data/subdomains.json @@ -6,5 +6,6 @@ "kc-usercontent.com": "kontent.ai", "cloudinary.com": "cloudinary", "kxcdn.com": "keycdn", - "imgeng.in": "imageengine" + "imgeng.in": "imageengine", + "imagekit.io": "imagekit" } diff --git a/demo/src/examples.json b/demo/src/examples.json index 30d1281..2ee42b3 100644 --- a/demo/src/examples.json +++ b/demo/src/examples.json @@ -67,5 +67,9 @@ "netlify": [ "Netlify", "https://deploy-preview-88--unpic-playground.netlify.app/.netlify/images?url=/cappadocia.jpg" + ], + "imagekit": [ + "Imagekit", + "https://ik.imagekit.io/demo/medium_cafe_B1iTdD0C.jpg" ] } diff --git a/src/parse.ts b/src/parse.ts index 2ec6bf5..7b82b6e 100644 --- a/src/parse.ts +++ b/src/parse.ts @@ -19,6 +19,7 @@ import { parse as contentstack } from "./transformers/contentstack.ts"; import { parse as cloudflareImages } from "./transformers/cloudflareimages.ts"; import { parse as ipx } from "./transformers/ipx.ts"; import { parse as netlify } from "./transformers/netlify.ts"; +import { parse as imagekit } from "./transformers/imagekit.ts"; import { ImageCdn, ParsedUrl, SupportedImageCdn, UrlParser } from "./types.ts"; export const parsers = { @@ -42,6 +43,7 @@ export const parsers = { "cloudflare_images": cloudflareImages, ipx, netlify, + imagekit }; export const cdnIsSupportedForParse = ( diff --git a/src/transform.ts b/src/transform.ts index 99eaa4d..039ab26 100644 --- a/src/transform.ts +++ b/src/transform.ts @@ -19,6 +19,7 @@ import { transform as contentstack } from "./transformers/contentstack.ts"; import { transform as cloudflareImages } from "./transformers/cloudflareimages.ts"; import { transform as ipx } from "./transformers/ipx.ts"; import { transform as netlify } from "./transformers/netlify.ts"; +import { transform as imagekit } from "./transformers/imagekit.ts"; import { ImageCdn, UrlTransformer } from "./types.ts"; import { getCanonicalCdnForUrl } from "./canonical.ts"; @@ -43,6 +44,7 @@ export const getTransformer = (cdn: ImageCdn) => ({ "cloudflare_images": cloudflareImages, ipx, netlify, + imagekit }[cdn]); /** diff --git a/src/transformers/imagekit.test.ts b/src/transformers/imagekit.test.ts new file mode 100644 index 0000000..78700ad --- /dev/null +++ b/src/transformers/imagekit.test.ts @@ -0,0 +1,79 @@ +import { assertEquals } from "https://deno.land/std@0.172.0/testing/asserts.ts"; +import { transform, parse} from "./imagekit.ts"; + +const img = + "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png?tr=w-500,h-300,fm-png,q-80"; + +Deno.test("imagekit", async (t) => { + await t.step("should format a URL", () => { + const result = transform({ + url: img, + width: 200, + height: 100, + }); + assertEquals( + result?.toString(), + "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png?tr=w-200%2Ch-100%2Cfm-png%2Cq-80", + ); + }); + + await t.step("should not set height if not provided", () => { + const result = transform({ url: img, width: 200 }); + assertEquals( + result?.toString(), + "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png?tr=w-200%2Cfm-png%2Cq-80", + ); + }); + + await t.step("should delete height if not set", () => { + const result = transform({ url: img, width: 200 }); + assertEquals( + result?.toString(), + "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png?tr=w-200%2Cfm-png%2Cq-80", + ); + }); + + await t.step("should round non-integer dimensions", () => { + const result = transform({ + url: img, + width: 200.6, + height: 100.2, + }); + assertEquals( + result?.toString(), + "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png?tr=w-201%2Ch-100%2Cfm-png%2Cq-80", + ); + }); + + await t.step("should set fm-auto if no format is provided", () => { + + const imgWithoutFormat = + "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png?tr=w-500,h-300,q-80"; + + const result = transform({ url: imgWithoutFormat, width: 200 }); + assertEquals( + result?.toString(), + "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png?tr=w-200%2Cq-80%2Cfm-auto", + ); + }); + + await t.step("should not set fm-auto if format is provided and use provided format", () => { + const result = transform({ url: img, width: 200, format: "jpg" }); + assertEquals( + result?.toString(), + "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png?tr=w-200%2Cfm-jpg%2Cq-80", + ); + }); + + + await t.step("should parse url", () => { + const result = parse(img); + + + assertEquals(result.base, "https://ik.imagekit.io/subman/v2/asset-3d/icon-standard.png"); + assertEquals(result.width, 500); + assertEquals(result.height, 300); + assertEquals(result.format, "png"); + }); + +}); diff --git a/src/transformers/imagekit.ts b/src/transformers/imagekit.ts new file mode 100644 index 0000000..341fc41 --- /dev/null +++ b/src/transformers/imagekit.ts @@ -0,0 +1,69 @@ +import { UrlParser, UrlTransformer } from "../types.ts"; +import { toUrl } from "../utils.ts"; + +const getTransformParams = (url: URL) => { + const transforms = url.searchParams.get('tr') || ""; + + return transforms.split(',').reduce((acc: any, transform: any)=> { + const [key, value] = transform.split('-'); + acc[key] = value; + return acc; + }, {}); +} + + +export const transform: UrlTransformer = ( + { url: originalUrl, width, height, format }, +) => { + const url = toUrl(originalUrl); + const transformParams = getTransformParams(url); + + transformParams.w = width ? Math.round(width) : width + transformParams.h = height ? Math.round(height) : height + + if(!transformParams.fm){ + transformParams.fm = 'auto' + } + + if(format){ + transformParams.fm = format + } + + const tr = Object.keys(transformParams).map(key => { + const value = transformParams[key]; + + if(value){ + return `${key}-${value}`; + } + }) + .filter(x => x) + .join(','); + + url.searchParams.set('tr', tr); + + return url; +}; + +export const parse: UrlParser = ( + url, +) => { + const parsed = toUrl(url); + const transformParams = getTransformParams(parsed) + + const width = Number(transformParams.w) || undefined; + const height = Number(transformParams.h) || undefined; + const format = transformParams.fm || undefined; + + parsed.search = ""; + + return { + base: parsed.toString(), + width, + height, + format, + params: transformParams, + cdn: "imagekit", + }; +}; + + diff --git a/src/types.ts b/src/types.ts index a2ab8d3..aa1f37a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -95,6 +95,7 @@ export type ImageCdn = | "contentstack" | "cloudflare_images" | "ipx" - | "netlify"; + | "netlify" + | "imagekit"; export type SupportedImageCdn = ImageCdn; From 150741a8b6ad8d81a10a974326717c3ac4a6836f Mon Sep 17 00:00:00 2001 From: "mixie-bot[bot]" <127146692+mixie-bot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 07:41:58 +0000 Subject: [PATCH 3/3] chore(main): release 3.13.0 (#92) Co-authored-by: mixie-bot[bot] <127146692+mixie-bot[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ version.txt | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52b542c..0ec4240 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [3.13.0](https://github.com/ascorbic/unpic/compare/v3.12.0...v3.13.0) (2023-11-07) + + +### Features + +* add imagekit support ([#91](https://github.com/ascorbic/unpic/issues/91)) ([cb03686](https://github.com/ascorbic/unpic/commit/cb03686afc998cbd106163098397813a114e1cff)) + ## [3.12.0](https://github.com/ascorbic/unpic/compare/v3.11.0...v3.12.0) (2023-10-31) diff --git a/version.txt b/version.txt index 92536a9..4eba2a6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.12.0 +3.13.0