├── .github └── workflows │ ├── ci.yml │ └── publish.yml ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── components │ ├── Image.vue │ └── Video.vue ├── index.ts ├── interface │ └── index.ts └── provider │ ├── ImageKitProvider.vue │ └── keys.ts ├── test-apps ├── express-backend │ ├── index.js │ ├── package-lock.json │ └── package.json ├── nuxt │ ├── .gitignore │ ├── README.md │ ├── app.vue │ ├── components │ │ ├── Other.vue │ │ └── Test.vue │ ├── e2e │ │ ├── __snapshot__ │ │ │ └── basic.spec.ts │ │ │ │ └── Test-case-1.txt │ │ └── basic.spec.ts │ ├── nuxt.config.ts │ ├── package.json │ ├── playwright.config.ts │ ├── public │ │ ├── favicon.ico │ │ └── robots.txt │ ├── server │ │ └── tsconfig.json │ └── tsconfig.json └── vue-ts │ ├── .gitignore │ ├── .vscode │ └── extensions.json │ ├── README.md │ ├── e2e │ ├── __snapshot__ │ │ └── basic.spec.ts │ │ │ └── Test-case-1.txt │ └── basic.spec.ts │ ├── env.d.ts │ ├── index.html │ ├── package.json │ ├── playwright.config.ts │ ├── public │ └── favicon.ico │ ├── src │ ├── App.vue │ ├── components │ │ └── Test.vue │ └── main.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts ├── tsconfig.app.json ├── tsconfig.build.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: 4 | push: 5 | pull_request: 6 | 7 | jobs: 8 | # ───────────────────────────────────────────────────── 9 | # 1. Build the library and create the .tgz once 10 | # ───────────────────────────────────────────────────── 11 | pack: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: ⬇️ Check out code 16 | uses: actions/checkout@v4 17 | 18 | - name: 🟢 Set up Node 20 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: 20.x 22 | cache: npm 23 | 24 | - name: 📦 Install deps, build, pack 25 | run: | 26 | npm ci 27 | npm run build 28 | npm pack # ⇠ generates imagekit-vue-*.tgz in $GITHUB_WORKSPACE 29 | env: 30 | CI: true 31 | 32 | - name: 📤 Upload package artifact 33 | uses: actions/upload-artifact@v4 34 | with: 35 | name: imagekit-package 36 | path: imagekit-vue-*.tgz # uploads exactly one .tgz 37 | 38 | # ───────────────────────────────────────────────────── 39 | # 2. Matrix: run demo-app tests in parallel 40 | # ───────────────────────────────────────────────────── 41 | test: 42 | needs: pack # wait for the tarball 43 | runs-on: ubuntu-latest 44 | 45 | strategy: 46 | matrix: 47 | app: [vue-ts, nuxt] # sub-folders in test-apps 48 | 49 | steps: 50 | - name: ⬇️ Check out code 51 | uses: actions/checkout@v4 52 | 53 | - name: 🟢 Set up Node 20 54 | uses: actions/setup-node@v4 55 | with: 56 | node-version: 20.x 57 | cache: npm 58 | 59 | - name: 📥 Download package artifact 60 | uses: actions/download-artifact@v4 61 | with: 62 | name: imagekit-package # puts .tgz into $GITHUB_WORKSPACE by default 63 | 64 | - name: 🚀 Run E2E tests 65 | run: | 66 | # ── figure out the real .tgz filename (there’s only one) ─────────────── 67 | PKG_TGZ="$(ls "$GITHUB_WORKSPACE"/imagekit-vue-*.tgz)" 68 | echo "Installing $PKG_TGZ" 69 | 70 | # ── now set up the demo app ─────────────────────────────────────────── 71 | cd test-apps/${{ matrix.app }} 72 | npm install 73 | npm install "$PKG_TGZ" --no-save 74 | npx playwright install --with-deps 75 | npm run test:e2e 76 | env: 77 | CI: true 78 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish Package to npmjs 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | publish: 9 | runs-on: ubuntu-latest 10 | permissions: 11 | contents: read 12 | id-token: write 13 | steps: 14 | - name: ⬇️ Check out code 15 | uses: actions/checkout@v4 16 | 17 | - name: Setup .npmrc file to publish to npm 18 | uses: actions/setup-node@v4 19 | with: 20 | node-version: '20.x' 21 | registry-url: 'https://registry.npmjs.org' 22 | 23 | - name: Build and Publish 24 | run: | 25 | npm ci 26 | npm run build 27 | # print the NPM user name for validation 28 | npm whoami 29 | VERSION=$(node -p "require('./package.json').version" ) 30 | # Only publish stable versions to the latest tag 31 | if [[ "$VERSION" =~ ^[^-]+$ ]]; then 32 | NPM_TAG="latest" 33 | else 34 | NPM_TAG="beta" 35 | fi 36 | echo "Publishing $VERSION with $NPM_TAG tag." 37 | npm publish --tag $NPM_TAG --provenance --access public 38 | env: 39 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 40 | CI: true -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | *.tsbuildinfo 31 | 32 | 33 | *.tgz 34 | 35 | .env -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | package-lock.json -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 4.0.0 2 | 3 | This is a major release that includes breaking changes. Please refer to the [official documentation](https://imagekit.io/docs/integration/vuejs) for up-to-date usage instructions. 4 | 5 | ## 3.1.0 6 | 7 | - Added `checks` parameter by [@ankur-dwivedi](https://github.com/ankur-dwivedi) in [#115](https://github.com/imagekit-developer/imagekit-vuejs/pull/115). 8 | 9 | **Full Changelog**: [v3.0.1...v3.1.0](https://github.com/imagekit-developer/imagekit-vuejs/compare/3.0.1...3.1.0) 10 | 11 | --- 12 | 13 | ## 3.0.1 14 | 15 | - Fixed issue [#113](https://github.com/imagekit-developer/imagekit-vuejs/issues/113). 16 | 17 | **Full Changelog**: [v3.0.0...v3.0.1](https://github.com/imagekit-developer/imagekit-vuejs/compare/3.0.0...3.0.1) 18 | 19 | --- 20 | 21 | ## 3.0.0 22 | 23 | - Added support for the `transformation` parameter to apply both **pre-** and **post-** transformations during upload. 24 | - Introduced new parameters: `effectShadow` and `effectGradient`. 25 | - **Breaking Change:** Removed legacy overlay syntax parameters such as `oi`, `ot`, `obg`, etc. 26 | 27 | **Full Changelog**: [v2.0.1...v3.0.0](https://github.com/imagekit-developer/imagekit-vuejs/compare/2.0.1...3.0.0) 28 | 29 | --- 30 | 31 | ## 2.0.1 32 | 33 | - **Vue 3 support:** The SDK now works seamlessly with Vue 3 applications. 34 | - Added video-playback capability. 35 | - Resolved community-reported issues [#33](https://github.com/imagekit-developer/imagekit-vuejs/issues/33), [#34](https://github.com/imagekit-developer/imagekit-vuejs/issues/34), [#42](https://github.com/imagekit-developer/imagekit-vuejs/issues/42), [#44](https://github.com/imagekit-developer/imagekit-vuejs/issues/44), [#47](https://github.com/imagekit-developer/imagekit-vuejs/issues/47), [#49](https://github.com/imagekit-developer/imagekit-vuejs/issues/49) and [#50](https://github.com/imagekit-developer/imagekit-vuejs/issues/50). 36 | 37 | **Full Changelog**: [v2.0.0...v2.0.1](https://github.com/imagekit-developer/imagekit-vuejs/compare/2.0.0...2.0.1) 38 | 39 | --- 40 | 41 | ## 2.0.0 42 | 43 | - **Deprecated release.** This version is marked **“DO NOT USE.”** 44 | 45 | **Full Changelog**: [v1.0.9...v2.0.0](https://github.com/imagekit-developer/imagekit-vuejs/compare/1.0.9...2.0.0) 46 | 47 | --- 48 | 49 | For the complete list of releases and changes, visit the [GitHub Releases Page](https://github.com/imagekit-developer/imagekit-vuejs/releases). 50 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Imagekit 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [ImageKit.io](https://imagekit.io) 2 | 3 | # ImageKit.io Vue.js SDK 4 | 5 | ![Node CI](https://github.com/imagekit-developer/imagekit-vuejs/workflows/Node%20CI/badge.svg) 6 | [![npm version](https://img.shields.io/npm/v/@imagekit/vue)](https://www.npmjs.com/package/@imagekit/vue) 7 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 8 | [![Twitter Follow](https://img.shields.io/twitter/follow/imagekitio?label=Follow&style=social)](https://twitter.com/ImagekitIo) 9 | 10 | ## Introduction 11 | 12 | ImageKit Vue.js SDK provides a simple way to integrate ImageKit.io with your Vue.js/Nuxt applications. It allows you to easily: 13 | - Render images and video with automatic optimization and responsive sizes. 14 | - Apply transformations to images and videos using URL parameters. 15 | - Apply powerful AI-powered image transformations e.g. background removal, generative fill, object cropping, and more. 16 | 17 | ## Installation 18 | 19 | You can install the SDK in your project using npm or yarn. 20 | 21 | ```bash 22 | npm install @imagekit/vue 23 | ``` 24 | 25 | ## TypeScript support 26 | 27 | The SDK provides first-class TypeScript support for Vue projects, giving you robust type-safety and IDE IntelliSense out of the box—no extra configuration required. 28 | 29 | ## Documentation 30 | 31 | Refer to the ImageKit [official documentation](https://imagekit.io/docs/integration/vuejs) for more details on how to use the SDK. 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@imagekit/vue", 3 | "version": "4.0.0", 4 | "main": "dist/index.cjs.js", 5 | "module": "dist/index.es.js", 6 | "types": "dist/index.d.ts", 7 | "files": [ 8 | "dist" 9 | ], 10 | "scripts": { 11 | "dev": "vite", 12 | "build": "vite build", 13 | "type-check": "vue-tsc --build" 14 | }, 15 | "license": "MIT", 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/imagekit-developer/imagekit-vuejs" 19 | }, 20 | "peerDependencies": { 21 | "vue": ">=3.0.0" 22 | }, 23 | "devDependencies": { 24 | "@tsconfig/node22": "^22.0.1", 25 | "@types/node": "^22.14.0", 26 | "@vitejs/plugin-vue": "^5.2.3", 27 | "@vue/tsconfig": "^0.7.0", 28 | "npm-run-all2": "^7.0.2", 29 | "typescript": "~5.8.0", 30 | "vite": "^6.2.4", 31 | "vite-plugin-dts": "^4.5.3", 32 | "vite-plugin-vue-devtools": "^7.7.2", 33 | "vue-tsc": "^2.2.8" 34 | }, 35 | "dependencies": { 36 | "@imagekit/javascript": "^5.1.0" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/components/Image.vue: -------------------------------------------------------------------------------- 1 | 115 | 116 | -------------------------------------------------------------------------------- /src/components/Video.vue: -------------------------------------------------------------------------------- 1 | 66 | 67 | 70 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { GetImageAttributesOptions, ResponsiveImageAttributes, SrcOptions, Transformation, UploadOptions, UploadResponse } from '@imagekit/javascript'; 2 | import { buildSrc, buildTransformationString, getResponsiveImageAttributes, ImageKitAbortError, ImageKitInvalidRequestError, ImageKitServerError, ImageKitUploadNetworkError, upload } from '@imagekit/javascript'; 3 | import Image from './components/Image.vue'; 4 | import Video from './components/Video.vue'; 5 | import ImageKitProvider from './provider/ImageKitProvider.vue'; 6 | import { ImageKitContextKey } from './provider/keys'; 7 | 8 | import type { IKImageProps, IKVideoProps, ImageKitProviderProps } from './interface'; 9 | 10 | export { buildSrc, buildTransformationString, getResponsiveImageAttributes, Image, ImageKitAbortError, ImageKitContextKey, ImageKitInvalidRequestError, ImageKitProvider, ImageKitServerError, ImageKitUploadNetworkError, upload, Video }; 11 | 12 | export type { 13 | GetImageAttributesOptions, IKImageProps, IKVideoProps, 14 | // Vue 3 specific 15 | ImageKitProviderProps, ResponsiveImageAttributes, 16 | // JS SDK types 17 | SrcOptions, 18 | Transformation, 19 | UploadOptions, 20 | UploadResponse 21 | }; -------------------------------------------------------------------------------- /src/interface/index.ts: -------------------------------------------------------------------------------- 1 | import type { GetImageAttributesOptions, SrcOptions } from '@imagekit/javascript'; 2 | 3 | export type IKImageProps = Pick & CommonProps & { 4 | /** 5 | * Set to `false` to disable automatic responsive `srcSet` generation. 6 | * Defaults to `true`. 7 | */ 8 | responsive?: Boolean; 9 | 10 | /** 11 | * The intended display width of the image. 12 | * 13 | * - Accepts a number (e.g. `100`) or a numeric string (e.g. `"100"`). 14 | * - If you pass units such as `"100px"` or a percentage like `"100%"`, the value 15 | * is ignored when generating the `srcSet`. In that case, a broad range of 16 | * widths is produced to cover all possible viewport sizes. 17 | */ 18 | width?: number | `${number}`; 19 | 20 | /** 21 | * Define the sizes of the image at different breakpoints. Used by the browser to choose the most appropriate size from the generated srcset. 22 | */ 23 | sizes?: string; 24 | 25 | /** 26 | * Controls when the image should start loading. 27 | * 28 | * * `lazy` - Defer loading the image until it reaches a calculated distance from the viewport. 29 | * * `eager` - Load the image immediately, regardless of its position in the page. 30 | * 31 | * `lazy` is the default value. 32 | */ 33 | loading?: "lazy" | "eager"; 34 | } 35 | 36 | type CommonProps = { 37 | /** 38 | * Accepts a relative or absolute path of the resource. If a relative path is provided, it is appended to the `urlEndpoint`. 39 | * If an absolute path is provided, `urlEndpoint` is ignored. 40 | */ 41 | src: SrcOptions["src"]; 42 | 43 | /** 44 | * Get your urlEndpoint from the [ImageKit dashboard](https://imagekit.io/dashboard/url-endpoints). 45 | * 46 | * You can also set `urlEndpoint` in the `ImageKitProvider` component, which will be used as a default value for all nested Image and Video components provided by the SDK. 47 | * 48 | * @example 49 | * ```jsx 50 | * import { ImageKitProvider, Image, Video } from "@imagekit/vue"; 51 | * 52 | * 55 | * ``` 56 | */ 57 | urlEndpoint?: SrcOptions["urlEndpoint"]; 58 | 59 | /** 60 | * These are additional query parameters that you want to add to the final URL. 61 | * They can be any query parameters and not necessarily related to ImageKit. 62 | * This is especially useful if you want to add a versioning parameter to your URLs. 63 | */ 64 | queryParameters?: SrcOptions["queryParameters"] 65 | 66 | /** 67 | * An array of objects specifying the transformations to be applied in the URL. If more than one transformation is specified, they are applied in the order they are specified as chained transformations. 68 | * 69 | * {@link https://imagekit.io/docs/transformations#chained-transformations} 70 | */ 71 | transformation?: SrcOptions["transformation"]; 72 | 73 | /** 74 | * By default, the transformation string is added as a `query` parameter in the URL, e.g., `?tr=w-100,h-100`. 75 | * If you want to add the transformation string in the path of the URL, set this to `path`, final URL will look like `https://ik.imagekit.io/your_imagekit_id/tr:w-100,h-100/default-image.jpg`. 76 | */ 77 | transformationPosition?: "path" | "query"; 78 | } 79 | 80 | export type IKVideoProps = CommonProps; 81 | 82 | export type ImageKitProviderProps = Pick 83 | -------------------------------------------------------------------------------- /src/provider/ImageKitProvider.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 17 | -------------------------------------------------------------------------------- /src/provider/keys.ts: -------------------------------------------------------------------------------- 1 | import type { InjectionKey } from "vue"; 2 | import type { ImageKitProviderProps } from "../interface"; 3 | 4 | /** Use the same key everywhere */ 5 | export const ImageKitContextKey: InjectionKey = 6 | Symbol("ImageKitContext"); -------------------------------------------------------------------------------- /test-apps/express-backend/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | const ImageKit = require('imagekit'); // Node.js SDK 4 | const dotenv = require('dotenv'); 5 | dotenv.config(); 6 | 7 | const imagekit = new ImageKit({ 8 | urlEndpoint: 'https://ik.imagekit.io/demo', // https://ik.imagekit.io/your_imagekit_id 9 | publicKey: process.env.IMAGEKIT_PUBLIC_KEY, 10 | privateKey: process.env.IMAGEKIT_PRIVATE_KEY 11 | }); 12 | 13 | // allow cross-origin requests 14 | app.use(function(req, res, next) { 15 | res.header("Access-Control-Allow-Origin", "*"); 16 | res.header("Access-Control-Allow-Headers", 17 | "Origin, X-Requested-With, Content-Type, Accept"); 18 | next(); 19 | }); 20 | 21 | app.get('/auth', function (req, res) { 22 | // Your application logic to authenticate the user 23 | // For example, you can check if the user is logged in or has the necessary permissions 24 | // If the user is not authenticated, you can return an error response 25 | const { token, expire, signature } = imagekit.getAuthenticationParameters(); 26 | res.send({ token, expire, signature, publicKey: process.env.IMAGEKIT_PUBLIC_KEY }); 27 | }); 28 | 29 | app.listen(3001, function () { 30 | console.log('Live at Port 3001'); 31 | }); -------------------------------------------------------------------------------- /test-apps/express-backend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-backend", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "express-backend", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "dotenv": "^16.5.0", 13 | "express": "^5.1.0", 14 | "imagekit": "^6.0.0" 15 | } 16 | }, 17 | "node_modules/accepts": { 18 | "version": "2.0.0", 19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 20 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 21 | "dependencies": { 22 | "mime-types": "^3.0.0", 23 | "negotiator": "^1.0.0" 24 | }, 25 | "engines": { 26 | "node": ">= 0.6" 27 | } 28 | }, 29 | "node_modules/asynckit": { 30 | "version": "0.4.0", 31 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 32 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 33 | }, 34 | "node_modules/axios": { 35 | "version": "1.9.0", 36 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", 37 | "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", 38 | "dependencies": { 39 | "follow-redirects": "^1.15.6", 40 | "form-data": "^4.0.0", 41 | "proxy-from-env": "^1.1.0" 42 | } 43 | }, 44 | "node_modules/body-parser": { 45 | "version": "2.2.0", 46 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", 47 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", 48 | "dependencies": { 49 | "bytes": "^3.1.2", 50 | "content-type": "^1.0.5", 51 | "debug": "^4.4.0", 52 | "http-errors": "^2.0.0", 53 | "iconv-lite": "^0.6.3", 54 | "on-finished": "^2.4.1", 55 | "qs": "^6.14.0", 56 | "raw-body": "^3.0.0", 57 | "type-is": "^2.0.0" 58 | }, 59 | "engines": { 60 | "node": ">=18" 61 | } 62 | }, 63 | "node_modules/bytes": { 64 | "version": "3.1.2", 65 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 66 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 67 | "engines": { 68 | "node": ">= 0.8" 69 | } 70 | }, 71 | "node_modules/call-bind-apply-helpers": { 72 | "version": "1.0.2", 73 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 74 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 75 | "dependencies": { 76 | "es-errors": "^1.3.0", 77 | "function-bind": "^1.1.2" 78 | }, 79 | "engines": { 80 | "node": ">= 0.4" 81 | } 82 | }, 83 | "node_modules/call-bound": { 84 | "version": "1.0.4", 85 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 86 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 87 | "dependencies": { 88 | "call-bind-apply-helpers": "^1.0.2", 89 | "get-intrinsic": "^1.3.0" 90 | }, 91 | "engines": { 92 | "node": ">= 0.4" 93 | }, 94 | "funding": { 95 | "url": "https://github.com/sponsors/ljharb" 96 | } 97 | }, 98 | "node_modules/combined-stream": { 99 | "version": "1.0.8", 100 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 101 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 102 | "dependencies": { 103 | "delayed-stream": "~1.0.0" 104 | }, 105 | "engines": { 106 | "node": ">= 0.8" 107 | } 108 | }, 109 | "node_modules/content-disposition": { 110 | "version": "1.0.0", 111 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", 112 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 113 | "dependencies": { 114 | "safe-buffer": "5.2.1" 115 | }, 116 | "engines": { 117 | "node": ">= 0.6" 118 | } 119 | }, 120 | "node_modules/content-type": { 121 | "version": "1.0.5", 122 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 123 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 124 | "engines": { 125 | "node": ">= 0.6" 126 | } 127 | }, 128 | "node_modules/cookie": { 129 | "version": "0.7.2", 130 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 131 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 132 | "engines": { 133 | "node": ">= 0.6" 134 | } 135 | }, 136 | "node_modules/cookie-signature": { 137 | "version": "1.2.2", 138 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 139 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 140 | "engines": { 141 | "node": ">=6.6.0" 142 | } 143 | }, 144 | "node_modules/debug": { 145 | "version": "4.4.1", 146 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 147 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 148 | "dependencies": { 149 | "ms": "^2.1.3" 150 | }, 151 | "engines": { 152 | "node": ">=6.0" 153 | }, 154 | "peerDependenciesMeta": { 155 | "supports-color": { 156 | "optional": true 157 | } 158 | } 159 | }, 160 | "node_modules/delayed-stream": { 161 | "version": "1.0.0", 162 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 163 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 164 | "engines": { 165 | "node": ">=0.4.0" 166 | } 167 | }, 168 | "node_modules/depd": { 169 | "version": "2.0.0", 170 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 171 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 172 | "engines": { 173 | "node": ">= 0.8" 174 | } 175 | }, 176 | "node_modules/dotenv": { 177 | "version": "16.5.0", 178 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", 179 | "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", 180 | "engines": { 181 | "node": ">=12" 182 | }, 183 | "funding": { 184 | "url": "https://dotenvx.com" 185 | } 186 | }, 187 | "node_modules/dunder-proto": { 188 | "version": "1.0.1", 189 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 190 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 191 | "dependencies": { 192 | "call-bind-apply-helpers": "^1.0.1", 193 | "es-errors": "^1.3.0", 194 | "gopd": "^1.2.0" 195 | }, 196 | "engines": { 197 | "node": ">= 0.4" 198 | } 199 | }, 200 | "node_modules/ee-first": { 201 | "version": "1.1.1", 202 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 203 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 204 | }, 205 | "node_modules/encodeurl": { 206 | "version": "2.0.0", 207 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 208 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 209 | "engines": { 210 | "node": ">= 0.8" 211 | } 212 | }, 213 | "node_modules/es-define-property": { 214 | "version": "1.0.1", 215 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 216 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 217 | "engines": { 218 | "node": ">= 0.4" 219 | } 220 | }, 221 | "node_modules/es-errors": { 222 | "version": "1.3.0", 223 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 224 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 225 | "engines": { 226 | "node": ">= 0.4" 227 | } 228 | }, 229 | "node_modules/es-object-atoms": { 230 | "version": "1.1.1", 231 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 232 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 233 | "dependencies": { 234 | "es-errors": "^1.3.0" 235 | }, 236 | "engines": { 237 | "node": ">= 0.4" 238 | } 239 | }, 240 | "node_modules/es-set-tostringtag": { 241 | "version": "2.1.0", 242 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 243 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 244 | "dependencies": { 245 | "es-errors": "^1.3.0", 246 | "get-intrinsic": "^1.2.6", 247 | "has-tostringtag": "^1.0.2", 248 | "hasown": "^2.0.2" 249 | }, 250 | "engines": { 251 | "node": ">= 0.4" 252 | } 253 | }, 254 | "node_modules/escape-html": { 255 | "version": "1.0.3", 256 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 257 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 258 | }, 259 | "node_modules/etag": { 260 | "version": "1.8.1", 261 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 262 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 263 | "engines": { 264 | "node": ">= 0.6" 265 | } 266 | }, 267 | "node_modules/express": { 268 | "version": "5.1.0", 269 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", 270 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", 271 | "dependencies": { 272 | "accepts": "^2.0.0", 273 | "body-parser": "^2.2.0", 274 | "content-disposition": "^1.0.0", 275 | "content-type": "^1.0.5", 276 | "cookie": "^0.7.1", 277 | "cookie-signature": "^1.2.1", 278 | "debug": "^4.4.0", 279 | "encodeurl": "^2.0.0", 280 | "escape-html": "^1.0.3", 281 | "etag": "^1.8.1", 282 | "finalhandler": "^2.1.0", 283 | "fresh": "^2.0.0", 284 | "http-errors": "^2.0.0", 285 | "merge-descriptors": "^2.0.0", 286 | "mime-types": "^3.0.0", 287 | "on-finished": "^2.4.1", 288 | "once": "^1.4.0", 289 | "parseurl": "^1.3.3", 290 | "proxy-addr": "^2.0.7", 291 | "qs": "^6.14.0", 292 | "range-parser": "^1.2.1", 293 | "router": "^2.2.0", 294 | "send": "^1.1.0", 295 | "serve-static": "^2.2.0", 296 | "statuses": "^2.0.1", 297 | "type-is": "^2.0.1", 298 | "vary": "^1.1.2" 299 | }, 300 | "engines": { 301 | "node": ">= 18" 302 | }, 303 | "funding": { 304 | "type": "opencollective", 305 | "url": "https://opencollective.com/express" 306 | } 307 | }, 308 | "node_modules/finalhandler": { 309 | "version": "2.1.0", 310 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", 311 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 312 | "dependencies": { 313 | "debug": "^4.4.0", 314 | "encodeurl": "^2.0.0", 315 | "escape-html": "^1.0.3", 316 | "on-finished": "^2.4.1", 317 | "parseurl": "^1.3.3", 318 | "statuses": "^2.0.1" 319 | }, 320 | "engines": { 321 | "node": ">= 0.8" 322 | } 323 | }, 324 | "node_modules/follow-redirects": { 325 | "version": "1.15.9", 326 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 327 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 328 | "funding": [ 329 | { 330 | "type": "individual", 331 | "url": "https://github.com/sponsors/RubenVerborgh" 332 | } 333 | ], 334 | "engines": { 335 | "node": ">=4.0" 336 | }, 337 | "peerDependenciesMeta": { 338 | "debug": { 339 | "optional": true 340 | } 341 | } 342 | }, 343 | "node_modules/form-data": { 344 | "version": "4.0.2", 345 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", 346 | "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", 347 | "dependencies": { 348 | "asynckit": "^0.4.0", 349 | "combined-stream": "^1.0.8", 350 | "es-set-tostringtag": "^2.1.0", 351 | "mime-types": "^2.1.12" 352 | }, 353 | "engines": { 354 | "node": ">= 6" 355 | } 356 | }, 357 | "node_modules/form-data/node_modules/mime-db": { 358 | "version": "1.52.0", 359 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 360 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 361 | "engines": { 362 | "node": ">= 0.6" 363 | } 364 | }, 365 | "node_modules/form-data/node_modules/mime-types": { 366 | "version": "2.1.35", 367 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 368 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 369 | "dependencies": { 370 | "mime-db": "1.52.0" 371 | }, 372 | "engines": { 373 | "node": ">= 0.6" 374 | } 375 | }, 376 | "node_modules/forwarded": { 377 | "version": "0.2.0", 378 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 379 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 380 | "engines": { 381 | "node": ">= 0.6" 382 | } 383 | }, 384 | "node_modules/fresh": { 385 | "version": "2.0.0", 386 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 387 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 388 | "engines": { 389 | "node": ">= 0.8" 390 | } 391 | }, 392 | "node_modules/function-bind": { 393 | "version": "1.1.2", 394 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 395 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 396 | "funding": { 397 | "url": "https://github.com/sponsors/ljharb" 398 | } 399 | }, 400 | "node_modules/get-intrinsic": { 401 | "version": "1.3.0", 402 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 403 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 404 | "dependencies": { 405 | "call-bind-apply-helpers": "^1.0.2", 406 | "es-define-property": "^1.0.1", 407 | "es-errors": "^1.3.0", 408 | "es-object-atoms": "^1.1.1", 409 | "function-bind": "^1.1.2", 410 | "get-proto": "^1.0.1", 411 | "gopd": "^1.2.0", 412 | "has-symbols": "^1.1.0", 413 | "hasown": "^2.0.2", 414 | "math-intrinsics": "^1.1.0" 415 | }, 416 | "engines": { 417 | "node": ">= 0.4" 418 | }, 419 | "funding": { 420 | "url": "https://github.com/sponsors/ljharb" 421 | } 422 | }, 423 | "node_modules/get-proto": { 424 | "version": "1.0.1", 425 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 426 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 427 | "dependencies": { 428 | "dunder-proto": "^1.0.1", 429 | "es-object-atoms": "^1.0.0" 430 | }, 431 | "engines": { 432 | "node": ">= 0.4" 433 | } 434 | }, 435 | "node_modules/gopd": { 436 | "version": "1.2.0", 437 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 438 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 439 | "engines": { 440 | "node": ">= 0.4" 441 | }, 442 | "funding": { 443 | "url": "https://github.com/sponsors/ljharb" 444 | } 445 | }, 446 | "node_modules/hamming-distance": { 447 | "version": "1.0.0", 448 | "resolved": "https://registry.npmjs.org/hamming-distance/-/hamming-distance-1.0.0.tgz", 449 | "integrity": "sha512-hYz2IIKtyuZGfOqCs7skNiFEATf+v9IUNSOaQSr6Ll4JOxxWhOvXvc3mIdCW82Z3xW+zUoto7N/ssD4bDxAWoA==" 450 | }, 451 | "node_modules/has-symbols": { 452 | "version": "1.1.0", 453 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 454 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 455 | "engines": { 456 | "node": ">= 0.4" 457 | }, 458 | "funding": { 459 | "url": "https://github.com/sponsors/ljharb" 460 | } 461 | }, 462 | "node_modules/has-tostringtag": { 463 | "version": "1.0.2", 464 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 465 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 466 | "dependencies": { 467 | "has-symbols": "^1.0.3" 468 | }, 469 | "engines": { 470 | "node": ">= 0.4" 471 | }, 472 | "funding": { 473 | "url": "https://github.com/sponsors/ljharb" 474 | } 475 | }, 476 | "node_modules/hasown": { 477 | "version": "2.0.2", 478 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 479 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 480 | "dependencies": { 481 | "function-bind": "^1.1.2" 482 | }, 483 | "engines": { 484 | "node": ">= 0.4" 485 | } 486 | }, 487 | "node_modules/http-errors": { 488 | "version": "2.0.0", 489 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 490 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 491 | "dependencies": { 492 | "depd": "2.0.0", 493 | "inherits": "2.0.4", 494 | "setprototypeof": "1.2.0", 495 | "statuses": "2.0.1", 496 | "toidentifier": "1.0.1" 497 | }, 498 | "engines": { 499 | "node": ">= 0.8" 500 | } 501 | }, 502 | "node_modules/iconv-lite": { 503 | "version": "0.6.3", 504 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 505 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 506 | "dependencies": { 507 | "safer-buffer": ">= 2.1.2 < 3.0.0" 508 | }, 509 | "engines": { 510 | "node": ">=0.10.0" 511 | } 512 | }, 513 | "node_modules/imagekit": { 514 | "version": "6.0.0", 515 | "resolved": "https://registry.npmjs.org/imagekit/-/imagekit-6.0.0.tgz", 516 | "integrity": "sha512-0MsxThZM2PYH6ngwN3zi9PDa8pCB5mEZG2FSySYiZk3Hfri8IMwUqVNzRlLQewBHQ3YtTN9M59O0Xe9HRewtOA==", 517 | "dependencies": { 518 | "axios": "^1.6.5", 519 | "form-data": "^4.0.0", 520 | "hamming-distance": "^1.0.0", 521 | "lodash": "^4.17.15", 522 | "tslib": "^2.4.0", 523 | "uuid": "^8.3.2" 524 | }, 525 | "engines": { 526 | "node": ">=12.0.0" 527 | } 528 | }, 529 | "node_modules/inherits": { 530 | "version": "2.0.4", 531 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 532 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 533 | }, 534 | "node_modules/ipaddr.js": { 535 | "version": "1.9.1", 536 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 537 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 538 | "engines": { 539 | "node": ">= 0.10" 540 | } 541 | }, 542 | "node_modules/is-promise": { 543 | "version": "4.0.0", 544 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 545 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" 546 | }, 547 | "node_modules/lodash": { 548 | "version": "4.17.21", 549 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 550 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 551 | }, 552 | "node_modules/math-intrinsics": { 553 | "version": "1.1.0", 554 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 555 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 556 | "engines": { 557 | "node": ">= 0.4" 558 | } 559 | }, 560 | "node_modules/media-typer": { 561 | "version": "1.1.0", 562 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 563 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 564 | "engines": { 565 | "node": ">= 0.8" 566 | } 567 | }, 568 | "node_modules/merge-descriptors": { 569 | "version": "2.0.0", 570 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 571 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 572 | "engines": { 573 | "node": ">=18" 574 | }, 575 | "funding": { 576 | "url": "https://github.com/sponsors/sindresorhus" 577 | } 578 | }, 579 | "node_modules/mime-db": { 580 | "version": "1.54.0", 581 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 582 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 583 | "engines": { 584 | "node": ">= 0.6" 585 | } 586 | }, 587 | "node_modules/mime-types": { 588 | "version": "3.0.1", 589 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", 590 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", 591 | "dependencies": { 592 | "mime-db": "^1.54.0" 593 | }, 594 | "engines": { 595 | "node": ">= 0.6" 596 | } 597 | }, 598 | "node_modules/ms": { 599 | "version": "2.1.3", 600 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 601 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 602 | }, 603 | "node_modules/negotiator": { 604 | "version": "1.0.0", 605 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 606 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 607 | "engines": { 608 | "node": ">= 0.6" 609 | } 610 | }, 611 | "node_modules/object-inspect": { 612 | "version": "1.13.4", 613 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 614 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 615 | "engines": { 616 | "node": ">= 0.4" 617 | }, 618 | "funding": { 619 | "url": "https://github.com/sponsors/ljharb" 620 | } 621 | }, 622 | "node_modules/on-finished": { 623 | "version": "2.4.1", 624 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 625 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 626 | "dependencies": { 627 | "ee-first": "1.1.1" 628 | }, 629 | "engines": { 630 | "node": ">= 0.8" 631 | } 632 | }, 633 | "node_modules/once": { 634 | "version": "1.4.0", 635 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 636 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 637 | "dependencies": { 638 | "wrappy": "1" 639 | } 640 | }, 641 | "node_modules/parseurl": { 642 | "version": "1.3.3", 643 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 644 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 645 | "engines": { 646 | "node": ">= 0.8" 647 | } 648 | }, 649 | "node_modules/path-to-regexp": { 650 | "version": "8.2.0", 651 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", 652 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", 653 | "engines": { 654 | "node": ">=16" 655 | } 656 | }, 657 | "node_modules/proxy-addr": { 658 | "version": "2.0.7", 659 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 660 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 661 | "dependencies": { 662 | "forwarded": "0.2.0", 663 | "ipaddr.js": "1.9.1" 664 | }, 665 | "engines": { 666 | "node": ">= 0.10" 667 | } 668 | }, 669 | "node_modules/proxy-from-env": { 670 | "version": "1.1.0", 671 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 672 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 673 | }, 674 | "node_modules/qs": { 675 | "version": "6.14.0", 676 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 677 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 678 | "dependencies": { 679 | "side-channel": "^1.1.0" 680 | }, 681 | "engines": { 682 | "node": ">=0.6" 683 | }, 684 | "funding": { 685 | "url": "https://github.com/sponsors/ljharb" 686 | } 687 | }, 688 | "node_modules/range-parser": { 689 | "version": "1.2.1", 690 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 691 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 692 | "engines": { 693 | "node": ">= 0.6" 694 | } 695 | }, 696 | "node_modules/raw-body": { 697 | "version": "3.0.0", 698 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 699 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 700 | "dependencies": { 701 | "bytes": "3.1.2", 702 | "http-errors": "2.0.0", 703 | "iconv-lite": "0.6.3", 704 | "unpipe": "1.0.0" 705 | }, 706 | "engines": { 707 | "node": ">= 0.8" 708 | } 709 | }, 710 | "node_modules/router": { 711 | "version": "2.2.0", 712 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", 713 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", 714 | "dependencies": { 715 | "debug": "^4.4.0", 716 | "depd": "^2.0.0", 717 | "is-promise": "^4.0.0", 718 | "parseurl": "^1.3.3", 719 | "path-to-regexp": "^8.0.0" 720 | }, 721 | "engines": { 722 | "node": ">= 18" 723 | } 724 | }, 725 | "node_modules/safe-buffer": { 726 | "version": "5.2.1", 727 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 728 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 729 | "funding": [ 730 | { 731 | "type": "github", 732 | "url": "https://github.com/sponsors/feross" 733 | }, 734 | { 735 | "type": "patreon", 736 | "url": "https://www.patreon.com/feross" 737 | }, 738 | { 739 | "type": "consulting", 740 | "url": "https://feross.org/support" 741 | } 742 | ] 743 | }, 744 | "node_modules/safer-buffer": { 745 | "version": "2.1.2", 746 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 747 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 748 | }, 749 | "node_modules/send": { 750 | "version": "1.2.0", 751 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", 752 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", 753 | "dependencies": { 754 | "debug": "^4.3.5", 755 | "encodeurl": "^2.0.0", 756 | "escape-html": "^1.0.3", 757 | "etag": "^1.8.1", 758 | "fresh": "^2.0.0", 759 | "http-errors": "^2.0.0", 760 | "mime-types": "^3.0.1", 761 | "ms": "^2.1.3", 762 | "on-finished": "^2.4.1", 763 | "range-parser": "^1.2.1", 764 | "statuses": "^2.0.1" 765 | }, 766 | "engines": { 767 | "node": ">= 18" 768 | } 769 | }, 770 | "node_modules/serve-static": { 771 | "version": "2.2.0", 772 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", 773 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", 774 | "dependencies": { 775 | "encodeurl": "^2.0.0", 776 | "escape-html": "^1.0.3", 777 | "parseurl": "^1.3.3", 778 | "send": "^1.2.0" 779 | }, 780 | "engines": { 781 | "node": ">= 18" 782 | } 783 | }, 784 | "node_modules/setprototypeof": { 785 | "version": "1.2.0", 786 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 787 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 788 | }, 789 | "node_modules/side-channel": { 790 | "version": "1.1.0", 791 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 792 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 793 | "dependencies": { 794 | "es-errors": "^1.3.0", 795 | "object-inspect": "^1.13.3", 796 | "side-channel-list": "^1.0.0", 797 | "side-channel-map": "^1.0.1", 798 | "side-channel-weakmap": "^1.0.2" 799 | }, 800 | "engines": { 801 | "node": ">= 0.4" 802 | }, 803 | "funding": { 804 | "url": "https://github.com/sponsors/ljharb" 805 | } 806 | }, 807 | "node_modules/side-channel-list": { 808 | "version": "1.0.0", 809 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 810 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 811 | "dependencies": { 812 | "es-errors": "^1.3.0", 813 | "object-inspect": "^1.13.3" 814 | }, 815 | "engines": { 816 | "node": ">= 0.4" 817 | }, 818 | "funding": { 819 | "url": "https://github.com/sponsors/ljharb" 820 | } 821 | }, 822 | "node_modules/side-channel-map": { 823 | "version": "1.0.1", 824 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 825 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 826 | "dependencies": { 827 | "call-bound": "^1.0.2", 828 | "es-errors": "^1.3.0", 829 | "get-intrinsic": "^1.2.5", 830 | "object-inspect": "^1.13.3" 831 | }, 832 | "engines": { 833 | "node": ">= 0.4" 834 | }, 835 | "funding": { 836 | "url": "https://github.com/sponsors/ljharb" 837 | } 838 | }, 839 | "node_modules/side-channel-weakmap": { 840 | "version": "1.0.2", 841 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 842 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 843 | "dependencies": { 844 | "call-bound": "^1.0.2", 845 | "es-errors": "^1.3.0", 846 | "get-intrinsic": "^1.2.5", 847 | "object-inspect": "^1.13.3", 848 | "side-channel-map": "^1.0.1" 849 | }, 850 | "engines": { 851 | "node": ">= 0.4" 852 | }, 853 | "funding": { 854 | "url": "https://github.com/sponsors/ljharb" 855 | } 856 | }, 857 | "node_modules/statuses": { 858 | "version": "2.0.1", 859 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 860 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 861 | "engines": { 862 | "node": ">= 0.8" 863 | } 864 | }, 865 | "node_modules/toidentifier": { 866 | "version": "1.0.1", 867 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 868 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 869 | "engines": { 870 | "node": ">=0.6" 871 | } 872 | }, 873 | "node_modules/tslib": { 874 | "version": "2.8.1", 875 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 876 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 877 | }, 878 | "node_modules/type-is": { 879 | "version": "2.0.1", 880 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", 881 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", 882 | "dependencies": { 883 | "content-type": "^1.0.5", 884 | "media-typer": "^1.1.0", 885 | "mime-types": "^3.0.0" 886 | }, 887 | "engines": { 888 | "node": ">= 0.6" 889 | } 890 | }, 891 | "node_modules/unpipe": { 892 | "version": "1.0.0", 893 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 894 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 895 | "engines": { 896 | "node": ">= 0.8" 897 | } 898 | }, 899 | "node_modules/uuid": { 900 | "version": "8.3.2", 901 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 902 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 903 | "bin": { 904 | "uuid": "dist/bin/uuid" 905 | } 906 | }, 907 | "node_modules/vary": { 908 | "version": "1.1.2", 909 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 910 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 911 | "engines": { 912 | "node": ">= 0.8" 913 | } 914 | }, 915 | "node_modules/wrappy": { 916 | "version": "1.0.2", 917 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 918 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 919 | } 920 | } 921 | } 922 | -------------------------------------------------------------------------------- /test-apps/express-backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-backend", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "start": "node index.js" 7 | }, 8 | "author": "", 9 | "license": "ISC", 10 | "description": "", 11 | "dependencies": { 12 | "dotenv": "^16.5.0", 13 | "express": "^5.1.0", 14 | "imagekit": "^6.0.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /test-apps/nuxt/.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .data 4 | .nuxt 5 | .nitro 6 | .cache 7 | dist 8 | 9 | # Node dependencies 10 | node_modules 11 | 12 | # Logs 13 | logs 14 | *.log 15 | 16 | # Misc 17 | .DS_Store 18 | .fleet 19 | .idea 20 | 21 | # Local env files 22 | .env 23 | .env.* 24 | !.env.example 25 | 26 | package-lock.json 27 | /blob-report/ 28 | /coverage 29 | /playwright/.cache/ 30 | /playwright-report/ 31 | /test-results/ -------------------------------------------------------------------------------- /test-apps/nuxt/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt Minimal Starter 2 | 3 | Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. 4 | 5 | ## Setup 6 | 7 | Make sure to install dependencies: 8 | 9 | ```bash 10 | # npm 11 | npm install 12 | 13 | # pnpm 14 | pnpm install 15 | 16 | # yarn 17 | yarn install 18 | 19 | # bun 20 | bun install 21 | ``` 22 | 23 | ## Development Server 24 | 25 | Start the development server on `http://localhost:3000`: 26 | 27 | ```bash 28 | # npm 29 | npm run dev 30 | 31 | # pnpm 32 | pnpm dev 33 | 34 | # yarn 35 | yarn dev 36 | 37 | # bun 38 | bun run dev 39 | ``` 40 | 41 | ## Production 42 | 43 | Build the application for production: 44 | 45 | ```bash 46 | # npm 47 | npm run build 48 | 49 | # pnpm 50 | pnpm build 51 | 52 | # yarn 53 | yarn build 54 | 55 | # bun 56 | bun run build 57 | ``` 58 | 59 | Locally preview production build: 60 | 61 | ```bash 62 | # npm 63 | npm run preview 64 | 65 | # pnpm 66 | pnpm preview 67 | 68 | # yarn 69 | yarn preview 70 | 71 | # bun 72 | bun run preview 73 | ``` 74 | 75 | Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. 76 | -------------------------------------------------------------------------------- /test-apps/nuxt/app.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /test-apps/nuxt/components/Other.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | -------------------------------------------------------------------------------- /test-apps/nuxt/components/Test.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 236 | 237 | -------------------------------------------------------------------------------- /test-apps/nuxt/e2e/__snapshot__/basic.spec.ts/Test-case-1.txt: -------------------------------------------------------------------------------- 1 |

Image

Image without ImageKit providerImage with ImageKit providerCustom srcset ignoredImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classNameImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

Video

-------------------------------------------------------------------------------- /test-apps/nuxt/e2e/basic.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from "@playwright/test"; 2 | 3 | test("Test case", async ({ page }) => { 4 | await page.goto("/"); 5 | 6 | // Scroll to the bottom of the page 7 | await page.evaluate(() => { 8 | window.scrollTo(0, document.body.scrollHeight); 9 | }); 10 | 11 | await page.waitForTimeout(2000); // Wait for 2 seconds 12 | 13 | 14 | // Locate the output element (adjust selector as needed) 15 | const outputElement = page.locator('.container'); 16 | 17 | // Grab the entire HTML from the element 18 | const outputHtml = await outputElement.evaluate(el => el.outerHTML); 19 | 20 | // Compare against a stored snapshot 21 | expect(outputHtml).toMatchSnapshot(); 22 | }); 23 | -------------------------------------------------------------------------------- /test-apps/nuxt/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | // https://nuxt.com/docs/api/configuration/nuxt-config 2 | export default defineNuxtConfig({ 3 | compatibilityDate: '2025-05-15', 4 | devtools: { enabled: true }, 5 | modules: ['@nuxt/image', '@nuxt/content'] 6 | }) -------------------------------------------------------------------------------- /test-apps/nuxt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nuxt-app", 3 | "private": true, 4 | "type": "module", 5 | "scripts": { 6 | "build": "nuxt build", 7 | "start": "npm run build && npm run preview", 8 | "dev": "nuxt dev", 9 | "generate": "nuxt generate", 10 | "preview": "nuxt preview", 11 | "postinstall": "nuxt prepare", 12 | "test:e2e": "playwright test", 13 | "test:e2e-update": "playwright test --update-snapshots" 14 | }, 15 | "dependencies": { 16 | "@nuxt/content": "^3.5.1", 17 | "@nuxt/image": "^1.10.0", 18 | "nuxt": "^3.17.3", 19 | "vue": "^3.5.13", 20 | "vue-router": "^4.5.1" 21 | }, 22 | "devDependencies": { 23 | "@playwright/test": "^1.52.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /test-apps/nuxt/playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, devices } from "@playwright/test"; 2 | import path from "path"; 3 | 4 | // Use process.env.PORT by default and fallback to port 3000 5 | const PORT = process.env.PORT || 3000; 6 | 7 | // Set webServer.url and use.baseURL with the location of the WebServer respecting the correct set port 8 | const baseURL = `http://localhost:${PORT}`; 9 | 10 | // Reference: https://playwright.dev/docs/test-configuration 11 | 12 | const config = { 13 | // Timeout per test 14 | timeout: 30 * 1000, 15 | // Test directory 16 | testDir: path.join("e2e"), 17 | // If a test fails, retry it additional 2 times 18 | retries: 2, 19 | // Artifacts folder where screenshots, videos, and traces are stored. 20 | outputDir: "test-results/", 21 | 22 | // Single template for all assertions 23 | snapshotPathTemplate: '{testDir}/__snapshot__/{testFilePath}/{arg}{ext}', 24 | 25 | // Run your local dev server before starting the tests: 26 | // https://playwright.dev/docs/test-advanced#launching-a-development-web-server-during-the-tests 27 | webServer: { 28 | command: "npm run start", 29 | url: baseURL, 30 | timeout: 120 * 1000, 31 | reuseExistingServer: !process.env.CI, 32 | }, 33 | 34 | use: { 35 | // Use baseURL so to make navigations relative. 36 | // More information: https://playwright.dev/docs/api/class-testoptions#test-options-base-url 37 | baseURL, 38 | 39 | // Retry a test if its failing with enabled tracing. This allows you to analyze the DOM, console logs, network traffic etc. 40 | // More information: https://playwright.dev/docs/trace-viewer 41 | // trace: "retry-with-trace", 42 | 43 | // All available context options: https://playwright.dev/docs/api/class-browser#browser-new-context 44 | // contextOptions: { 45 | // ignoreHTTPSErrors: true, 46 | // }, 47 | }, 48 | 49 | projects: [ 50 | { 51 | name: "Desktop Chrome", 52 | use: { 53 | ...devices["Desktop Chrome"], 54 | }, 55 | }, 56 | // { 57 | // name: 'Desktop Firefox', 58 | // use: { 59 | // ...devices['Desktop Firefox'], 60 | // }, 61 | // }, 62 | // { 63 | // name: 'Desktop Safari', 64 | // use: { 65 | // ...devices['Desktop Safari'], 66 | // }, 67 | // }, 68 | // Test against mobile viewports. 69 | // { 70 | // name: "Mobile Chrome", 71 | // use: { 72 | // ...devices["Pixel 5"], 73 | // }, 74 | // }, 75 | // { 76 | // name: "Mobile Safari", 77 | // use: devices["iPhone 12"], 78 | // }, 79 | ], 80 | } 81 | export default defineConfig(config); 82 | -------------------------------------------------------------------------------- /test-apps/nuxt/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imagekit-developer/imagekit-vuejs/5ef71138a33713c5ab0b06a2c8d18ffc090c2c78/test-apps/nuxt/public/favicon.ico -------------------------------------------------------------------------------- /test-apps/nuxt/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-Agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /test-apps/nuxt/server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../.nuxt/tsconfig.server.json" 3 | } 4 | -------------------------------------------------------------------------------- /test-apps/nuxt/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://nuxt.com/docs/guide/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /test-apps/vue-ts/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | *.tsbuildinfo 31 | 32 | package-lock.json 33 | 34 | /blob-report/ 35 | /coverage 36 | /playwright/.cache/ 37 | /playwright-report/ 38 | /test-results/ -------------------------------------------------------------------------------- /test-apps/vue-ts/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /test-apps/vue-ts/README.md: -------------------------------------------------------------------------------- 1 | # . 2 | 3 | This template should help get you started developing with Vue 3 in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). 8 | 9 | ## Type Support for `.vue` Imports in TS 10 | 11 | TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. 12 | 13 | ## Customize configuration 14 | 15 | See [Vite Configuration Reference](https://vite.dev/config/). 16 | 17 | ## Project Setup 18 | 19 | ```sh 20 | npm install 21 | ``` 22 | 23 | ### Compile and Hot-Reload for Development 24 | 25 | ```sh 26 | npm run dev 27 | ``` 28 | 29 | ### Type-Check, Compile and Minify for Production 30 | 31 | ```sh 32 | npm run build 33 | ``` 34 | -------------------------------------------------------------------------------- /test-apps/vue-ts/e2e/__snapshot__/basic.spec.ts/Test-case-1.txt: -------------------------------------------------------------------------------- 1 |

Image

Image without ImageKit providerImage with ImageKit providerCustom srcset ignoredImage with width not number, should produce larger srcsetWith transformationImage with queryParametersResponsive image with sizesResponsive image with sizes - should have very large srcset for all breakpointsImage with urlEndpoint overrideImage with classNameImage with lazy loading eagerImage with path transformationImage with path transformation + custom transformationspath not respected with absolute urlNo widthCustom deviceBreakpointsImage with responsive off

Video

-------------------------------------------------------------------------------- /test-apps/vue-ts/e2e/basic.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from "@playwright/test"; 2 | 3 | test("Test case", async ({ page }) => { 4 | await page.goto("/"); 5 | 6 | // Scroll to the bottom of the page 7 | await page.evaluate(() => { 8 | window.scrollTo(0, document.body.scrollHeight); 9 | }); 10 | 11 | await page.waitForTimeout(2000); // Wait for 2 seconds 12 | 13 | 14 | // Locate the output element (adjust selector as needed) 15 | const outputElement = page.locator('.container'); 16 | 17 | // Grab the entire HTML from the element 18 | const outputHtml = await outputElement.evaluate(el => el.outerHTML); 19 | 20 | // Compare against a stored snapshot 21 | expect(outputHtml).toMatchSnapshot(); 22 | }); 23 | -------------------------------------------------------------------------------- /test-apps/vue-ts/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /test-apps/vue-ts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /test-apps/vue-ts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "run-p type-check \"build-only {@}\" --", 9 | "start": "npm run build && npm run preview", 10 | "preview": "vite preview", 11 | "build-only": "vite build", 12 | "type-check": "vue-tsc --build", 13 | "test:e2e": "playwright test", 14 | "test:e2e-update": "playwright test --update-snapshots" 15 | }, 16 | "dependencies": { 17 | "@playwright/test": "^1.52.0", 18 | "vue": "^3.5.13" 19 | }, 20 | "devDependencies": { 21 | "@tsconfig/node22": "^22.0.1", 22 | "@types/node": "^22.14.0", 23 | "@vitejs/plugin-vue": "^5.2.3", 24 | "@vue/tsconfig": "^0.7.0", 25 | "npm-run-all2": "^7.0.2", 26 | "typescript": "~5.8.0", 27 | "vite": "^6.2.4", 28 | "vite-plugin-vue-devtools": "^7.7.2", 29 | "vue-tsc": "^2.2.8" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /test-apps/vue-ts/playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, devices } from "@playwright/test"; 2 | import path from "path"; 3 | 4 | // Use process.env.PORT by default and fallback to port 3000 5 | const PORT = process.env.PORT || 4173; 6 | 7 | // Set webServer.url and use.baseURL with the location of the WebServer respecting the correct set port 8 | const baseURL = `http://localhost:${PORT}`; 9 | 10 | // Reference: https://playwright.dev/docs/test-configuration 11 | 12 | const config = { 13 | // Timeout per test 14 | timeout: 30 * 1000, 15 | // Test directory 16 | testDir: path.join("e2e"), 17 | // If a test fails, retry it additional 2 times 18 | retries: 2, 19 | // Artifacts folder where screenshots, videos, and traces are stored. 20 | outputDir: "test-results/", 21 | 22 | // Single template for all assertions 23 | snapshotPathTemplate: '{testDir}/__snapshot__/{testFilePath}/{arg}{ext}', 24 | 25 | // Run your local dev server before starting the tests: 26 | // https://playwright.dev/docs/test-advanced#launching-a-development-web-server-during-the-tests 27 | webServer: { 28 | command: "npm run start", 29 | url: baseURL, 30 | timeout: 120 * 1000, 31 | reuseExistingServer: !process.env.CI, 32 | }, 33 | 34 | use: { 35 | // Use baseURL so to make navigations relative. 36 | // More information: https://playwright.dev/docs/api/class-testoptions#test-options-base-url 37 | baseURL, 38 | 39 | // Retry a test if its failing with enabled tracing. This allows you to analyze the DOM, console logs, network traffic etc. 40 | // More information: https://playwright.dev/docs/trace-viewer 41 | // trace: "retry-with-trace", 42 | 43 | // All available context options: https://playwright.dev/docs/api/class-browser#browser-new-context 44 | // contextOptions: { 45 | // ignoreHTTPSErrors: true, 46 | // }, 47 | }, 48 | 49 | projects: [ 50 | { 51 | name: "Desktop Chrome", 52 | use: { 53 | ...devices["Desktop Chrome"], 54 | }, 55 | }, 56 | // { 57 | // name: 'Desktop Firefox', 58 | // use: { 59 | // ...devices['Desktop Firefox'], 60 | // }, 61 | // }, 62 | // { 63 | // name: 'Desktop Safari', 64 | // use: { 65 | // ...devices['Desktop Safari'], 66 | // }, 67 | // }, 68 | // Test against mobile viewports. 69 | // { 70 | // name: "Mobile Chrome", 71 | // use: { 72 | // ...devices["Pixel 5"], 73 | // }, 74 | // }, 75 | // { 76 | // name: "Mobile Safari", 77 | // use: devices["iPhone 12"], 78 | // }, 79 | ], 80 | } 81 | export default defineConfig(config); 82 | -------------------------------------------------------------------------------- /test-apps/vue-ts/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imagekit-developer/imagekit-vuejs/5ef71138a33713c5ab0b06a2c8d18ffc090c2c78/test-apps/vue-ts/public/favicon.ico -------------------------------------------------------------------------------- /test-apps/vue-ts/src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /test-apps/vue-ts/src/components/Test.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 236 | 237 | -------------------------------------------------------------------------------- /test-apps/vue-ts/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | createApp(App).mount('#app') 5 | -------------------------------------------------------------------------------- /test-apps/vue-ts/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], 4 | "exclude": ["src/**/__tests__/*"], 5 | "compilerOptions": { 6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 7 | 8 | "paths": { 9 | "@/*": ["./src/*"] 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /test-apps/vue-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.node.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /test-apps/vue-ts/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node22/tsconfig.json", 3 | "include": [ 4 | "vite.config.*", 5 | "vitest.config.*", 6 | "cypress.config.*", 7 | "nightwatch.conf.*", 8 | "playwright.config.*", 9 | "eslint.config.*" 10 | ], 11 | "compilerOptions": { 12 | "noEmit": true, 13 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 14 | 15 | "module": "ESNext", 16 | "moduleResolution": "Bundler", 17 | "types": ["node"] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /test-apps/vue-ts/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | import vueDevTools from 'vite-plugin-vue-devtools' 6 | 7 | // https://vite.dev/config/ 8 | export default defineConfig({ 9 | plugins: [ 10 | vue(), 11 | vueDevTools(), 12 | ], 13 | resolve: { 14 | alias: { 15 | '@': fileURLToPath(new URL('./src', import.meta.url)) 16 | }, 17 | }, 18 | }) 19 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], 4 | "exclude": ["src/**/__tests__/*"], 5 | "compilerOptions": { 6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 7 | "paths": { 8 | "@/*": ["./src/*"] 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.app.json", 3 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.node.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node22/tsconfig.json", 3 | "include": [ 4 | "vite.config.*", 5 | "vitest.config.*", 6 | "cypress.config.*", 7 | "nightwatch.conf.*", 8 | "playwright.config.*", 9 | "eslint.config.*" 10 | ], 11 | "compilerOptions": { 12 | "noEmit": true, 13 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 14 | 15 | "module": "ESNext", 16 | "moduleResolution": "Bundler", 17 | "types": ["node"] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | // Basic config 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | import dts from 'vite-plugin-dts' 6 | import { resolve } from 'path' 7 | 8 | 9 | export default defineConfig({ 10 | plugins: [ 11 | vue(), 12 | dts({ 13 | tsconfigPath: './tsconfig.build.json', 14 | }) 15 | ], 16 | build: { 17 | lib: { 18 | entry: resolve(__dirname, 'src/index.ts'), 19 | name: 'VueImagekit', 20 | formats: ['es', 'umd', 'cjs'], 21 | fileName: format => `index.${format}.js` 22 | }, 23 | rollupOptions: { 24 | external: ['vue'], 25 | 26 | output: { 27 | globals: { 28 | vue: 'Vue', 29 | }, 30 | }, 31 | } 32 | }, 33 | }) --------------------------------------------------------------------------------