fork of hey-api/openapi-ts because I need some additional things

Merge pull request #456 from hey-api/feat/client-axios

Client packages 📦

authored by

Lubos and committed by
GitHub
ab776958 09935b43

+1788 -428
+1
.nvmrc
··· 1 + 20.9.0
+2 -1
.prettierignore
··· 2 2 **/node_modules 3 3 **/templates 4 4 **/dist 5 - **/.vitepress 5 + **/.vitepress/cache 6 + **/.vitepress/dist 6 7 **/test/e2e 7 8 8 9 **/CHANGELOG.md
+22 -12
docs/.vitepress/config/en.ts
··· 1 1 import { defineConfig } from 'vitepress'; 2 2 3 3 export default defineConfig({ 4 - description: 'Turn your OpenAPI specification into a beautiful TypeScript client', 4 + description: 5 + 'Turn your OpenAPI specification into a beautiful TypeScript client', 5 6 lang: 'en-US', 6 7 themeConfig: { 7 8 sidebar: [ 8 9 { 9 - text: 'openapi-ts', 10 10 items: [ 11 - { text: 'Get Started', link: '/openapi-ts/get-started' }, 12 - { text: 'Configuration', link: '/openapi-ts/configuration' }, 13 - { text: 'Clients <span class="soon">soon</span>', link: '/openapi-ts/clients' }, 14 - { text: 'Interceptors', link: '/openapi-ts/interceptors' }, 15 - { text: 'Integrations <span class="soon">soon</span>', link: '/openapi-ts/integrations' }, 16 - { text: 'TanStack Query <span class="soon">soon</span>', link: '/openapi-ts/tanstack-query' }, 17 - { text: 'Migrating', link: '/openapi-ts/migrating' }, 11 + { link: '/openapi-ts/get-started', text: 'Get Started' }, 12 + { link: '/openapi-ts/configuration', text: 'Configuration' }, 13 + { 14 + link: '/openapi-ts/clients', 15 + text: 'Clients <span class="soon">soon</span>', 16 + }, 17 + { link: '/openapi-ts/interceptors', text: 'Interceptors' }, 18 + { 19 + link: '/openapi-ts/integrations', 20 + text: 'Integrations <span class="soon">soon</span>', 21 + }, 22 + { 23 + link: '/openapi-ts/tanstack-query', 24 + text: 'TanStack Query <span class="soon">soon</span>', 25 + }, 26 + { link: '/openapi-ts/migrating', text: 'Migrating' }, 18 27 ], 28 + text: 'openapi-ts', 19 29 }, 20 30 { 21 - text: '@hey-api', 22 31 items: [ 23 - { text: 'Philosophy', link: '/about' }, 24 - { text: 'Contributing', link: '/contributing' }, 32 + { link: '/about', text: 'Philosophy' }, 33 + { link: '/contributing', text: 'Contributing' }, 25 34 ], 35 + text: '@hey-api', 26 36 }, 27 37 ], 28 38 },
+4 -4
docs/.vitepress/config/index.ts
··· 4 4 import shared from './shared'; 5 5 6 6 export default defineConfig({ 7 - ...shared, 8 - locales: { 9 - root: { label: 'English', ...en }, 10 - }, 7 + ...shared, 8 + locales: { 9 + root: { label: 'English', ...en }, 10 + }, 11 11 });
+36 -25
docs/.vitepress/config/shared.ts
··· 1 1 import { defineConfig } from 'vitepress'; 2 2 3 3 export default defineConfig({ 4 - title: 'Hey API', 5 - lastUpdated: false, 6 - sitemap: { 7 - hostname: 'https://heyapi.vercel.app', 4 + head: [ 5 + ['link', { href: '/logo.png', rel: 'icon', type: 'image/png' }], 6 + ['meta', { content: 'website', property: 'og:type' }], 7 + ['meta', { content: 'en', property: 'og:locale' }], 8 + [ 9 + 'meta', 10 + { 11 + content: 12 + 'Turn your OpenAPI specification into a beautiful TypeScript client', 13 + property: 'og:title', 14 + }, 15 + ], 16 + ['meta', { content: 'OpenAPI TypeScript', property: 'og:site_name' }], 17 + ['meta', { content: '/logo.png', property: 'og:image' }], 18 + ['meta', { content: 'https://heyapi.vercel.app', property: 'og:url' }], 19 + [ 20 + 'script', 21 + {}, 22 + 'window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };', 23 + ], 24 + ['script', { defer: '', src: '/_vercel/insights/script.js' }], 25 + ], 26 + lastUpdated: false, 27 + sitemap: { 28 + hostname: 'https://heyapi.vercel.app', 29 + }, 30 + themeConfig: { 31 + externalLinkIcon: true, 32 + logo: '/logo.png', 33 + search: { 34 + provider: 'local', 8 35 }, 9 - head: [ 10 - ['link', { rel: 'icon', type: 'image/png', href: '/logo.png' }], 11 - ['meta', { property: 'og:type', content: 'website' }], 12 - ['meta', { property: 'og:locale', content: 'en' }], 13 - ['meta', { property: 'og:title', content: 'Turn your OpenAPI specification into a beautiful TypeScript client' }], 14 - ['meta', { property: 'og:site_name', content: 'OpenAPI TypeScript' }], 15 - ['meta', { property: 'og:image', content: '/logo.png' }], 16 - ['meta', { property: 'og:url', content: 'https://heyapi.vercel.app' }], 17 - ['script', {}, 'window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };'], 18 - ['script', { defer: '', src: '/_vercel/insights/script.js' }], 36 + socialLinks: [ 37 + { icon: 'npm', link: 'https://npmjs.com/package/@hey-api/openapi-ts' }, 38 + { icon: 'github', link: 'https://github.com/hey-api/openapi-ts' }, 19 39 ], 20 - themeConfig: { 21 - externalLinkIcon: true, 22 - logo: '/logo.png', 23 - socialLinks: [ 24 - { icon: 'npm', link: 'https://npmjs.com/package/@hey-api/openapi-ts' }, 25 - { icon: 'github', link: 'https://github.com/hey-api/openapi-ts' }, 26 - ], 27 - search: { 28 - provider: 'local', 29 - } 30 - } 40 + }, 41 + title: 'Hey API', 31 42 });
+19 -19
docs/.vitepress/theme/custom.css
··· 1 1 :root { 2 - --c-gradient-start: #d486b8; 3 - --vp-c-brand-1: #a37ab4; 4 - --vp-c-brand-2: #d486b8; 5 - --vp-c-brand-3: #a37ab4; 2 + --c-gradient-start: #d486b8; 3 + --vp-c-brand-1: #a37ab4; 4 + --vp-c-brand-2: #d486b8; 5 + --vp-c-brand-3: #a37ab4; 6 6 } 7 7 8 8 html.dark { 9 - --c-gradient-start: #86b9b0; 10 - --vp-c-bg: #001b2e; 11 - --vp-c-bg-alt: #041421; 12 - --vp-c-bg-soft: #041421; 13 - --vp-c-brand-1: #b3cde4; 14 - --vp-c-brand-2: #b3cde4; 15 - --vp-c-brand-3: #537692; 9 + --c-gradient-start: #86b9b0; 10 + --vp-c-bg: #001b2e; 11 + --vp-c-bg-alt: #041421; 12 + --vp-c-bg-soft: #041421; 13 + --vp-c-brand-1: #b3cde4; 14 + --vp-c-brand-2: #b3cde4; 15 + --vp-c-brand-3: #537692; 16 16 } 17 17 18 18 .soon { 19 - background-color: var(--vp-button-brand-bg); 20 - border-radius: 1em; 21 - color: var(--vp-button-brand-text); 22 - font-size: .6em; 23 - padding: .2em .4em; 24 - position: relative; 25 - text-transform: lowercase; 26 - top: -1em; 19 + background-color: var(--vp-button-brand-bg); 20 + border-radius: 1em; 21 + color: var(--vp-button-brand-text); 22 + font-size: 0.6em; 23 + padding: 0.2em 0.4em; 24 + position: relative; 25 + text-transform: lowercase; 26 + top: -1em; 27 27 }
+2 -1
docs/.vitepress/theme/index.js
··· 1 + import './custom.css'; 2 + 1 3 import DefaultTheme from 'vitepress/theme'; 2 - import './custom.css'; 3 4 4 5 export default DefaultTheme;
+1 -1
docs/CHANGELOG.md
··· 1 - # openapi-ts-docs 1 + # @hey-api/docs 2 2 3 3 ## 0.5.2 4 4
+1 -1
docs/package.json
··· 1 1 { 2 - "name": "openapi-ts-docs", 2 + "name": "@hey-api/docs", 3 3 "version": "0.5.2", 4 4 "description": "Documentation for OpenaAPI TypeScript.", 5 5 "private": true,
+24 -4
package.json
··· 16 16 "scripts": { 17 17 "build": "pnpm --recursive build", 18 18 "changeset": "changeset", 19 - "docs": "pnpm --filter openapi-ts-docs --", 19 + "client-axios": "pnpm --filter @hey-api/client-axios --", 20 + "client-core": "pnpm --filter @hey-api/client-core --", 21 + "client-fetch": "pnpm --filter @hey-api/client-fetch --", 22 + "client-nextjs": "pnpm --filter @hey-api/client-nextjs --", 23 + "docs": "pnpm --filter @hey-api/docs --", 20 24 "format": "prettier --write .", 21 - "lint:fix": "prettier --check . && pnpm --recursive lint:fix", 22 - "lint": "prettier --check . && pnpm --recursive lint", 25 + "lint:fix": "prettier --check . && eslint . --fix", 26 + "lint": "prettier --check . && eslint .", 23 27 "openapi-ts": "pnpm --filter @hey-api/openapi-ts --", 24 28 "prepare": "husky", 25 29 "test:coverage": "pnpm --recursive test:coverage", ··· 33 37 }, 34 38 "devDependencies": { 35 39 "@changesets/cli": "2.27.1", 40 + "@rollup/plugin-commonjs": "25.0.7", 41 + "@rollup/plugin-terser": "0.4.4", 42 + "@rollup/plugin-typescript": "11.1.6", 36 43 "@svitejs/changesets-changelog-github-compact": "1.1.0", 44 + "@types/node": "20.12.7", 45 + "@vitest/coverage-v8": "1.5.0", 46 + "eslint": "9.1.0", 47 + "eslint-config-prettier": "9.1.0", 48 + "eslint-plugin-simple-import-sort": "12.1.0", 49 + "eslint-plugin-sort-keys-fix": "1.1.2", 50 + "globals": "15.0.0", 37 51 "husky": "9.0.11", 38 52 "lint-staged": "15.2.2", 39 - "prettier": "3.2.5" 53 + "prettier": "3.2.5", 54 + "rimraf": "5.0.5", 55 + "rollup": "4.16.1", 56 + "rollup-plugin-dts": "6.1.0", 57 + "typescript": "5.4.5", 58 + "typescript-eslint": "7.7.0", 59 + "vitest": "1.5.0" 40 60 }, 41 61 "packageManager": "pnpm@8.15.7+sha256.50783dd0fa303852de2dd1557cd4b9f07cb5b018154a6e76d0f40635d6cee019" 42 62 }
+59
packages/client-axios/package.json
··· 1 + { 2 + "name": "@hey-api/client-axios", 3 + "version": "0.1.0", 4 + "private": true, 5 + "type": "module", 6 + "description": "Type-safe Axios client for your openapi-ts types", 7 + "homepage": "https://heyapi.vercel.app/", 8 + "repository": { 9 + "type": "git", 10 + "url": "git+https://github.com/hey-api/openapi-ts.git" 11 + }, 12 + "bugs": { 13 + "url": "https://github.com/hey-api/openapi-ts/issues" 14 + }, 15 + "license": "MIT", 16 + "keywords": [ 17 + "axios", 18 + "client", 19 + "codegen", 20 + "generator", 21 + "javascript", 22 + "openapi", 23 + "react", 24 + "svelte", 25 + "swagger", 26 + "typescript", 27 + "vue" 28 + ], 29 + "main": "./dist/index.cjs", 30 + "types": "./dist/index.d.ts", 31 + "scripts": { 32 + "build-bundle": "rollup --config rollup.config.ts --configPlugin typescript", 33 + "build-types-check": "tsc --project tsconfig.check.json", 34 + "build-types-roll": "rollup --config rollup.dts.config.ts --configPlugin typescript && rimraf temp", 35 + "build-types-temp": "tsc --emitDeclarationOnly --outDir temp -p src", 36 + "build-types": "pnpm build-types-temp && pnpm build-types-roll && pnpm build-types-check", 37 + "build": "pnpm clean && pnpm build-bundle && pnpm build-types", 38 + "clean": "rimraf dist coverage node_modules/.cache", 39 + "dev": "rimraf dist && pnpm build-bundle --watch", 40 + "prepublishOnly": "pnpm build", 41 + "test:coverage": "vitest run --coverage", 42 + "test:update": "vitest watch --update", 43 + "test:watch": "vitest watch", 44 + "test": "vitest run", 45 + "typecheck": "tsc --noEmit" 46 + }, 47 + "engines": { 48 + "node": "^18.0.0 || >=20.0.0" 49 + }, 50 + "dependencies": { 51 + "@hey-api/client-core": "workspace:*" 52 + }, 53 + "peerDependencies": { 54 + "axios": ">= 1.0.0 < 2" 55 + }, 56 + "devDependencies": { 57 + "axios": "1.6.8" 58 + } 59 + }
+47
packages/client-axios/rollup.config.ts
··· 1 + import { readFileSync } from 'node:fs'; 2 + import path from 'node:path'; 3 + import { fileURLToPath } from 'node:url'; 4 + 5 + import commonjs from '@rollup/plugin-commonjs'; 6 + import terser from '@rollup/plugin-terser'; 7 + import typescript from '@rollup/plugin-typescript'; 8 + import type { RollupOptions } from 'rollup'; 9 + import { defineConfig } from 'rollup'; 10 + 11 + const __dirname = fileURLToPath(new URL('.', import.meta.url)); 12 + 13 + const pkg = JSON.parse( 14 + readFileSync(new URL('./package.json', import.meta.url)).toString(), 15 + ); 16 + 17 + export const externalDependencies = [ 18 + ...Object.keys(pkg.dependencies ?? {}), 19 + ...Object.keys(pkg.peerDependencies ?? {}), 20 + ]; 21 + 22 + function createConfig(isProduction: boolean) { 23 + return defineConfig({ 24 + external: externalDependencies, 25 + input: path.resolve(__dirname, 'src/index.ts'), 26 + output: { 27 + file: path.resolve(__dirname, 'dist/index.cjs'), 28 + format: 'cjs', 29 + }, 30 + plugins: [ 31 + typescript({ 32 + declaration: false, 33 + tsconfig: path.resolve(__dirname, 'src/tsconfig.json'), 34 + }), 35 + commonjs({ 36 + sourceMap: false, 37 + }), 38 + isProduction && terser(), 39 + ], 40 + }); 41 + } 42 + 43 + export default (commandLineArgs: any): RollupOptions[] => { 44 + const isDev = commandLineArgs.watch; 45 + const isProduction = !isDev; 46 + return defineConfig([createConfig(isProduction)]); 47 + };
+16
packages/client-axios/rollup.dts.config.ts
··· 1 + import { defineConfig } from 'rollup'; 2 + import dts from 'rollup-plugin-dts'; 3 + 4 + import { externalDependencies } from './rollup.config'; 5 + 6 + export default defineConfig({ 7 + external: externalDependencies, 8 + input: { 9 + index: './temp/index.d.ts', 10 + }, 11 + output: { 12 + dir: './dist', 13 + format: 'cjs', 14 + }, 15 + plugins: [dts({ respectExternal: true })], 16 + });
+7
packages/client-axios/src/__tests__/index.test.ts
··· 1 + import { describe, expect, it } from 'vitest'; 2 + 3 + describe('Axios client', () => { 4 + it('works', () => { 5 + expect(1).toBe(1); 6 + }); 7 + });
+203
packages/client-axios/src/index.ts
··· 1 + import type { 2 + ApiRequestOptions, 3 + ApiResult, 4 + OnCancel, 5 + OpenAPIConfig, 6 + } from '@hey-api/client-core'; 7 + import { 8 + base64, 9 + CancelablePromise, 10 + catchErrorCodes, 11 + getFormData, 12 + getUrl, 13 + isBlob, 14 + isFormData, 15 + isString, 16 + isStringWithValue, 17 + isSuccess, 18 + resolve, 19 + } from '@hey-api/client-core'; 20 + import type { 21 + AxiosError, 22 + AxiosInstance, 23 + AxiosRequestConfig, 24 + AxiosResponse, 25 + } from 'axios'; 26 + import axios from 'axios'; 27 + 28 + export const getHeaders = async ( 29 + config: OpenAPIConfig, 30 + options: ApiRequestOptions, 31 + ): Promise<Record<string, string>> => { 32 + const [token, username, password, additionalHeaders] = await Promise.all([ 33 + resolve(options, config.TOKEN), 34 + resolve(options, config.USERNAME), 35 + resolve(options, config.PASSWORD), 36 + resolve(options, config.HEADERS), 37 + ]); 38 + 39 + const headers = Object.entries({ 40 + Accept: 'application/json', 41 + ...additionalHeaders, 42 + ...options.headers, 43 + }) 44 + .filter(([, value]) => value !== undefined && value !== null) 45 + .reduce( 46 + (headers, [key, value]) => ({ 47 + ...headers, 48 + [key]: String(value), 49 + }), 50 + {} as Record<string, string>, 51 + ); 52 + 53 + if (isStringWithValue(token)) { 54 + headers['Authorization'] = `Bearer ${token}`; 55 + } 56 + 57 + if (isStringWithValue(username) && isStringWithValue(password)) { 58 + const credentials = base64(`${username}:${password}`); 59 + headers['Authorization'] = `Basic ${credentials}`; 60 + } 61 + 62 + if (options.body !== undefined) { 63 + if (options.mediaType) { 64 + headers['Content-Type'] = options.mediaType; 65 + } else if (isBlob(options.body)) { 66 + headers['Content-Type'] = options.body.type || 'application/octet-stream'; 67 + } else if (isString(options.body)) { 68 + headers['Content-Type'] = 'text/plain'; 69 + } else if (!isFormData(options.body)) { 70 + headers['Content-Type'] = 'application/json'; 71 + } 72 + } else if (options.formData !== undefined) { 73 + if (options.mediaType) { 74 + headers['Content-Type'] = options.mediaType; 75 + } 76 + } 77 + 78 + return headers; 79 + }; 80 + 81 + export const getRequestBody = (options: ApiRequestOptions): unknown => { 82 + if (options.body) { 83 + return options.body; 84 + } 85 + return undefined; 86 + }; 87 + 88 + export const sendRequest = async <T>( 89 + config: OpenAPIConfig, 90 + options: ApiRequestOptions, 91 + url: string, 92 + body: unknown, 93 + formData: FormData | undefined, 94 + headers: Record<string, string>, 95 + onCancel: OnCancel, 96 + axiosClient: AxiosInstance, 97 + ): Promise<AxiosResponse<T>> => { 98 + const controller = new AbortController(); 99 + 100 + let requestConfig: AxiosRequestConfig = { 101 + data: body ?? formData, 102 + headers, 103 + method: options.method, 104 + signal: controller.signal, 105 + url, 106 + withCredentials: config.WITH_CREDENTIALS, 107 + }; 108 + 109 + onCancel(() => controller.abort()); 110 + 111 + for (const fn of config.interceptors.request._fns) { 112 + requestConfig = await fn(requestConfig); 113 + } 114 + 115 + try { 116 + return await axiosClient.request(requestConfig); 117 + } catch (error) { 118 + const axiosError = error as AxiosError<T>; 119 + if (axiosError.response) { 120 + return axiosError.response; 121 + } 122 + throw error; 123 + } 124 + }; 125 + 126 + export const getResponseHeader = ( 127 + response: AxiosResponse<unknown>, 128 + responseHeader?: string, 129 + ): string | undefined => { 130 + if (responseHeader) { 131 + const content = response.headers[responseHeader]; 132 + if (isString(content)) { 133 + return content; 134 + } 135 + } 136 + return undefined; 137 + }; 138 + 139 + export const getResponseBody = (response: AxiosResponse<unknown>): unknown => { 140 + if (response.status !== 204) { 141 + return response.data; 142 + } 143 + return undefined; 144 + }; 145 + 146 + /** 147 + * Request method 148 + * @param config The OpenAPI configuration object 149 + * @param options The request options from the service 150 + * @param axiosClient The axios client instance to use 151 + * @returns CancelablePromise<T> 152 + * @throws ApiError 153 + */ 154 + export const request = <T>( 155 + config: OpenAPIConfig, 156 + options: ApiRequestOptions, 157 + axiosClient: AxiosInstance = axios, 158 + ): CancelablePromise<T> => 159 + new CancelablePromise(async (resolve, reject, onCancel) => { 160 + try { 161 + const url = getUrl(config, options); 162 + const formData = getFormData(options); 163 + const body = getRequestBody(options); 164 + const headers = await getHeaders(config, options); 165 + 166 + if (!onCancel.isCancelled) { 167 + let response = await sendRequest<T>( 168 + config, 169 + options, 170 + url, 171 + body, 172 + formData, 173 + headers, 174 + onCancel, 175 + axiosClient, 176 + ); 177 + 178 + for (const fn of config.interceptors.response._fns) { 179 + response = await fn(response); 180 + } 181 + 182 + const responseBody = getResponseBody(response); 183 + const responseHeader = getResponseHeader( 184 + response, 185 + options.responseHeader, 186 + ); 187 + 188 + const result: ApiResult = { 189 + body: responseHeader ?? responseBody, 190 + ok: isSuccess(response.status), 191 + status: response.status, 192 + statusText: response.statusText, 193 + url, 194 + }; 195 + 196 + catchErrorCodes(options, result); 197 + 198 + resolve(result.body); 199 + } 200 + } catch (error) { 201 + reject(error); 202 + } 203 + });
+9
packages/client-axios/src/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "lib": ["ESNext"], 4 + "stripInternal": true 5 + }, 6 + "exclude": ["./**/__tests__"], 7 + "extends": "../tsconfig.base.json", 8 + "include": ["./"] 9 + }
+13
packages/client-axios/tsconfig.base.json
··· 1 + { 2 + "compilerOptions": { 3 + "declaration": true, 4 + "esModuleInterop": true, 5 + "module": "ESNext", 6 + "moduleResolution": "Bundler", 7 + "noImplicitOverride": true, 8 + "noUnusedLocals": true, 9 + "strict": true, 10 + "target": "ES2022", 11 + "useUnknownInCatchVariables": false 12 + } 13 + }
+11
packages/client-axios/tsconfig.check.json
··· 1 + { 2 + "compilerOptions": { 3 + "exactOptionalPropertyTypes": true, 4 + "module": "NodeNext", 5 + "moduleResolution": "NodeNext", 6 + "noEmit": true, 7 + "strict": true, 8 + "target": "ES2020" 9 + }, 10 + "include": ["dist/**/*"] 11 + }
+9
packages/client-axios/tsconfig.json
··· 1 + { 2 + "extends": "./tsconfig.base.json", 3 + "compilerOptions": { 4 + "declaration": false, 5 + "esModuleInterop": true 6 + }, 7 + "exclude": ["node_modules", "**/__mocks__"], 8 + "include": ["./src/**/*.ts", "rollup.config.ts", "rollup.dts.config.ts"] 9 + }
+14
packages/client-axios/vitest.config.ts
··· 1 + import { fileURLToPath } from 'node:url'; 2 + 3 + import { defineConfig } from 'vitest/config'; 4 + 5 + export default defineConfig({ 6 + test: { 7 + coverage: { 8 + exclude: ['dist', 'src/**/*.d.ts'], 9 + include: ['src/**/*.ts'], 10 + provider: 'v8', 11 + }, 12 + root: fileURLToPath(new URL('./', import.meta.url)), 13 + }, 14 + });
+37
packages/client-core/package.json
··· 1 + { 2 + "name": "@hey-api/client-core", 3 + "version": "0.1.0", 4 + "private": true, 5 + "type": "module", 6 + "description": "Core utilities for type-safe openapi-ts clients", 7 + "homepage": "https://heyapi.vercel.app/", 8 + "repository": { 9 + "type": "git", 10 + "url": "git+https://github.com/hey-api/openapi-ts.git" 11 + }, 12 + "bugs": { 13 + "url": "https://github.com/hey-api/openapi-ts/issues" 14 + }, 15 + "license": "MIT", 16 + "main": "./dist/index.cjs", 17 + "types": "./dist/index.d.ts", 18 + "scripts": { 19 + "build-bundle": "rollup --config rollup.config.ts --configPlugin typescript", 20 + "build-types-check": "tsc --project tsconfig.check.json", 21 + "build-types-roll": "rollup --config rollup.dts.config.ts --configPlugin typescript && rimraf temp", 22 + "build-types-temp": "tsc --emitDeclarationOnly --outDir temp -p src", 23 + "build-types": "pnpm build-types-temp && pnpm build-types-roll && pnpm build-types-check", 24 + "build": "pnpm clean && pnpm build-bundle && pnpm build-types", 25 + "clean": "rimraf dist coverage node_modules/.cache", 26 + "dev": "rimraf dist && pnpm build-bundle --watch", 27 + "prepublishOnly": "pnpm build", 28 + "test:coverage": "vitest run --coverage", 29 + "test:update": "vitest watch --update", 30 + "test:watch": "vitest watch", 31 + "test": "vitest run", 32 + "typecheck": "tsc --noEmit" 33 + }, 34 + "engines": { 35 + "node": "^18.0.0 || >=20.0.0" 36 + } 37 + }
+47
packages/client-core/rollup.config.ts
··· 1 + import { readFileSync } from 'node:fs'; 2 + import path from 'node:path'; 3 + import { fileURLToPath } from 'node:url'; 4 + 5 + import commonjs from '@rollup/plugin-commonjs'; 6 + import terser from '@rollup/plugin-terser'; 7 + import typescript from '@rollup/plugin-typescript'; 8 + import type { RollupOptions } from 'rollup'; 9 + import { defineConfig } from 'rollup'; 10 + 11 + const __dirname = fileURLToPath(new URL('.', import.meta.url)); 12 + 13 + const pkg = JSON.parse( 14 + readFileSync(new URL('./package.json', import.meta.url)).toString(), 15 + ); 16 + 17 + export const externalDependencies = [ 18 + ...Object.keys(pkg.dependencies ?? {}), 19 + ...Object.keys(pkg.peerDependencies ?? {}), 20 + ]; 21 + 22 + function createConfig(isProduction: boolean) { 23 + return defineConfig({ 24 + external: externalDependencies, 25 + input: path.resolve(__dirname, 'src/index.ts'), 26 + output: { 27 + file: path.resolve(__dirname, 'dist/index.cjs'), 28 + format: 'cjs', 29 + }, 30 + plugins: [ 31 + typescript({ 32 + declaration: false, 33 + tsconfig: path.resolve(__dirname, 'src/tsconfig.json'), 34 + }), 35 + commonjs({ 36 + sourceMap: false, 37 + }), 38 + isProduction && terser(), 39 + ], 40 + }); 41 + } 42 + 43 + export default (commandLineArgs: any): RollupOptions[] => { 44 + const isDev = commandLineArgs.watch; 45 + const isProduction = !isDev; 46 + return defineConfig([createConfig(isProduction)]); 47 + };
+16
packages/client-core/rollup.dts.config.ts
··· 1 + import { defineConfig } from 'rollup'; 2 + import dts from 'rollup-plugin-dts'; 3 + 4 + import { externalDependencies } from './rollup.config'; 5 + 6 + export default defineConfig({ 7 + external: externalDependencies, 8 + input: { 9 + index: './temp/index.d.ts', 10 + }, 11 + output: { 12 + dir: './dist', 13 + format: 'cjs', 14 + }, 15 + plugins: [dts({ respectExternal: true })], 16 + });
+7
packages/client-core/src/__tests__/index.test.ts
··· 1 + import { describe, expect, it } from 'vitest'; 2 + 3 + describe('client core', () => { 4 + it('works', () => { 5 + expect(1).toBe(1); 6 + }); 7 + });
+126
packages/client-core/src/cancelablePromise.ts
··· 1 + export class CancelError extends Error { 2 + constructor(message: string) { 3 + super(message); 4 + this.name = 'CancelError'; 5 + } 6 + 7 + public get isCancelled(): boolean { 8 + return true; 9 + } 10 + } 11 + 12 + export interface OnCancel { 13 + readonly isResolved: boolean; 14 + readonly isRejected: boolean; 15 + readonly isCancelled: boolean; 16 + 17 + (cancelHandler: () => void): void; 18 + } 19 + 20 + export class CancelablePromise<T> implements Promise<T> { 21 + private _isResolved: boolean; 22 + private _isRejected: boolean; 23 + private _isCancelled: boolean; 24 + readonly cancelHandlers: (() => void)[]; 25 + readonly promise: Promise<T>; 26 + private _resolve?: (value: T | PromiseLike<T>) => void; 27 + private _reject?: (reason?: unknown) => void; 28 + 29 + constructor( 30 + executor: ( 31 + resolve: (value: T | PromiseLike<T>) => void, 32 + reject: (reason?: unknown) => void, 33 + onCancel: OnCancel, 34 + ) => void, 35 + ) { 36 + this._isResolved = false; 37 + this._isRejected = false; 38 + this._isCancelled = false; 39 + this.cancelHandlers = []; 40 + this.promise = new Promise<T>((resolve, reject) => { 41 + this._resolve = resolve; 42 + this._reject = reject; 43 + 44 + const onResolve = (value: T | PromiseLike<T>): void => { 45 + if (this._isResolved || this._isRejected || this._isCancelled) { 46 + return; 47 + } 48 + this._isResolved = true; 49 + if (this._resolve) this._resolve(value); 50 + }; 51 + 52 + const onReject = (reason?: unknown): void => { 53 + if (this._isResolved || this._isRejected || this._isCancelled) { 54 + return; 55 + } 56 + this._isRejected = true; 57 + if (this._reject) this._reject(reason); 58 + }; 59 + 60 + const onCancel = (cancelHandler: () => void): void => { 61 + if (this._isResolved || this._isRejected || this._isCancelled) { 62 + return; 63 + } 64 + this.cancelHandlers.push(cancelHandler); 65 + }; 66 + 67 + Object.defineProperty(onCancel, 'isResolved', { 68 + get: (): boolean => this._isResolved, 69 + }); 70 + 71 + Object.defineProperty(onCancel, 'isRejected', { 72 + get: (): boolean => this._isRejected, 73 + }); 74 + 75 + Object.defineProperty(onCancel, 'isCancelled', { 76 + get: (): boolean => this._isCancelled, 77 + }); 78 + 79 + return executor(onResolve, onReject, onCancel as OnCancel); 80 + }); 81 + } 82 + 83 + get [Symbol.toStringTag]() { 84 + return 'Cancellable Promise'; 85 + } 86 + 87 + public then<TResult1 = T, TResult2 = never>( 88 + onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, 89 + onRejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null, 90 + ): Promise<TResult1 | TResult2> { 91 + return this.promise.then(onFulfilled, onRejected); 92 + } 93 + 94 + public catch<TResult = never>( 95 + onRejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null, 96 + ): Promise<T | TResult> { 97 + return this.promise.catch(onRejected); 98 + } 99 + 100 + public finally(onFinally?: (() => void) | null): Promise<T> { 101 + return this.promise.finally(onFinally); 102 + } 103 + 104 + public cancel(): void { 105 + if (this._isResolved || this._isRejected || this._isCancelled) { 106 + return; 107 + } 108 + this._isCancelled = true; 109 + if (this.cancelHandlers.length) { 110 + try { 111 + for (const cancelHandler of this.cancelHandlers) { 112 + cancelHandler(); 113 + } 114 + } catch (error) { 115 + console.warn('Cancellation threw an error', error); 116 + return; 117 + } 118 + } 119 + this.cancelHandlers.length = 0; 120 + if (this._reject) this._reject(new CancelError('Request aborted')); 121 + } 122 + 123 + public get isCancelled(): boolean { 124 + return this._isCancelled; 125 + } 126 + }
+264
packages/client-core/src/index.ts
··· 1 + import type { 2 + ApiRequestOptions, 3 + ApiResult, 4 + Headers, 5 + Middleware, 6 + Resolver, 7 + } from './types'; 8 + 9 + export { CancelablePromise, CancelError, OnCancel } from './cancelablePromise'; 10 + export type { ApiRequestOptions, ApiResult } from './types'; 11 + 12 + export class ApiError extends Error { 13 + public readonly url: string; 14 + public readonly status: number; 15 + public readonly statusText: string; 16 + public readonly body: unknown; 17 + public readonly request: ApiRequestOptions; 18 + 19 + constructor( 20 + request: ApiRequestOptions, 21 + response: ApiResult, 22 + message: string, 23 + ) { 24 + super(message); 25 + 26 + this.name = 'ApiError'; 27 + this.url = response.url; 28 + this.status = response.status; 29 + this.statusText = response.statusText; 30 + this.body = response.body; 31 + this.request = request; 32 + } 33 + } 34 + 35 + export class Interceptors<T> { 36 + _fns: Middleware<T>[]; 37 + 38 + constructor() { 39 + this._fns = []; 40 + } 41 + 42 + eject(fn: Middleware<T>) { 43 + const index = this._fns.indexOf(fn); 44 + if (index !== -1) { 45 + this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)]; 46 + } 47 + } 48 + 49 + use(fn: Middleware<T>) { 50 + this._fns = [...this._fns, fn]; 51 + } 52 + } 53 + 54 + export type OpenAPIConfig = { 55 + BASE: string; 56 + CREDENTIALS: 'include' | 'omit' | 'same-origin'; 57 + ENCODE_PATH?: ((path: string) => string) | undefined; 58 + HEADERS?: Headers | Resolver<Headers> | undefined; 59 + PASSWORD?: string | Resolver<string> | undefined; 60 + TOKEN?: string | Resolver<string> | undefined; 61 + USERNAME?: string | Resolver<string> | undefined; 62 + VERSION: string; 63 + WITH_CREDENTIALS: boolean; 64 + interceptors: { 65 + request: Interceptors<any>; 66 + response: Interceptors<any>; 67 + }; 68 + }; 69 + 70 + export const OpenAPI: OpenAPIConfig = { 71 + BASE: '{{{server}}}', 72 + CREDENTIALS: 'include', 73 + ENCODE_PATH: undefined, 74 + HEADERS: undefined, 75 + PASSWORD: undefined, 76 + TOKEN: undefined, 77 + USERNAME: undefined, 78 + VERSION: '{{{version}}}', 79 + WITH_CREDENTIALS: false, 80 + interceptors: { 81 + request: new Interceptors(), 82 + response: new Interceptors(), 83 + }, 84 + }; 85 + 86 + export const isString = (value: unknown): value is string => 87 + typeof value === 'string'; 88 + 89 + export const isStringWithValue = (value: unknown): value is string => 90 + isString(value) && value !== ''; 91 + 92 + export const isBlob = (value: any): value is Blob => value instanceof Blob; 93 + 94 + export const isFormData = (value: unknown): value is FormData => 95 + value instanceof FormData; 96 + 97 + export const isSuccess = (status: number): boolean => 98 + status >= 200 && status < 300; 99 + 100 + export const base64 = (str: string): string => { 101 + try { 102 + return btoa(str); 103 + } catch (err) { 104 + return Buffer.from(str).toString('base64'); 105 + } 106 + }; 107 + 108 + export const getQueryString = (params: Record<string, unknown>): string => { 109 + const qs: string[] = []; 110 + 111 + const append = (key: string, value: unknown) => { 112 + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); 113 + }; 114 + 115 + const encodePair = (key: string, value: unknown) => { 116 + if (value === undefined || value === null) { 117 + return; 118 + } 119 + 120 + if (value instanceof Date) { 121 + append(key, value.toISOString()); 122 + } else if (Array.isArray(value)) { 123 + value.forEach((v) => encodePair(key, v)); 124 + } else if (typeof value === 'object') { 125 + Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v)); 126 + } else { 127 + append(key, value); 128 + } 129 + }; 130 + 131 + Object.entries(params).forEach(([key, value]) => encodePair(key, value)); 132 + 133 + return qs.length ? `?${qs.join('&')}` : ''; 134 + }; 135 + 136 + export const getUrl = ( 137 + config: OpenAPIConfig, 138 + options: ApiRequestOptions, 139 + ): string => { 140 + const encoder = config.ENCODE_PATH || encodeURI; 141 + 142 + const path = options.url 143 + .replace('{api-version}', config.VERSION) 144 + .replace(/{(.*?)}/g, (substring: string, group: string) => { 145 + if (options.path?.hasOwnProperty(group)) { 146 + return encoder(String(options.path[group])); 147 + } 148 + return substring; 149 + }); 150 + 151 + const url = config.BASE + path; 152 + return options.query ? url + getQueryString(options.query) : url; 153 + }; 154 + 155 + export const getFormData = ( 156 + options: ApiRequestOptions, 157 + ): FormData | undefined => { 158 + if (options.formData) { 159 + const formData = new FormData(); 160 + 161 + const process = (key: string, value: unknown) => { 162 + if (isString(value) || isBlob(value)) { 163 + formData.append(key, value); 164 + } else { 165 + formData.append(key, JSON.stringify(value)); 166 + } 167 + }; 168 + 169 + Object.entries(options.formData) 170 + .filter(([, value]) => value !== undefined && value !== null) 171 + .forEach(([key, value]) => { 172 + if (Array.isArray(value)) { 173 + value.forEach((v) => process(key, v)); 174 + } else { 175 + process(key, value); 176 + } 177 + }); 178 + 179 + return formData; 180 + } 181 + return undefined; 182 + }; 183 + 184 + export const resolve = async <T>( 185 + options: ApiRequestOptions, 186 + resolver?: T | Resolver<T>, 187 + ): Promise<T | undefined> => { 188 + if (typeof resolver === 'function') { 189 + return (resolver as Resolver<T>)(options); 190 + } 191 + return resolver; 192 + }; 193 + 194 + export const catchErrorCodes = ( 195 + options: ApiRequestOptions, 196 + result: ApiResult, 197 + ): void => { 198 + const errors: Record<number, string> = { 199 + 400: 'Bad Request', 200 + 401: 'Unauthorized', 201 + 402: 'Payment Required', 202 + 403: 'Forbidden', 203 + 404: 'Not Found', 204 + 405: 'Method Not Allowed', 205 + 406: 'Not Acceptable', 206 + 407: 'Proxy Authentication Required', 207 + 408: 'Request Timeout', 208 + 409: 'Conflict', 209 + 410: 'Gone', 210 + 411: 'Length Required', 211 + 412: 'Precondition Failed', 212 + 413: 'Payload Too Large', 213 + 414: 'URI Too Long', 214 + 415: 'Unsupported Media Type', 215 + 416: 'Range Not Satisfiable', 216 + 417: 'Expectation Failed', 217 + 418: 'Im a teapot', 218 + 421: 'Misdirected Request', 219 + 422: 'Unprocessable Content', 220 + 423: 'Locked', 221 + 424: 'Failed Dependency', 222 + 425: 'Too Early', 223 + 426: 'Upgrade Required', 224 + 428: 'Precondition Required', 225 + 429: 'Too Many Requests', 226 + 431: 'Request Header Fields Too Large', 227 + 451: 'Unavailable For Legal Reasons', 228 + 500: 'Internal Server Error', 229 + 501: 'Not Implemented', 230 + 502: 'Bad Gateway', 231 + 503: 'Service Unavailable', 232 + 504: 'Gateway Timeout', 233 + 505: 'HTTP Version Not Supported', 234 + 506: 'Variant Also Negotiates', 235 + 507: 'Insufficient Storage', 236 + 508: 'Loop Detected', 237 + 510: 'Not Extended', 238 + 511: 'Network Authentication Required', 239 + ...options.errors, 240 + }; 241 + 242 + const error = errors[result.status]; 243 + if (error) { 244 + throw new ApiError(options, result, error); 245 + } 246 + 247 + if (!result.ok) { 248 + const errorStatus = result.status ?? 'unknown'; 249 + const errorStatusText = result.statusText ?? 'unknown'; 250 + const errorBody = (() => { 251 + try { 252 + return JSON.stringify(result.body, null, 2); 253 + } catch (e) { 254 + return undefined; 255 + } 256 + })(); 257 + 258 + throw new ApiError( 259 + options, 260 + result, 261 + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`, 262 + ); 263 + } 264 + };
+9
packages/client-core/src/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "lib": ["ESNext"], 4 + "stripInternal": true 5 + }, 6 + "exclude": ["./**/__tests__"], 7 + "extends": "../tsconfig.base.json", 8 + "include": ["./"] 9 + }
+32
packages/client-core/src/types.ts
··· 1 + export type ApiResult<TData = any> = { 2 + readonly body: TData; 3 + readonly ok: boolean; 4 + readonly status: number; 5 + readonly statusText: string; 6 + readonly url: string; 7 + }; 8 + 9 + export type ApiRequestOptions = { 10 + readonly method: 11 + | 'GET' 12 + | 'PUT' 13 + | 'POST' 14 + | 'DELETE' 15 + | 'OPTIONS' 16 + | 'HEAD' 17 + | 'PATCH'; 18 + readonly url: string; 19 + readonly path?: Record<string, unknown>; 20 + readonly cookies?: Record<string, unknown>; 21 + readonly headers?: Record<string, unknown>; 22 + readonly query?: Record<string, unknown>; 23 + readonly formData?: Record<string, unknown>; 24 + readonly body?: any; 25 + readonly mediaType?: string; 26 + readonly responseHeader?: string; 27 + readonly errors?: Record<number, string>; 28 + }; 29 + 30 + export type Headers = Record<string, string>; 31 + export type Middleware<T> = (value: T) => T | Promise<T>; 32 + export type Resolver<T> = (options: ApiRequestOptions) => Promise<T>;
+13
packages/client-core/tsconfig.base.json
··· 1 + { 2 + "compilerOptions": { 3 + "declaration": true, 4 + "esModuleInterop": true, 5 + "module": "ESNext", 6 + "moduleResolution": "Bundler", 7 + "noImplicitOverride": true, 8 + "noUnusedLocals": true, 9 + "strict": true, 10 + "target": "ES2022", 11 + "useUnknownInCatchVariables": false 12 + } 13 + }
+11
packages/client-core/tsconfig.check.json
··· 1 + { 2 + "compilerOptions": { 3 + "exactOptionalPropertyTypes": true, 4 + "module": "NodeNext", 5 + "moduleResolution": "NodeNext", 6 + "noEmit": true, 7 + "strict": true, 8 + "target": "ES2020" 9 + }, 10 + "include": ["dist/**/*"] 11 + }
+9
packages/client-core/tsconfig.json
··· 1 + { 2 + "extends": "./tsconfig.base.json", 3 + "compilerOptions": { 4 + "declaration": false, 5 + "esModuleInterop": true 6 + }, 7 + "exclude": ["node_modules", "**/__mocks__"], 8 + "include": ["./src/**/*.ts", "rollup.config.ts", "rollup.dts.config.ts"] 9 + }
+14
packages/client-core/vitest.config.ts
··· 1 + import { fileURLToPath } from 'node:url'; 2 + 3 + import { defineConfig } from 'vitest/config'; 4 + 5 + export default defineConfig({ 6 + test: { 7 + coverage: { 8 + exclude: ['dist', 'src/**/*.d.ts'], 9 + include: ['src/**/*.ts'], 10 + provider: 'v8', 11 + }, 12 + root: fileURLToPath(new URL('./', import.meta.url)), 13 + }, 14 + });
+53
packages/client-fetch/package.json
··· 1 + { 2 + "name": "@hey-api/client-fetch", 3 + "version": "0.1.0", 4 + "private": true, 5 + "type": "module", 6 + "description": "Type-safe Fetch API client for your openapi-ts types", 7 + "homepage": "https://heyapi.vercel.app/", 8 + "repository": { 9 + "type": "git", 10 + "url": "git+https://github.com/hey-api/openapi-ts.git" 11 + }, 12 + "bugs": { 13 + "url": "https://github.com/hey-api/openapi-ts/issues" 14 + }, 15 + "license": "MIT", 16 + "keywords": [ 17 + "client", 18 + "codegen", 19 + "fetch", 20 + "generator", 21 + "javascript", 22 + "openapi", 23 + "react", 24 + "svelte", 25 + "swagger", 26 + "typescript", 27 + "vue" 28 + ], 29 + "main": "./dist/index.cjs", 30 + "types": "./dist/index.d.ts", 31 + "scripts": { 32 + "build-bundle": "rollup --config rollup.config.ts --configPlugin typescript", 33 + "build-types-check": "tsc --project tsconfig.check.json", 34 + "build-types-roll": "rollup --config rollup.dts.config.ts --configPlugin typescript && rimraf temp", 35 + "build-types-temp": "tsc --emitDeclarationOnly --outDir temp -p src", 36 + "build-types": "pnpm build-types-temp && pnpm build-types-roll && pnpm build-types-check", 37 + "build": "pnpm clean && pnpm build-bundle && pnpm build-types", 38 + "clean": "rimraf dist coverage node_modules/.cache", 39 + "dev": "rimraf dist && pnpm build-bundle --watch", 40 + "prepublishOnly": "pnpm build", 41 + "test:coverage": "vitest run --coverage", 42 + "test:update": "vitest watch --update", 43 + "test:watch": "vitest watch", 44 + "test": "vitest run", 45 + "typecheck": "tsc --noEmit" 46 + }, 47 + "engines": { 48 + "node": "^18.0.0 || >=20.0.0" 49 + }, 50 + "dependencies": { 51 + "@hey-api/client-core": "workspace:*" 52 + } 53 + }
+47
packages/client-fetch/rollup.config.ts
··· 1 + import { readFileSync } from 'node:fs'; 2 + import path from 'node:path'; 3 + import { fileURLToPath } from 'node:url'; 4 + 5 + import commonjs from '@rollup/plugin-commonjs'; 6 + import terser from '@rollup/plugin-terser'; 7 + import typescript from '@rollup/plugin-typescript'; 8 + import type { RollupOptions } from 'rollup'; 9 + import { defineConfig } from 'rollup'; 10 + 11 + const __dirname = fileURLToPath(new URL('.', import.meta.url)); 12 + 13 + const pkg = JSON.parse( 14 + readFileSync(new URL('./package.json', import.meta.url)).toString(), 15 + ); 16 + 17 + export const externalDependencies = [ 18 + ...Object.keys(pkg.dependencies ?? {}), 19 + ...Object.keys(pkg.peerDependencies ?? {}), 20 + ]; 21 + 22 + function createConfig(isProduction: boolean) { 23 + return defineConfig({ 24 + external: externalDependencies, 25 + input: path.resolve(__dirname, 'src/index.ts'), 26 + output: { 27 + file: path.resolve(__dirname, 'dist/index.cjs'), 28 + format: 'cjs', 29 + }, 30 + plugins: [ 31 + typescript({ 32 + declaration: false, 33 + tsconfig: path.resolve(__dirname, 'src/tsconfig.json'), 34 + }), 35 + commonjs({ 36 + sourceMap: false, 37 + }), 38 + isProduction && terser(), 39 + ], 40 + }); 41 + } 42 + 43 + export default (commandLineArgs: any): RollupOptions[] => { 44 + const isDev = commandLineArgs.watch; 45 + const isProduction = !isDev; 46 + return defineConfig([createConfig(isProduction)]); 47 + };
+16
packages/client-fetch/rollup.dts.config.ts
··· 1 + import { defineConfig } from 'rollup'; 2 + import dts from 'rollup-plugin-dts'; 3 + 4 + import { externalDependencies } from './rollup.config'; 5 + 6 + export default defineConfig({ 7 + external: externalDependencies, 8 + input: { 9 + index: './temp/index.d.ts', 10 + }, 11 + output: { 12 + dir: './dist', 13 + format: 'cjs', 14 + }, 15 + plugins: [dts({ respectExternal: true })], 16 + });
+7
packages/client-fetch/src/__tests__/index.test.ts
··· 1 + import { describe, expect, it } from 'vitest'; 2 + 3 + describe('Fetch API client', () => { 4 + it('works', () => { 5 + expect(1).toBe(1); 6 + }); 7 + });
+220
packages/client-fetch/src/index.ts
··· 1 + import type { 2 + ApiRequestOptions, 3 + ApiResult, 4 + OnCancel, 5 + OpenAPIConfig, 6 + } from '@hey-api/client-core'; 7 + import { 8 + base64, 9 + CancelablePromise, 10 + catchErrorCodes, 11 + getFormData, 12 + getUrl, 13 + isBlob, 14 + isFormData, 15 + isString, 16 + isStringWithValue, 17 + resolve, 18 + } from '@hey-api/client-core'; 19 + 20 + export const getHeaders = async ( 21 + config: OpenAPIConfig, 22 + options: ApiRequestOptions, 23 + ): Promise<Headers> => { 24 + const [token, username, password, additionalHeaders] = await Promise.all([ 25 + resolve(options, config.TOKEN), 26 + resolve(options, config.USERNAME), 27 + resolve(options, config.PASSWORD), 28 + resolve(options, config.HEADERS), 29 + ]); 30 + 31 + const headers = Object.entries({ 32 + Accept: 'application/json', 33 + ...additionalHeaders, 34 + ...options.headers, 35 + }) 36 + .filter(([, value]) => value !== undefined && value !== null) 37 + .reduce( 38 + (headers, [key, value]) => ({ 39 + ...headers, 40 + [key]: String(value), 41 + }), 42 + {} as Record<string, string>, 43 + ); 44 + 45 + if (isStringWithValue(token)) { 46 + headers['Authorization'] = `Bearer ${token}`; 47 + } 48 + 49 + if (isStringWithValue(username) && isStringWithValue(password)) { 50 + const credentials = base64(`${username}:${password}`); 51 + headers['Authorization'] = `Basic ${credentials}`; 52 + } 53 + 54 + if (options.body !== undefined) { 55 + if (options.mediaType) { 56 + headers['Content-Type'] = options.mediaType; 57 + } else if (isBlob(options.body)) { 58 + headers['Content-Type'] = options.body.type || 'application/octet-stream'; 59 + } else if (isString(options.body)) { 60 + headers['Content-Type'] = 'text/plain'; 61 + } else if (!isFormData(options.body)) { 62 + headers['Content-Type'] = 'application/json'; 63 + } 64 + } 65 + 66 + return new Headers(headers); 67 + }; 68 + 69 + export const getRequestBody = (options: ApiRequestOptions): unknown => { 70 + if (options.body !== undefined) { 71 + if ( 72 + options.mediaType?.includes('application/json') || 73 + options.mediaType?.includes('+json') 74 + ) { 75 + return JSON.stringify(options.body); 76 + } else if ( 77 + isString(options.body) || 78 + isBlob(options.body) || 79 + isFormData(options.body) 80 + ) { 81 + return options.body; 82 + } else { 83 + return JSON.stringify(options.body); 84 + } 85 + } 86 + return undefined; 87 + }; 88 + 89 + export const sendRequest = async ( 90 + config: OpenAPIConfig, 91 + options: ApiRequestOptions, 92 + url: string, 93 + body: any, 94 + formData: FormData | undefined, 95 + headers: Headers, 96 + onCancel: OnCancel, 97 + ): Promise<Response> => { 98 + const controller = new AbortController(); 99 + 100 + let request: RequestInit = { 101 + body: body ?? formData, 102 + headers, 103 + method: options.method, 104 + signal: controller.signal, 105 + }; 106 + 107 + if (config.WITH_CREDENTIALS) { 108 + request.credentials = config.CREDENTIALS; 109 + } 110 + 111 + for (const fn of config.interceptors.request._fns) { 112 + request = await fn(request); 113 + } 114 + 115 + onCancel(() => controller.abort()); 116 + 117 + return await fetch(url, request); 118 + }; 119 + 120 + export const getResponseHeader = ( 121 + response: Response, 122 + responseHeader?: string, 123 + ): string | undefined => { 124 + if (responseHeader) { 125 + const content = response.headers.get(responseHeader); 126 + if (isString(content)) { 127 + return content; 128 + } 129 + } 130 + return undefined; 131 + }; 132 + 133 + export const getResponseBody = async (response: Response): Promise<unknown> => { 134 + if (response.status !== 204) { 135 + try { 136 + const contentType = response.headers.get('Content-Type'); 137 + if (contentType) { 138 + const binaryTypes = [ 139 + 'application/octet-stream', 140 + 'application/pdf', 141 + 'application/zip', 142 + 'audio/', 143 + 'image/', 144 + 'video/', 145 + ]; 146 + if ( 147 + contentType.includes('application/json') || 148 + contentType.includes('+json') 149 + ) { 150 + return await response.json(); 151 + } else if (binaryTypes.some((type) => contentType.includes(type))) { 152 + return await response.blob(); 153 + } else if (contentType.includes('multipart/form-data')) { 154 + return await response.formData(); 155 + } else if (contentType.includes('text/')) { 156 + return await response.text(); 157 + } 158 + } 159 + } catch (error) { 160 + console.error(error); 161 + } 162 + } 163 + return undefined; 164 + }; 165 + 166 + /** 167 + * Request method 168 + * @param config The OpenAPI configuration object 169 + * @param options The request options from the service 170 + * @returns CancelablePromise<T> 171 + * @throws ApiError 172 + */ 173 + export const request = <T>( 174 + config: OpenAPIConfig, 175 + options: ApiRequestOptions, 176 + ): CancelablePromise<T> => 177 + new CancelablePromise(async (resolve, reject, onCancel) => { 178 + try { 179 + const url = getUrl(config, options); 180 + const formData = getFormData(options); 181 + const body = getRequestBody(options); 182 + const headers = await getHeaders(config, options); 183 + 184 + if (!onCancel.isCancelled) { 185 + let response = await sendRequest( 186 + config, 187 + options, 188 + url, 189 + body, 190 + formData, 191 + headers, 192 + onCancel, 193 + ); 194 + 195 + for (const fn of config.interceptors.response._fns) { 196 + response = await fn(response); 197 + } 198 + 199 + const responseBody = await getResponseBody(response); 200 + const responseHeader = getResponseHeader( 201 + response, 202 + options.responseHeader, 203 + ); 204 + 205 + const result: ApiResult = { 206 + body: responseHeader ?? responseBody, 207 + ok: response.ok, 208 + status: response.status, 209 + statusText: response.statusText, 210 + url, 211 + }; 212 + 213 + catchErrorCodes(options, result); 214 + 215 + resolve(result.body); 216 + } 217 + } catch (error) { 218 + reject(error); 219 + } 220 + });
+9
packages/client-fetch/src/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "lib": ["ESNext"], 4 + "stripInternal": true 5 + }, 6 + "exclude": ["./**/__tests__"], 7 + "extends": "../tsconfig.base.json", 8 + "include": ["./"] 9 + }
+13
packages/client-fetch/tsconfig.base.json
··· 1 + { 2 + "compilerOptions": { 3 + "declaration": true, 4 + "esModuleInterop": true, 5 + "module": "ESNext", 6 + "moduleResolution": "Bundler", 7 + "noImplicitOverride": true, 8 + "noUnusedLocals": true, 9 + "strict": true, 10 + "target": "ES2022", 11 + "useUnknownInCatchVariables": false 12 + } 13 + }
+11
packages/client-fetch/tsconfig.check.json
··· 1 + { 2 + "compilerOptions": { 3 + "exactOptionalPropertyTypes": true, 4 + "module": "NodeNext", 5 + "moduleResolution": "NodeNext", 6 + "noEmit": true, 7 + "strict": true, 8 + "target": "ES2020" 9 + }, 10 + "include": ["dist/**/*"] 11 + }
+9
packages/client-fetch/tsconfig.json
··· 1 + { 2 + "extends": "./tsconfig.base.json", 3 + "compilerOptions": { 4 + "declaration": false, 5 + "esModuleInterop": true 6 + }, 7 + "exclude": ["node_modules", "**/__mocks__"], 8 + "include": ["./src/**/*.ts", "rollup.config.ts", "rollup.dts.config.ts"] 9 + }
+14
packages/client-fetch/vitest.config.ts
··· 1 + import { fileURLToPath } from 'node:url'; 2 + 3 + import { defineConfig } from 'vitest/config'; 4 + 5 + export default defineConfig({ 6 + test: { 7 + coverage: { 8 + exclude: ['dist', 'src/**/*.d.ts'], 9 + include: ['src/**/*.ts'], 10 + provider: 'v8', 11 + }, 12 + root: fileURLToPath(new URL('./', import.meta.url)), 13 + }, 14 + });
+2
packages/openapi-ts/eslint.config.js eslint.config.js
··· 46 46 'temp/', 47 47 '**/test/e2e/generated/', 48 48 '**/test/generated/', 49 + '**/.vitepress/cache', 50 + '**/.vitepress/dist', 49 51 ], 50 52 }, 51 53 );
+10 -26
packages/openapi-ts/package.json
··· 13 13 }, 14 14 "license": "MIT", 15 15 "keywords": [ 16 - "openapi", 17 - "swagger", 16 + "angular", 17 + "axios", 18 + "codegen", 19 + "fetch", 18 20 "generator", 19 - "typescript", 20 21 "javascript", 21 - "codegen", 22 - "yaml", 23 22 "json", 24 - "fetch", 23 + "node", 24 + "openapi", 25 + "swagger", 26 + "typescript", 25 27 "xhr", 26 - "axios", 27 - "angular", 28 - "node" 28 + "yaml" 29 29 ], 30 30 "main": "./dist/node/index.cjs", 31 31 "types": "./dist/node/index.d.ts", ··· 45 45 "build": "pnpm clean && pnpm build-bundle && pnpm build-types", 46 46 "clean": "rimraf dist test/generated test/e2e/generated coverage node_modules/.cache", 47 47 "dev": "rimraf dist && pnpm build-bundle --watch", 48 - "lint:fix": "eslint . --fix", 49 - "lint": "eslint .", 50 48 "prepublishOnly": "pnpm build", 51 49 "test:coverage": "vitest run --config vitest.config.unit.ts --coverage", 52 50 "test:e2e": "vitest run --config vitest.config.e2e.ts", ··· 81 79 "@angular/platform-browser": "17.3.5", 82 80 "@angular/platform-browser-dynamic": "17.3.5", 83 81 "@angular/router": "17.3.5", 84 - "@rollup/plugin-commonjs": "25.0.7", 85 82 "@rollup/plugin-json": "6.1.0", 86 83 "@rollup/plugin-node-resolve": "15.2.3", 87 - "@rollup/plugin-terser": "0.4.4", 88 - "@rollup/plugin-typescript": "11.1.6", 89 84 "@types/cross-spawn": "6.0.6", 90 85 "@types/express": "4.17.21", 91 - "@types/node": "20.12.7", 92 - "@vitest/coverage-v8": "1.5.0", 93 86 "axios": "1.6.8", 94 87 "cross-spawn": "7.0.3", 95 88 "eslint": "9.1.0", 96 - "eslint-config-prettier": "9.1.0", 97 - "eslint-plugin-simple-import-sort": "12.1.0", 98 - "eslint-plugin-sort-keys-fix": "1.1.2", 99 89 "express": "4.19.2", 100 90 "glob": "10.3.12", 101 - "globals": "15.0.0", 102 91 "node-fetch": "3.3.2", 103 92 "prettier": "3.2.5", 104 93 "puppeteer": "22.6.5", 105 - "rimraf": "5.0.5", 106 - "rollup": "4.16.1", 107 - "rollup-plugin-dts": "6.1.0", 108 94 "rxjs": "7.8.1", 109 95 "ts-node": "10.9.2", 110 96 "tslib": "2.6.2", 111 - "typescript": "5.4.5", 112 - "typescript-eslint": "7.7.0", 113 - "vitest": "1.5.0" 97 + "typescript": "5.4.5" 114 98 } 115 99 }
+2 -2
packages/openapi-ts/rollup.config.ts
··· 58 58 const esmDependencies = ['camelcase']; 59 59 60 60 export const externalDependencies = [ 61 - ...Object.keys(pkg.dependencies), 62 - ...Object.keys(pkg.peerDependencies), 61 + ...Object.keys(pkg.dependencies ?? {}), 62 + ...Object.keys(pkg.peerDependencies ?? {}), 63 63 ].filter((dependency) => !esmDependencies.includes(dependency)); 64 64 65 65 function createConfig(isProduction: boolean) {
+11 -3
packages/openapi-ts/src/index.ts
··· 21 21 22 22 // Dependencies used in each client. User must have installed these to use the generated client 23 23 const clientDependencies: Record<Config['client'], string[]> = { 24 + '@hey-api': [], 24 25 angular: ['@angular/common', '@angular/core', 'rxjs'], 25 26 axios: ['axios'], 26 27 fetch: [], ··· 92 93 }; 93 94 94 95 const inferClient = (dependencies: Dependencies): Config['client'] => { 95 - if (Object.keys(dependencies).some((d) => d.startsWith('@angular'))) { 96 - return 'angular'; 96 + if ( 97 + dependencies['@hey-api/client-axios'] || 98 + dependencies['@hey-api/client-fetch'] || 99 + dependencies['@hey-api/client-nextjs'] 100 + ) { 101 + return '@hey-api'; 97 102 } 98 103 if (dependencies.axios) { 99 104 return 'axios'; 100 105 } 101 106 if (dependencies['node-fetch']) { 102 107 return 'node'; 108 + } 109 + if (Object.keys(dependencies).some((d) => d.startsWith('@angular'))) { 110 + return 'angular'; 103 111 } 104 112 return 'fetch'; 105 113 }; ··· 289 297 debug, 290 298 dryRun, 291 299 enums, 292 - exportCore, 300 + exportCore: client === '@hey-api' ? false : exportCore, 293 301 format, 294 302 input, 295 303 lint,
+1 -1
packages/openapi-ts/src/types/config.ts
··· 7 7 * The selected HTTP client (fetch, xhr, node or axios) 8 8 * @default 'fetch' 9 9 */ 10 - client?: 'angular' | 'axios' | 'fetch' | 'node' | 'xhr'; 10 + client?: '@hey-api' | 'angular' | 'axios' | 'fetch' | 'node' | 'xhr'; 11 11 /** 12 12 * Run in debug mode? 13 13 * @default false
+2
packages/openapi-ts/src/utils/getHttpRequestName.ts
··· 6 6 */ 7 7 export const getHttpRequestName = (client: Config['client']): string => { 8 8 switch (client) { 9 + case '@hey-api': 10 + return ''; 9 11 case 'angular': 10 12 return 'AngularHttpRequest'; 11 13 case 'axios':
+276 -328
pnpm-lock.yaml
··· 11 11 '@changesets/cli': 12 12 specifier: 2.27.1 13 13 version: 2.27.1 14 + '@rollup/plugin-commonjs': 15 + specifier: 25.0.7 16 + version: 25.0.7(rollup@4.16.1) 17 + '@rollup/plugin-terser': 18 + specifier: 0.4.4 19 + version: 0.4.4(rollup@4.16.1) 20 + '@rollup/plugin-typescript': 21 + specifier: 11.1.6 22 + version: 11.1.6(rollup@4.16.1)(typescript@5.4.5) 14 23 '@svitejs/changesets-changelog-github-compact': 15 24 specifier: 1.1.0 16 25 version: 1.1.0 26 + '@types/node': 27 + specifier: 20.12.7 28 + version: 20.12.7 29 + '@vitest/coverage-v8': 30 + specifier: 1.5.0 31 + version: 1.5.0(vitest@1.5.0) 32 + eslint: 33 + specifier: 9.1.0 34 + version: 9.1.0 35 + eslint-config-prettier: 36 + specifier: 9.1.0 37 + version: 9.1.0(eslint@9.1.0) 38 + eslint-plugin-simple-import-sort: 39 + specifier: 12.1.0 40 + version: 12.1.0(eslint@9.1.0) 41 + eslint-plugin-sort-keys-fix: 42 + specifier: 1.1.2 43 + version: 1.1.2 44 + globals: 45 + specifier: 15.0.0 46 + version: 15.0.0 17 47 husky: 18 48 specifier: 9.0.11 19 49 version: 9.0.11 ··· 23 53 prettier: 24 54 specifier: 3.2.5 25 55 version: 3.2.5 56 + rimraf: 57 + specifier: 5.0.5 58 + version: 5.0.5 59 + rollup: 60 + specifier: 4.16.1 61 + version: 4.16.1 62 + rollup-plugin-dts: 63 + specifier: 6.1.0 64 + version: 6.1.0(rollup@4.16.1)(typescript@5.4.5) 65 + typescript: 66 + specifier: 5.4.5 67 + version: 5.4.5 68 + typescript-eslint: 69 + specifier: 7.7.0 70 + version: 7.7.0(eslint@9.1.0)(typescript@5.4.5) 71 + vitest: 72 + specifier: 1.5.0 73 + version: 1.5.0(@types/node@20.12.7) 26 74 27 75 docs: 28 76 devDependencies: 29 77 vitepress: 30 78 specifier: 1.1.3 31 - version: 1.1.3(@algolia/client-search@4.23.3)(search-insights@2.13.0) 79 + version: 1.1.3(@algolia/client-search@4.23.3)(@types/node@20.12.7)(search-insights@2.13.0)(typescript@5.4.5) 80 + 81 + packages/client-axios: 82 + dependencies: 83 + '@hey-api/client-core': 84 + specifier: workspace:* 85 + version: link:../client-core 86 + devDependencies: 87 + axios: 88 + specifier: 1.6.8 89 + version: 1.6.8 90 + 91 + packages/client-core: {} 92 + 93 + packages/client-fetch: 94 + dependencies: 95 + '@hey-api/client-core': 96 + specifier: workspace:* 97 + version: link:../client-core 32 98 33 99 packages/openapi-ts: 34 100 dependencies: ··· 81 147 '@angular/router': 82 148 specifier: 17.3.5 83 149 version: 17.3.5(@angular/common@17.3.5)(@angular/core@17.3.5)(@angular/platform-browser@17.3.5)(rxjs@7.8.1) 84 - '@rollup/plugin-commonjs': 85 - specifier: 25.0.7 86 - version: 25.0.7(rollup@4.16.1) 87 150 '@rollup/plugin-json': 88 151 specifier: 6.1.0 89 152 version: 6.1.0(rollup@4.16.1) 90 153 '@rollup/plugin-node-resolve': 91 154 specifier: 15.2.3 92 155 version: 15.2.3(rollup@4.16.1) 93 - '@rollup/plugin-terser': 94 - specifier: 0.4.4 95 - version: 0.4.4(rollup@4.16.1) 96 - '@rollup/plugin-typescript': 97 - specifier: 11.1.6 98 - version: 11.1.6(rollup@4.16.1)(tslib@2.6.2)(typescript@5.4.5) 99 156 '@types/cross-spawn': 100 157 specifier: 6.0.6 101 158 version: 6.0.6 102 159 '@types/express': 103 160 specifier: 4.17.21 104 161 version: 4.17.21 105 - '@types/node': 106 - specifier: 20.12.7 107 - version: 20.12.7 108 - '@vitest/coverage-v8': 109 - specifier: 1.5.0 110 - version: 1.5.0(vitest@1.5.0) 111 162 axios: 112 163 specifier: 1.6.8 113 164 version: 1.6.8 ··· 117 168 eslint: 118 169 specifier: 9.1.0 119 170 version: 9.1.0 120 - eslint-config-prettier: 121 - specifier: 9.1.0 122 - version: 9.1.0(eslint@9.1.0) 123 - eslint-plugin-simple-import-sort: 124 - specifier: 12.1.0 125 - version: 12.1.0(eslint@9.1.0) 126 - eslint-plugin-sort-keys-fix: 127 - specifier: 1.1.2 128 - version: 1.1.2 129 171 express: 130 172 specifier: 4.19.2 131 173 version: 4.19.2 132 174 glob: 133 175 specifier: 10.3.12 134 176 version: 10.3.12 135 - globals: 136 - specifier: 15.0.0 137 - version: 15.0.0 138 177 node-fetch: 139 178 specifier: 3.3.2 140 179 version: 3.3.2 ··· 144 183 puppeteer: 145 184 specifier: 22.6.5 146 185 version: 22.6.5(typescript@5.4.5) 147 - rimraf: 148 - specifier: 5.0.5 149 - version: 5.0.5 150 - rollup: 151 - specifier: 4.16.1 152 - version: 4.16.1 153 - rollup-plugin-dts: 154 - specifier: 6.1.0 155 - version: 6.1.0(rollup@4.16.1)(typescript@5.4.5) 156 186 rxjs: 157 187 specifier: 7.8.1 158 188 version: 7.8.1 ··· 165 195 typescript: 166 196 specifier: 5.4.5 167 197 version: 5.4.5 168 - typescript-eslint: 169 - specifier: 7.7.0 170 - version: 7.7.0(eslint@9.1.0)(typescript@5.4.5) 171 - vitest: 172 - specifier: 1.5.0 173 - version: 1.5.0(@types/node@20.12.7)(less@4.2.0) 174 198 175 199 packages: 176 200 ··· 179 203 engines: {node: '>=0.10.0'} 180 204 dev: true 181 205 182 - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2)(search-insights@2.13.0): 206 + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0): 183 207 resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} 184 208 dependencies: 185 - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2)(search-insights@2.13.0) 186 - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2) 209 + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) 210 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) 187 211 transitivePeerDependencies: 188 212 - '@algolia/client-search' 189 213 - algoliasearch 190 214 - search-insights 191 215 dev: true 192 216 193 - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2)(search-insights@2.13.0): 217 + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0): 194 218 resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} 195 219 peerDependencies: 196 220 search-insights: '>= 1 < 3' 197 221 dependencies: 198 - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2) 222 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) 199 223 search-insights: 2.13.0 200 224 transitivePeerDependencies: 201 225 - '@algolia/client-search' 202 226 - algoliasearch 203 227 dev: true 204 228 205 - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2): 229 + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3): 206 230 resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} 207 231 peerDependencies: 208 232 '@algolia/client-search': '>= 4.9.1 < 6' 209 233 algoliasearch: '>= 4.9.1 < 6' 210 234 dependencies: 211 - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2) 235 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) 212 236 '@algolia/client-search': 4.23.3 213 - algoliasearch: 4.23.2 237 + algoliasearch: 4.23.3 214 238 dev: true 215 239 216 - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2): 240 + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3): 217 241 resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} 218 242 peerDependencies: 219 243 '@algolia/client-search': '>= 4.9.1 < 6' 220 244 algoliasearch: '>= 4.9.1 < 6' 221 245 dependencies: 222 246 '@algolia/client-search': 4.23.3 223 - algoliasearch: 4.23.2 247 + algoliasearch: 4.23.3 224 248 dev: true 225 249 226 - /@algolia/cache-browser-local-storage@4.23.2: 227 - resolution: {integrity: sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==} 250 + /@algolia/cache-browser-local-storage@4.23.3: 251 + resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} 228 252 dependencies: 229 - '@algolia/cache-common': 4.23.2 230 - dev: true 231 - 232 - /@algolia/cache-common@4.23.2: 233 - resolution: {integrity: sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==} 253 + '@algolia/cache-common': 4.23.3 234 254 dev: true 235 255 236 256 /@algolia/cache-common@4.23.3: 237 257 resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} 238 258 dev: true 239 259 240 - /@algolia/cache-in-memory@4.23.2: 241 - resolution: {integrity: sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==} 260 + /@algolia/cache-in-memory@4.23.3: 261 + resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} 242 262 dependencies: 243 - '@algolia/cache-common': 4.23.2 244 - dev: true 245 - 246 - /@algolia/client-account@4.23.2: 247 - resolution: {integrity: sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==} 248 - dependencies: 249 - '@algolia/client-common': 4.23.2 250 - '@algolia/client-search': 4.23.2 251 - '@algolia/transporter': 4.23.2 263 + '@algolia/cache-common': 4.23.3 252 264 dev: true 253 265 254 - /@algolia/client-analytics@4.23.2: 255 - resolution: {integrity: sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==} 266 + /@algolia/client-account@4.23.3: 267 + resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} 256 268 dependencies: 257 - '@algolia/client-common': 4.23.2 258 - '@algolia/client-search': 4.23.2 259 - '@algolia/requester-common': 4.23.2 260 - '@algolia/transporter': 4.23.2 269 + '@algolia/client-common': 4.23.3 270 + '@algolia/client-search': 4.23.3 271 + '@algolia/transporter': 4.23.3 261 272 dev: true 262 273 263 - /@algolia/client-common@4.23.2: 264 - resolution: {integrity: sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==} 274 + /@algolia/client-analytics@4.23.3: 275 + resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} 265 276 dependencies: 266 - '@algolia/requester-common': 4.23.2 267 - '@algolia/transporter': 4.23.2 277 + '@algolia/client-common': 4.23.3 278 + '@algolia/client-search': 4.23.3 279 + '@algolia/requester-common': 4.23.3 280 + '@algolia/transporter': 4.23.3 268 281 dev: true 269 282 270 283 /@algolia/client-common@4.23.3: ··· 274 287 '@algolia/transporter': 4.23.3 275 288 dev: true 276 289 277 - /@algolia/client-personalization@4.23.2: 278 - resolution: {integrity: sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==} 290 + /@algolia/client-personalization@4.23.3: 291 + resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} 279 292 dependencies: 280 - '@algolia/client-common': 4.23.2 281 - '@algolia/requester-common': 4.23.2 282 - '@algolia/transporter': 4.23.2 283 - dev: true 284 - 285 - /@algolia/client-search@4.23.2: 286 - resolution: {integrity: sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==} 287 - dependencies: 288 - '@algolia/client-common': 4.23.2 289 - '@algolia/requester-common': 4.23.2 290 - '@algolia/transporter': 4.23.2 293 + '@algolia/client-common': 4.23.3 294 + '@algolia/requester-common': 4.23.3 295 + '@algolia/transporter': 4.23.3 291 296 dev: true 292 297 293 298 /@algolia/client-search@4.23.3: ··· 298 303 '@algolia/transporter': 4.23.3 299 304 dev: true 300 305 301 - /@algolia/logger-common@4.23.2: 302 - resolution: {integrity: sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==} 303 - dev: true 304 - 305 306 /@algolia/logger-common@4.23.3: 306 307 resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} 307 308 dev: true 308 309 309 - /@algolia/logger-console@4.23.2: 310 - resolution: {integrity: sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==} 310 + /@algolia/logger-console@4.23.3: 311 + resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} 311 312 dependencies: 312 - '@algolia/logger-common': 4.23.2 313 + '@algolia/logger-common': 4.23.3 313 314 dev: true 314 315 315 - /@algolia/recommend@4.23.2: 316 - resolution: {integrity: sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==} 316 + /@algolia/recommend@4.23.3: 317 + resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} 317 318 dependencies: 318 - '@algolia/cache-browser-local-storage': 4.23.2 319 - '@algolia/cache-common': 4.23.2 320 - '@algolia/cache-in-memory': 4.23.2 321 - '@algolia/client-common': 4.23.2 322 - '@algolia/client-search': 4.23.2 323 - '@algolia/logger-common': 4.23.2 324 - '@algolia/logger-console': 4.23.2 325 - '@algolia/requester-browser-xhr': 4.23.2 326 - '@algolia/requester-common': 4.23.2 327 - '@algolia/requester-node-http': 4.23.2 328 - '@algolia/transporter': 4.23.2 319 + '@algolia/cache-browser-local-storage': 4.23.3 320 + '@algolia/cache-common': 4.23.3 321 + '@algolia/cache-in-memory': 4.23.3 322 + '@algolia/client-common': 4.23.3 323 + '@algolia/client-search': 4.23.3 324 + '@algolia/logger-common': 4.23.3 325 + '@algolia/logger-console': 4.23.3 326 + '@algolia/requester-browser-xhr': 4.23.3 327 + '@algolia/requester-common': 4.23.3 328 + '@algolia/requester-node-http': 4.23.3 329 + '@algolia/transporter': 4.23.3 329 330 dev: true 330 331 331 - /@algolia/requester-browser-xhr@4.23.2: 332 - resolution: {integrity: sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==} 332 + /@algolia/requester-browser-xhr@4.23.3: 333 + resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} 333 334 dependencies: 334 - '@algolia/requester-common': 4.23.2 335 - dev: true 336 - 337 - /@algolia/requester-common@4.23.2: 338 - resolution: {integrity: sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==} 335 + '@algolia/requester-common': 4.23.3 339 336 dev: true 340 337 341 338 /@algolia/requester-common@4.23.3: 342 339 resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} 343 340 dev: true 344 341 345 - /@algolia/requester-node-http@4.23.2: 346 - resolution: {integrity: sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==} 342 + /@algolia/requester-node-http@4.23.3: 343 + resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} 347 344 dependencies: 348 - '@algolia/requester-common': 4.23.2 349 - dev: true 350 - 351 - /@algolia/transporter@4.23.2: 352 - resolution: {integrity: sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==} 353 - dependencies: 354 - '@algolia/cache-common': 4.23.2 355 - '@algolia/logger-common': 4.23.2 356 - '@algolia/requester-common': 4.23.2 345 + '@algolia/requester-common': 4.23.3 357 346 dev: true 358 347 359 348 /@algolia/transporter@4.23.3: ··· 769 758 dependencies: 770 759 '@ampproject/remapping': 2.3.0 771 760 '@babel/code-frame': 7.24.2 772 - '@babel/generator': 7.24.4 761 + '@babel/generator': 7.23.6 773 762 '@babel/helper-compilation-targets': 7.23.6 774 763 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) 775 764 '@babel/helpers': 7.24.4 ··· 1048 1037 /@babel/highlight@7.24.2: 1049 1038 resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} 1050 1039 engines: {node: '>=6.9.0'} 1051 - requiresBuild: true 1052 1040 dependencies: 1053 1041 '@babel/helper-validator-identifier': 7.22.20 1054 1042 chalk: 2.4.2 ··· 1908 1896 babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.0) 1909 1897 babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) 1910 1898 babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) 1911 - core-js-compat: 3.36.1 1899 + core-js-compat: 3.37.0 1912 1900 semver: 6.3.1 1913 1901 transitivePeerDependencies: 1914 1902 - supports-color ··· 1936 1924 regenerator-runtime: 0.14.1 1937 1925 dev: true 1938 1926 1939 - /@babel/runtime@7.24.1: 1940 - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} 1927 + /@babel/runtime@7.24.4: 1928 + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} 1941 1929 engines: {node: '>=6.9.0'} 1942 1930 dependencies: 1943 1931 regenerator-runtime: 0.14.1 ··· 1986 1974 /@changesets/apply-release-plan@7.0.0: 1987 1975 resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} 1988 1976 dependencies: 1989 - '@babel/runtime': 7.24.1 1977 + '@babel/runtime': 7.24.4 1990 1978 '@changesets/config': 3.0.0 1991 1979 '@changesets/get-version-range-type': 0.4.0 1992 1980 '@changesets/git': 3.0.0 ··· 2004 1992 /@changesets/assemble-release-plan@6.0.0: 2005 1993 resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} 2006 1994 dependencies: 2007 - '@babel/runtime': 7.24.1 1995 + '@babel/runtime': 7.24.4 2008 1996 '@changesets/errors': 0.2.0 2009 1997 '@changesets/get-dependents-graph': 2.0.0 2010 1998 '@changesets/types': 6.0.0 ··· 2022 2010 resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} 2023 2011 hasBin: true 2024 2012 dependencies: 2025 - '@babel/runtime': 7.24.1 2013 + '@babel/runtime': 7.24.4 2026 2014 '@changesets/apply-release-plan': 7.0.0 2027 2015 '@changesets/assemble-release-plan': 6.0.0 2028 2016 '@changesets/changelog-git': 0.2.0 ··· 2096 2084 /@changesets/get-release-plan@4.0.0: 2097 2085 resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} 2098 2086 dependencies: 2099 - '@babel/runtime': 7.24.1 2087 + '@babel/runtime': 7.24.4 2100 2088 '@changesets/assemble-release-plan': 6.0.0 2101 2089 '@changesets/config': 3.0.0 2102 2090 '@changesets/pre': 2.0.0 ··· 2112 2100 /@changesets/git@3.0.0: 2113 2101 resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} 2114 2102 dependencies: 2115 - '@babel/runtime': 7.24.1 2103 + '@babel/runtime': 7.24.4 2116 2104 '@changesets/errors': 0.2.0 2117 2105 '@changesets/types': 6.0.0 2118 2106 '@manypkg/get-packages': 1.1.3 ··· 2137 2125 /@changesets/pre@2.0.0: 2138 2126 resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} 2139 2127 dependencies: 2140 - '@babel/runtime': 7.24.1 2128 + '@babel/runtime': 7.24.4 2141 2129 '@changesets/errors': 0.2.0 2142 2130 '@changesets/types': 6.0.0 2143 2131 '@manypkg/get-packages': 1.1.3 ··· 2147 2135 /@changesets/read@0.6.0: 2148 2136 resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} 2149 2137 dependencies: 2150 - '@babel/runtime': 7.24.1 2138 + '@babel/runtime': 7.24.4 2151 2139 '@changesets/git': 3.0.0 2152 2140 '@changesets/logger': 0.1.0 2153 2141 '@changesets/parse': 0.4.0 ··· 2168 2156 /@changesets/write@0.3.0: 2169 2157 resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} 2170 2158 dependencies: 2171 - '@babel/runtime': 7.24.1 2159 + '@babel/runtime': 7.24.4 2172 2160 '@changesets/types': 6.0.0 2173 2161 fs-extra: 7.0.1 2174 2162 human-id: 1.0.2 ··· 2195 2183 resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} 2196 2184 dependencies: 2197 2185 '@docsearch/react': 3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0) 2198 - preact: 10.20.1 2186 + preact: 10.20.2 2199 2187 transitivePeerDependencies: 2200 2188 - '@algolia/client-search' 2201 2189 - '@types/react' ··· 2221 2209 search-insights: 2222 2210 optional: true 2223 2211 dependencies: 2224 - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2)(search-insights@2.13.0) 2225 - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.2) 2212 + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) 2213 + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) 2226 2214 '@docsearch/css': 3.6.0 2227 - algoliasearch: 4.23.2 2215 + algoliasearch: 4.23.3 2228 2216 search-insights: 2.13.0 2229 2217 transitivePeerDependencies: 2230 2218 - '@algolia/client-search' ··· 3010 2998 /@manypkg/find-root@1.1.0: 3011 2999 resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 3012 3000 dependencies: 3013 - '@babel/runtime': 7.24.1 3001 + '@babel/runtime': 7.24.4 3014 3002 '@types/node': 12.20.55 3015 3003 find-up: 4.1.0 3016 3004 fs-extra: 8.1.0 ··· 3019 3007 /@manypkg/get-packages@1.1.3: 3020 3008 resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 3021 3009 dependencies: 3022 - '@babel/runtime': 7.24.1 3010 + '@babel/runtime': 7.24.4 3023 3011 '@changesets/types': 4.1.0 3024 3012 '@manypkg/find-root': 1.1.0 3025 3013 fs-extra: 8.1.0 ··· 3081 3069 semver: 7.6.0 3082 3070 dev: true 3083 3071 3084 - /@npmcli/git@5.0.4: 3085 - resolution: {integrity: sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==} 3072 + /@npmcli/git@5.0.6: 3073 + resolution: {integrity: sha512-4x/182sKXmQkf0EtXxT26GEsaOATpD7WVtza5hrYivWZeo6QefC6xq9KAXrnjtFKBZ4rZwR7aX/zClYYXgtwLw==} 3086 3074 engines: {node: ^16.14.0 || >=18.0.0} 3087 3075 dependencies: 3088 3076 '@npmcli/promise-spawn': 7.0.1 3089 3077 lru-cache: 10.2.0 3090 3078 npm-pick-manifest: 9.0.0 3091 - proc-log: 3.0.0 3079 + proc-log: 4.2.0 3092 3080 promise-inflight: 1.0.1 3093 3081 promise-retry: 2.0.1 3094 3082 semver: 7.6.0 ··· 3111 3099 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 3112 3100 dev: true 3113 3101 3114 - /@npmcli/package-json@5.0.0: 3115 - resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} 3102 + /@npmcli/package-json@5.0.3: 3103 + resolution: {integrity: sha512-cgsjCvld2wMqkUqvY+SZI+1ZJ7umGBYc9IAKfqJRKJCcs7hCQYxScUgdsyrRINk3VmdCYf9TXiLBHQ6ECTxhtg==} 3116 3104 engines: {node: ^16.14.0 || >=18.0.0} 3117 3105 dependencies: 3118 - '@npmcli/git': 5.0.4 3106 + '@npmcli/git': 5.0.6 3119 3107 glob: 10.3.12 3120 3108 hosted-git-info: 7.0.1 3121 3109 json-parse-even-better-errors: 3.0.1 3122 3110 normalize-package-data: 6.0.0 3123 - proc-log: 3.0.0 3111 + proc-log: 4.2.0 3124 3112 semver: 7.6.0 3125 3113 transitivePeerDependencies: 3126 3114 - bluebird ··· 3143 3131 engines: {node: ^16.14.0 || >=18.0.0} 3144 3132 dependencies: 3145 3133 '@npmcli/node-gyp': 3.0.0 3146 - '@npmcli/package-json': 5.0.0 3134 + '@npmcli/package-json': 5.0.3 3147 3135 '@npmcli/promise-spawn': 7.0.1 3148 3136 node-gyp: 10.1.0 3149 3137 which: 4.0.0 ··· 3190 3178 estree-walker: 2.0.2 3191 3179 glob: 8.1.0 3192 3180 is-reference: 1.2.1 3193 - magic-string: 0.30.8 3181 + magic-string: 0.30.10 3194 3182 rollup: 4.16.1 3195 3183 dev: true 3196 3184 ··· 3240 3228 terser: 5.30.3 3241 3229 dev: true 3242 3230 3243 - /@rollup/plugin-typescript@11.1.6(rollup@4.16.1)(tslib@2.6.2)(typescript@5.4.5): 3231 + /@rollup/plugin-typescript@11.1.6(rollup@4.16.1)(typescript@5.4.5): 3244 3232 resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} 3245 3233 engines: {node: '>=14.0.0'} 3246 3234 peerDependencies: ··· 3256 3244 '@rollup/pluginutils': 5.1.0(rollup@4.16.1) 3257 3245 resolve: 1.22.8 3258 3246 rollup: 4.16.1 3259 - tslib: 2.6.2 3260 3247 typescript: 5.4.5 3261 3248 dev: true 3262 3249 ··· 3554 3541 /@types/eslint-scope@3.7.7: 3555 3542 resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} 3556 3543 dependencies: 3557 - '@types/eslint': 8.56.7 3544 + '@types/eslint': 8.56.10 3558 3545 '@types/estree': 1.0.5 3559 3546 dev: true 3560 3547 3561 - /@types/eslint@8.56.7: 3562 - resolution: {integrity: sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==} 3548 + /@types/eslint@8.56.10: 3549 + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} 3563 3550 dependencies: 3564 3551 '@types/estree': 1.0.5 3565 3552 '@types/json-schema': 7.0.15 ··· 3573 3560 resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} 3574 3561 dependencies: 3575 3562 '@types/node': 20.12.7 3576 - '@types/qs': 6.9.14 3563 + '@types/qs': 6.9.15 3577 3564 '@types/range-parser': 1.2.7 3578 3565 '@types/send': 0.17.4 3579 3566 dev: true ··· 3583 3570 dependencies: 3584 3571 '@types/body-parser': 1.19.5 3585 3572 '@types/express-serve-static-core': 4.19.0 3586 - '@types/qs': 6.9.14 3573 + '@types/qs': 6.9.15 3587 3574 '@types/serve-static': 1.15.7 3588 3575 dev: true 3589 3576 ··· 3643 3630 resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} 3644 3631 dev: true 3645 3632 3646 - /@types/qs@6.9.14: 3647 - resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} 3633 + /@types/qs@6.9.15: 3634 + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} 3648 3635 dev: true 3649 3636 3650 3637 /@types/range-parser@1.2.7: ··· 3849 3836 vite: 5.1.7(@types/node@20.12.7)(less@4.2.0)(sass@1.71.1)(terser@5.29.1) 3850 3837 dev: true 3851 3838 3852 - /@vitejs/plugin-vue@5.0.4(vite@5.2.9)(vue@3.4.23): 3839 + /@vitejs/plugin-vue@5.0.4(vite@5.2.10)(vue@3.4.23): 3853 3840 resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} 3854 3841 engines: {node: ^18.0.0 || >=20.0.0} 3855 3842 peerDependencies: 3856 3843 vite: ^5.0.0 3857 3844 vue: ^3.2.25 3858 3845 dependencies: 3859 - vite: 5.2.9(@types/node@20.12.7)(less@4.2.0) 3860 - vue: 3.4.23 3846 + vite: 5.2.10(@types/node@20.12.7) 3847 + vue: 3.4.23(typescript@5.4.5) 3861 3848 dev: true 3862 3849 3863 3850 /@vitest/coverage-v8@1.5.0(vitest@1.5.0): ··· 3872 3859 istanbul-lib-report: 3.0.1 3873 3860 istanbul-lib-source-maps: 5.0.4 3874 3861 istanbul-reports: 3.1.7 3875 - magic-string: 0.30.9 3876 - magicast: 0.3.3 3862 + magic-string: 0.30.10 3863 + magicast: 0.3.4 3877 3864 picocolors: 1.0.0 3878 3865 std-env: 3.7.0 3879 3866 strip-literal: 2.1.0 3880 3867 test-exclude: 6.0.0 3881 - vitest: 1.5.0(@types/node@20.12.7)(less@4.2.0) 3868 + vitest: 1.5.0(@types/node@20.12.7) 3882 3869 transitivePeerDependencies: 3883 3870 - supports-color 3884 3871 dev: true ··· 3902 3889 /@vitest/snapshot@1.5.0: 3903 3890 resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} 3904 3891 dependencies: 3905 - magic-string: 0.30.9 3892 + magic-string: 0.30.10 3906 3893 pathe: 1.1.2 3907 3894 pretty-format: 29.7.0 3908 3895 dev: true ··· 3948 3935 '@vue/compiler-ssr': 3.4.23 3949 3936 '@vue/shared': 3.4.23 3950 3937 estree-walker: 2.0.2 3951 - magic-string: 0.30.9 3938 + magic-string: 0.30.10 3952 3939 postcss: 8.4.38 3953 3940 source-map-js: 1.2.0 3954 3941 dev: true ··· 3978 3965 mitt: 3.0.1 3979 3966 perfect-debounce: 1.0.0 3980 3967 speakingurl: 14.0.1 3981 - vue: 3.4.23 3968 + vue: 3.4.23(typescript@5.4.5) 3982 3969 dev: true 3983 3970 3984 3971 /@vue/devtools-shared@7.0.27: ··· 4015 4002 dependencies: 4016 4003 '@vue/compiler-ssr': 3.4.23 4017 4004 '@vue/shared': 3.4.23 4018 - vue: 3.4.23 4005 + vue: 3.4.23(typescript@5.4.5) 4019 4006 dev: true 4020 4007 4021 4008 /@vue/shared@3.4.23: ··· 4339 4326 uri-js: 4.4.1 4340 4327 dev: true 4341 4328 4342 - /algoliasearch@4.23.2: 4343 - resolution: {integrity: sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==} 4329 + /algoliasearch@4.23.3: 4330 + resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} 4344 4331 dependencies: 4345 - '@algolia/cache-browser-local-storage': 4.23.2 4346 - '@algolia/cache-common': 4.23.2 4347 - '@algolia/cache-in-memory': 4.23.2 4348 - '@algolia/client-account': 4.23.2 4349 - '@algolia/client-analytics': 4.23.2 4350 - '@algolia/client-common': 4.23.2 4351 - '@algolia/client-personalization': 4.23.2 4352 - '@algolia/client-search': 4.23.2 4353 - '@algolia/logger-common': 4.23.2 4354 - '@algolia/logger-console': 4.23.2 4355 - '@algolia/recommend': 4.23.2 4356 - '@algolia/requester-browser-xhr': 4.23.2 4357 - '@algolia/requester-common': 4.23.2 4358 - '@algolia/requester-node-http': 4.23.2 4359 - '@algolia/transporter': 4.23.2 4332 + '@algolia/cache-browser-local-storage': 4.23.3 4333 + '@algolia/cache-common': 4.23.3 4334 + '@algolia/cache-in-memory': 4.23.3 4335 + '@algolia/client-account': 4.23.3 4336 + '@algolia/client-analytics': 4.23.3 4337 + '@algolia/client-common': 4.23.3 4338 + '@algolia/client-personalization': 4.23.3 4339 + '@algolia/client-search': 4.23.3 4340 + '@algolia/logger-common': 4.23.3 4341 + '@algolia/logger-console': 4.23.3 4342 + '@algolia/recommend': 4.23.3 4343 + '@algolia/requester-browser-xhr': 4.23.3 4344 + '@algolia/requester-common': 4.23.3 4345 + '@algolia/requester-node-http': 4.23.3 4346 + '@algolia/transporter': 4.23.3 4360 4347 dev: true 4361 4348 4362 4349 /ansi-colors@4.1.3: ··· 4505 4492 postcss: ^8.1.0 4506 4493 dependencies: 4507 4494 browserslist: 4.23.0 4508 - caniuse-lite: 1.0.30001606 4495 + caniuse-lite: 1.0.30001612 4509 4496 fraction.js: 4.3.7 4510 4497 normalize-range: 0.1.2 4511 4498 picocolors: 1.0.0 ··· 4580 4567 dependencies: 4581 4568 '@babel/core': 7.24.0 4582 4569 '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) 4583 - core-js-compat: 3.36.1 4570 + core-js-compat: 3.37.0 4584 4571 transitivePeerDependencies: 4585 4572 - supports-color 4586 4573 dev: true ··· 4727 4714 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 4728 4715 hasBin: true 4729 4716 dependencies: 4730 - caniuse-lite: 1.0.30001606 4731 - electron-to-chromium: 1.4.729 4717 + caniuse-lite: 1.0.30001612 4718 + electron-to-chromium: 1.4.745 4732 4719 node-releases: 2.0.14 4733 4720 update-browserslist-db: 1.0.13(browserslist@4.23.0) 4734 4721 dev: true ··· 4773 4760 resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} 4774 4761 dependencies: 4775 4762 chokidar: 3.6.0 4776 - confbox: 0.1.3 4763 + confbox: 0.1.7 4777 4764 defu: 6.1.4 4778 4765 dotenv: 16.4.5 4779 4766 giget: 1.2.3 ··· 4782 4769 ohash: 1.1.3 4783 4770 pathe: 1.1.2 4784 4771 perfect-debounce: 1.0.0 4785 - pkg-types: 1.0.3 4786 - rc9: 2.1.1 4772 + pkg-types: 1.1.0 4773 + rc9: 2.1.2 4787 4774 dev: false 4788 4775 4789 4776 /cac@6.7.14: ··· 4844 4831 engines: {node: '>=16'} 4845 4832 dev: false 4846 4833 4847 - /caniuse-lite@1.0.30001606: 4848 - resolution: {integrity: sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==} 4834 + /caniuse-lite@1.0.30001612: 4835 + resolution: {integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==} 4849 4836 dev: true 4850 4837 4851 4838 /chai@4.4.1: ··· 5086 5073 resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 5087 5074 dev: true 5088 5075 5089 - /confbox@0.1.3: 5090 - resolution: {integrity: sha512-eH3ZxAihl1PhKfpr4VfEN6/vUd87fmgb6JkldHgg/YR6aEBhW63qUDgzP2Y6WM0UumdsYp5H3kibalXAdHfbgg==} 5091 - dev: false 5076 + /confbox@0.1.7: 5077 + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} 5092 5078 5093 5079 /connect-history-api-fallback@2.0.0: 5094 5080 resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} ··· 5150 5136 webpack: 5.90.3(esbuild@0.20.1) 5151 5137 dev: true 5152 5138 5153 - /core-js-compat@3.36.1: 5154 - resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} 5139 + /core-js-compat@3.37.0: 5140 + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} 5155 5141 dependencies: 5156 5142 browserslist: 4.23.0 5157 5143 dev: true ··· 5188 5174 dom-serializer: 2.0.0 5189 5175 domhandler: 5.0.3 5190 5176 htmlparser2: 8.0.2 5191 - postcss: 8.4.38 5177 + postcss: 8.4.35 5192 5178 postcss-media-query-parser: 0.2.3 5193 5179 dev: true 5194 5180 ··· 5220 5206 webpack: 5221 5207 optional: true 5222 5208 dependencies: 5223 - icss-utils: 5.1.0(postcss@8.4.38) 5224 - postcss: 8.4.38 5225 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) 5226 - postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) 5227 - postcss-modules-scope: 3.2.0(postcss@8.4.38) 5228 - postcss-modules-values: 4.0.0(postcss@8.4.38) 5209 + icss-utils: 5.1.0(postcss@8.4.35) 5210 + postcss: 8.4.35 5211 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.35) 5212 + postcss-modules-local-by-default: 4.0.5(postcss@8.4.35) 5213 + postcss-modules-scope: 3.2.0(postcss@8.4.35) 5214 + postcss-modules-values: 4.0.0(postcss@8.4.35) 5229 5215 postcss-value-parser: 4.2.0 5230 5216 semver: 7.6.0 5231 5217 webpack: 5.90.3(esbuild@0.20.1) ··· 5520 5506 resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 5521 5507 dev: true 5522 5508 5523 - /electron-to-chromium@1.4.729: 5524 - resolution: {integrity: sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==} 5509 + /electron-to-chromium@1.4.745: 5510 + resolution: {integrity: sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA==} 5525 5511 dev: true 5526 5512 5527 5513 /emoji-regex@10.3.0: ··· 6254 6240 /flat@5.0.2: 6255 6241 resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 6256 6242 hasBin: true 6243 + dev: true 6257 6244 6258 6245 /flatted@3.3.1: 6259 6246 resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} ··· 6811 6798 /iconv-lite@0.6.3: 6812 6799 resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 6813 6800 engines: {node: '>=0.10.0'} 6814 - requiresBuild: true 6815 6801 dependencies: 6816 6802 safer-buffer: 2.1.2 6817 6803 dev: true 6818 6804 6819 - /icss-utils@5.1.0(postcss@8.4.38): 6805 + /icss-utils@5.1.0(postcss@8.4.35): 6820 6806 resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} 6821 6807 engines: {node: ^10 || ^12 || >= 14} 6822 6808 peerDependencies: 6823 6809 postcss: ^8.1.0 6824 6810 dependencies: 6825 - postcss: 8.4.38 6811 + postcss: 8.4.35 6826 6812 dev: true 6827 6813 6828 6814 /ieee754@1.2.1: ··· 6934 6920 engines: {node: '>= 0.10'} 6935 6921 dev: true 6936 6922 6937 - /ipaddr.js@2.1.0: 6938 - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} 6923 + /ipaddr.js@2.2.0: 6924 + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} 6939 6925 engines: {node: '>= 10'} 6940 6926 dev: true 6941 6927 ··· 7263 7249 7264 7250 /js-tokens@4.0.0: 7265 7251 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 7266 - requiresBuild: true 7267 7252 dev: true 7268 7253 7269 7254 /js-tokens@9.0.0: ··· 7332 7317 7333 7318 /jsonc-parser@3.2.1: 7334 7319 resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} 7320 + dev: true 7335 7321 7336 7322 /jsonfile@4.0.0: 7337 7323 resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} ··· 7510 7496 engines: {node: '>=14'} 7511 7497 dependencies: 7512 7498 mlly: 1.6.1 7513 - pkg-types: 1.0.3 7499 + pkg-types: 1.1.0 7514 7500 dev: true 7515 7501 7516 7502 /locate-path@5.0.0: ··· 7548 7534 7549 7535 /lodash@4.17.21: 7550 7536 resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 7551 - requiresBuild: true 7552 7537 dev: true 7553 7538 7554 7539 /log-symbols@4.1.0: ··· 7606 7591 engines: {node: '>=12'} 7607 7592 dev: true 7608 7593 7609 - /magic-string@0.30.8: 7610 - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} 7611 - engines: {node: '>=12'} 7594 + /magic-string@0.30.10: 7595 + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} 7612 7596 dependencies: 7613 7597 '@jridgewell/sourcemap-codec': 1.4.15 7614 7598 dev: true 7615 7599 7616 - /magic-string@0.30.9: 7617 - resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} 7600 + /magic-string@0.30.8: 7601 + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} 7618 7602 engines: {node: '>=12'} 7619 7603 dependencies: 7620 7604 '@jridgewell/sourcemap-codec': 1.4.15 7621 7605 dev: true 7622 7606 7623 - /magicast@0.3.3: 7624 - resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} 7607 + /magicast@0.3.4: 7608 + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} 7625 7609 dependencies: 7626 7610 '@babel/parser': 7.24.4 7627 7611 '@babel/types': 7.24.0 ··· 7907 7891 dependencies: 7908 7892 acorn: 8.11.3 7909 7893 pathe: 1.1.2 7910 - pkg-types: 1.0.3 7894 + pkg-types: 1.1.0 7911 7895 ufo: 1.5.3 7912 7896 7913 7897 /mrmime@2.0.0: ··· 8137 8121 semver: 7.6.0 8138 8122 dev: true 8139 8123 8140 - /npm-registry-fetch@16.2.0: 8141 - resolution: {integrity: sha512-zVH+G0q1O2hqgQBUvQ2LWp6ujr6VJAeDnmWxqiMlCguvLexEzBnuQIwC70r04vcvCMAcYEIpA/rO9YyVi+fmJQ==} 8124 + /npm-registry-fetch@16.2.1: 8125 + resolution: {integrity: sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA==} 8142 8126 engines: {node: ^16.14.0 || >=18.0.0} 8143 8127 dependencies: 8144 8128 '@npmcli/redact': 1.1.0 ··· 8148 8132 minipass-json-stream: 1.0.1 8149 8133 minizlib: 2.1.2 8150 8134 npm-package-arg: 11.0.1 8151 - proc-log: 3.0.0 8135 + proc-log: 4.2.0 8152 8136 transitivePeerDependencies: 8153 8137 - supports-color 8154 8138 dev: true ··· 8397 8381 engines: {node: ^16.14.0 || >=18.0.0} 8398 8382 hasBin: true 8399 8383 dependencies: 8400 - '@npmcli/git': 5.0.4 8384 + '@npmcli/git': 5.0.6 8401 8385 '@npmcli/installed-package-contents': 2.0.2 8402 8386 '@npmcli/promise-spawn': 7.0.1 8403 8387 '@npmcli/run-script': 7.0.4 ··· 8407 8391 npm-package-arg: 11.0.1 8408 8392 npm-packlist: 8.0.2 8409 8393 npm-pick-manifest: 9.0.0 8410 - npm-registry-fetch: 16.2.0 8394 + npm-registry-fetch: 16.2.1 8411 8395 proc-log: 3.0.0 8412 8396 promise-retry: 2.0.1 8413 8397 read-package-json: 7.0.0 ··· 8547 8531 /pify@4.0.1: 8548 8532 resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 8549 8533 engines: {node: '>=6'} 8550 - requiresBuild: true 8551 8534 dev: true 8552 8535 8553 8536 /piscina@4.4.0: ··· 8570 8553 find-up: 6.3.0 8571 8554 dev: true 8572 8555 8573 - /pkg-types@1.0.3: 8574 - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 8556 + /pkg-types@1.1.0: 8557 + resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} 8575 8558 dependencies: 8576 - jsonc-parser: 3.2.1 8559 + confbox: 0.1.7 8577 8560 mlly: 1.6.1 8578 8561 pathe: 1.1.2 8579 8562 ··· 8608 8591 resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} 8609 8592 dev: true 8610 8593 8611 - /postcss-modules-extract-imports@3.1.0(postcss@8.4.38): 8594 + /postcss-modules-extract-imports@3.1.0(postcss@8.4.35): 8612 8595 resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} 8613 8596 engines: {node: ^10 || ^12 || >= 14} 8614 8597 peerDependencies: 8615 8598 postcss: ^8.1.0 8616 8599 dependencies: 8617 - postcss: 8.4.38 8600 + postcss: 8.4.35 8618 8601 dev: true 8619 8602 8620 - /postcss-modules-local-by-default@4.0.5(postcss@8.4.38): 8603 + /postcss-modules-local-by-default@4.0.5(postcss@8.4.35): 8621 8604 resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} 8622 8605 engines: {node: ^10 || ^12 || >= 14} 8623 8606 peerDependencies: 8624 8607 postcss: ^8.1.0 8625 8608 dependencies: 8626 - icss-utils: 5.1.0(postcss@8.4.38) 8627 - postcss: 8.4.38 8609 + icss-utils: 5.1.0(postcss@8.4.35) 8610 + postcss: 8.4.35 8628 8611 postcss-selector-parser: 6.0.16 8629 8612 postcss-value-parser: 4.2.0 8630 8613 dev: true 8631 8614 8632 - /postcss-modules-scope@3.2.0(postcss@8.4.38): 8615 + /postcss-modules-scope@3.2.0(postcss@8.4.35): 8633 8616 resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} 8634 8617 engines: {node: ^10 || ^12 || >= 14} 8635 8618 peerDependencies: 8636 8619 postcss: ^8.1.0 8637 8620 dependencies: 8638 - postcss: 8.4.38 8621 + postcss: 8.4.35 8639 8622 postcss-selector-parser: 6.0.16 8640 8623 dev: true 8641 8624 8642 - /postcss-modules-values@4.0.0(postcss@8.4.38): 8625 + /postcss-modules-values@4.0.0(postcss@8.4.35): 8643 8626 resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} 8644 8627 engines: {node: ^10 || ^12 || >= 14} 8645 8628 peerDependencies: 8646 8629 postcss: ^8.1.0 8647 8630 dependencies: 8648 - icss-utils: 5.1.0(postcss@8.4.38) 8649 - postcss: 8.4.38 8631 + icss-utils: 5.1.0(postcss@8.4.35) 8632 + postcss: 8.4.35 8650 8633 dev: true 8651 8634 8652 8635 /postcss-selector-parser@6.0.16: ··· 8679 8662 source-map-js: 1.2.0 8680 8663 dev: true 8681 8664 8682 - /preact@10.20.1: 8683 - resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} 8665 + /preact@10.20.2: 8666 + resolution: {integrity: sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==} 8684 8667 dev: true 8685 8668 8686 8669 /preferred-pm@3.1.3: ··· 8721 8704 8722 8705 /proc-log@3.0.0: 8723 8706 resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} 8707 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 8708 + dev: true 8709 + 8710 + /proc-log@4.2.0: 8711 + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} 8724 8712 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 8725 8713 dev: true 8726 8714 ··· 8874 8862 unpipe: 1.0.0 8875 8863 dev: true 8876 8864 8877 - /rc9@2.1.1: 8878 - resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} 8865 + /rc9@2.1.2: 8866 + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} 8879 8867 dependencies: 8880 8868 defu: 6.1.4 8881 8869 destr: 2.0.3 8882 - flat: 5.0.2 8883 8870 dev: false 8884 8871 8885 8872 /react-is@18.2.0: ··· 8990 8977 /regenerator-transform@0.15.2: 8991 8978 resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} 8992 8979 dependencies: 8993 - '@babel/runtime': 7.24.1 8980 + '@babel/runtime': 7.24.0 8994 8981 dev: true 8995 8982 8996 8983 /regex-parser@2.3.0: ··· 9066 9053 adjust-sourcemap-loader: 4.0.0 9067 9054 convert-source-map: 1.9.0 9068 9055 loader-utils: 2.0.4 9069 - postcss: 8.4.38 9056 + postcss: 8.4.35 9070 9057 source-map: 0.6.1 9071 9058 dev: true 9072 9059 ··· 9136 9123 rollup: ^3.29.4 || ^4 9137 9124 typescript: ^4.5 || ^5.0 9138 9125 dependencies: 9139 - magic-string: 0.30.8 9126 + magic-string: 0.30.10 9140 9127 rollup: 4.16.1 9141 9128 typescript: 5.4.5 9142 9129 optionalDependencies: ··· 9215 9202 9216 9203 /safer-buffer@2.1.2: 9217 9204 resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 9218 - requiresBuild: true 9219 9205 dev: true 9220 9206 9221 9207 /sass-loader@14.1.1(sass@1.71.1)(webpack@5.90.3): ··· 9298 9284 /semver@5.7.2: 9299 9285 resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 9300 9286 hasBin: true 9301 - requiresBuild: true 9302 9287 dev: true 9303 9288 9304 9289 /semver@6.3.1: ··· 9539 9524 dependencies: 9540 9525 agent-base: 7.1.1 9541 9526 debug: 4.3.4 9542 - socks: 2.8.1 9527 + socks: 2.8.3 9543 9528 transitivePeerDependencies: 9544 9529 - supports-color 9545 9530 dev: true 9546 9531 9547 - /socks@2.8.1: 9548 - resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} 9532 + /socks@2.8.3: 9533 + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} 9549 9534 engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} 9550 9535 dependencies: 9551 9536 ip-address: 9.0.5 ··· 9904 9889 jest-worker: 27.5.1 9905 9890 schema-utils: 3.3.0 9906 9891 serialize-javascript: 6.0.2 9907 - terser: 5.30.3 9892 + terser: 5.29.1 9908 9893 webpack: 5.90.3(esbuild@0.20.1) 9909 9894 dev: true 9910 9895 ··· 9951 9936 resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} 9952 9937 dev: true 9953 9938 9954 - /tinybench@2.6.0: 9955 - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} 9939 + /tinybench@2.8.0: 9940 + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} 9956 9941 dev: true 9957 9942 9958 - /tinypool@0.8.3: 9959 - resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} 9943 + /tinypool@0.8.4: 9944 + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} 9960 9945 engines: {node: '>=14.0.0'} 9961 9946 dev: true 9962 9947 ··· 10330 10315 engines: {node: '>= 0.8'} 10331 10316 dev: true 10332 10317 10333 - /vite-node@1.5.0(@types/node@20.12.7)(less@4.2.0): 10318 + /vite-node@1.5.0(@types/node@20.12.7): 10334 10319 resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} 10335 10320 engines: {node: ^18.0.0 || >=20.0.0} 10336 10321 hasBin: true ··· 10339 10324 debug: 4.3.4 10340 10325 pathe: 1.1.2 10341 10326 picocolors: 1.0.0 10342 - vite: 5.2.9(@types/node@20.12.7)(less@4.2.0) 10327 + vite: 5.2.10(@types/node@20.12.7) 10343 10328 transitivePeerDependencies: 10344 10329 - '@types/node' 10345 10330 - less ··· 10382 10367 '@types/node': 20.12.7 10383 10368 esbuild: 0.19.12 10384 10369 less: 4.2.0 10385 - postcss: 8.4.38 10370 + postcss: 8.4.35 10386 10371 rollup: 4.16.1 10387 10372 sass: 1.71.1 10388 10373 terser: 5.29.1 ··· 10390 10375 fsevents: 2.3.3 10391 10376 dev: true 10392 10377 10393 - /vite@5.2.8(@types/node@20.12.7)(less@4.2.0): 10394 - resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} 10378 + /vite@5.2.10(@types/node@20.12.7): 10379 + resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} 10395 10380 engines: {node: ^18.0.0 || >=20.0.0} 10396 10381 hasBin: true 10397 10382 peerDependencies: ··· 10420 10405 dependencies: 10421 10406 '@types/node': 20.12.7 10422 10407 esbuild: 0.20.2 10423 - less: 4.2.0 10424 10408 postcss: 8.4.38 10425 10409 rollup: 4.16.1 10426 10410 optionalDependencies: 10427 10411 fsevents: 2.3.3 10428 10412 dev: true 10429 10413 10430 - /vite@5.2.9(@types/node@20.12.7)(less@4.2.0): 10431 - resolution: {integrity: sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==} 10432 - engines: {node: ^18.0.0 || >=20.0.0} 10433 - hasBin: true 10434 - peerDependencies: 10435 - '@types/node': ^18.0.0 || >=20.0.0 10436 - less: '*' 10437 - lightningcss: ^1.21.0 10438 - sass: '*' 10439 - stylus: '*' 10440 - sugarss: '*' 10441 - terser: ^5.4.0 10442 - peerDependenciesMeta: 10443 - '@types/node': 10444 - optional: true 10445 - less: 10446 - optional: true 10447 - lightningcss: 10448 - optional: true 10449 - sass: 10450 - optional: true 10451 - stylus: 10452 - optional: true 10453 - sugarss: 10454 - optional: true 10455 - terser: 10456 - optional: true 10457 - dependencies: 10458 - '@types/node': 20.12.7 10459 - esbuild: 0.20.2 10460 - less: 4.2.0 10461 - postcss: 8.4.38 10462 - rollup: 4.16.1 10463 - optionalDependencies: 10464 - fsevents: 2.3.3 10465 - dev: true 10466 - 10467 - /vitepress@1.1.3(@algolia/client-search@4.23.3)(search-insights@2.13.0): 10414 + /vitepress@1.1.3(@algolia/client-search@4.23.3)(@types/node@20.12.7)(search-insights@2.13.0)(typescript@5.4.5): 10468 10415 resolution: {integrity: sha512-hGrIYN0w9IHWs0NQSnlMjKV/v/HLfD+Ywv5QdvCSkiT32mpNOOwUrZjnqZv/JL/WBPpUc94eghTUvmipxw0xrA==} 10469 10416 hasBin: true 10470 10417 peerDependencies: ··· 10481 10428 '@shikijs/core': 1.3.0 10482 10429 '@shikijs/transformers': 1.3.0 10483 10430 '@types/markdown-it': 14.0.1 10484 - '@vitejs/plugin-vue': 5.0.4(vite@5.2.9)(vue@3.4.23) 10431 + '@vitejs/plugin-vue': 5.0.4(vite@5.2.10)(vue@3.4.23) 10485 10432 '@vue/devtools-api': 7.0.27(vue@3.4.23) 10486 10433 '@vueuse/core': 10.9.0(vue@3.4.23) 10487 10434 '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.23) ··· 10489 10436 mark.js: 8.11.1 10490 10437 minisearch: 6.3.0 10491 10438 shiki: 1.3.0 10492 - vite: 5.2.9(@types/node@20.12.7)(less@4.2.0) 10493 - vue: 3.4.23 10439 + vite: 5.2.10(@types/node@20.12.7) 10440 + vue: 3.4.23(typescript@5.4.5) 10494 10441 transitivePeerDependencies: 10495 10442 - '@algolia/client-search' 10496 10443 - '@types/node' ··· 10519 10466 - universal-cookie 10520 10467 dev: true 10521 10468 10522 - /vitest@1.5.0(@types/node@20.12.7)(less@4.2.0): 10469 + /vitest@1.5.0(@types/node@20.12.7): 10523 10470 resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} 10524 10471 engines: {node: ^18.0.0 || >=20.0.0} 10525 10472 hasBin: true ··· 10555 10502 debug: 4.3.4 10556 10503 execa: 8.0.1 10557 10504 local-pkg: 0.5.0 10558 - magic-string: 0.30.9 10505 + magic-string: 0.30.10 10559 10506 pathe: 1.1.2 10560 10507 picocolors: 1.0.0 10561 10508 std-env: 3.7.0 10562 10509 strip-literal: 2.1.0 10563 - tinybench: 2.6.0 10564 - tinypool: 0.8.3 10565 - vite: 5.2.8(@types/node@20.12.7)(less@4.2.0) 10566 - vite-node: 1.5.0(@types/node@20.12.7)(less@4.2.0) 10510 + tinybench: 2.8.0 10511 + tinypool: 0.8.4 10512 + vite: 5.2.10(@types/node@20.12.7) 10513 + vite-node: 1.5.0(@types/node@20.12.7) 10567 10514 why-is-node-running: 2.2.2 10568 10515 transitivePeerDependencies: 10569 10516 - less ··· 10587 10534 '@vue/composition-api': 10588 10535 optional: true 10589 10536 dependencies: 10590 - vue: 3.4.23 10537 + vue: 3.4.23(typescript@5.4.5) 10591 10538 dev: true 10592 10539 10593 - /vue@3.4.23: 10540 + /vue@3.4.23(typescript@5.4.5): 10594 10541 resolution: {integrity: sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==} 10595 10542 peerDependencies: 10596 10543 typescript: '*' ··· 10603 10550 '@vue/runtime-dom': 3.4.23 10604 10551 '@vue/server-renderer': 3.4.23(vue@3.4.23) 10605 10552 '@vue/shared': 3.4.23 10553 + typescript: 5.4.5 10606 10554 dev: true 10607 10555 10608 10556 /watchpack@2.4.0: ··· 10696 10644 graceful-fs: 4.2.11 10697 10645 html-entities: 2.5.2 10698 10646 http-proxy-middleware: 2.0.6(@types/express@4.17.21) 10699 - ipaddr.js: 2.1.0 10647 + ipaddr.js: 2.2.0 10700 10648 launch-editor: 2.6.1 10701 10649 open: 8.4.2 10702 10650 p-retry: 4.6.2