diff --git a/.changeset/fresh-icons-draw.md b/.changeset/fresh-icons-draw.md new file mode 100644 index 000000000..78fb7a344 --- /dev/null +++ b/.changeset/fresh-icons-draw.md @@ -0,0 +1,5 @@ +--- +"openapi-fetch": patch +--- + +Remove nanoid from dependencies diff --git a/.changeset/little-snails-shake.md b/.changeset/little-snails-shake.md new file mode 100644 index 000000000..9995fd41d --- /dev/null +++ b/.changeset/little-snails-shake.md @@ -0,0 +1,5 @@ +--- +"openapi-fetch": patch +--- + +Fix "failed to execute fetch on Window" error diff --git a/.changeset/twenty-nails-change.md b/.changeset/twenty-nails-change.md new file mode 100644 index 000000000..5937dddaa --- /dev/null +++ b/.changeset/twenty-nails-change.md @@ -0,0 +1,5 @@ +--- +"openapi-fetch": patch +--- + +Revert customFetch API back to `fetch(input: Request)` diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4694f7750..25b99169e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,19 @@ jobs: run_install: true - run: pnpm run build - run: pnpm test + test-e2e: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + - uses: pnpm/action-setup@v4 + with: + version: latest + run_install: true + - run: pnpm exec playwright install --with-deps + - run: pnpm run test-e2e test-macos: runs-on: macos-latest steps: diff --git a/package.json b/package.json index 544ffd746..0e72ca20c 100644 --- a/package.json +++ b/package.json @@ -12,14 +12,18 @@ "lint": "pnpm run -r --parallel --aggregate-output lint", "format": "pnpm run -r --parallel --aggregate-output format", "test": "pnpm run -r --parallel --aggregate-output test", + "test-e2e": "pnpm run -r --parallel --aggregate-output test-e2e", "version": "pnpm run build && changeset version && pnpm i" }, "devDependencies": { "@biomejs/biome": "^1.8.1", "@changesets/changelog-github": "^0.5.0", "@changesets/cli": "^2.27.5", + "@playwright/test": "^1.44.1", + "@types/node": "^20.14.7", "del-cli": "^5.1.0", "prettier": "^3.3.2", - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "vitest": "^1.6.0" } } diff --git a/packages/openapi-fetch/examples/nextjs/package.json b/packages/openapi-fetch/examples/nextjs/package.json index be34ccc5b..d7f84ee2e 100644 --- a/packages/openapi-fetch/examples/nextjs/package.json +++ b/packages/openapi-fetch/examples/nextjs/package.json @@ -12,7 +12,6 @@ "react-dom": "18.3.1" }, "devDependencies": { - "@types/node": "20.14.6", "@types/react": "18.3.1", "@types/react-dom": "18.3.0", "openapi-typescript": "workspace:^", diff --git a/packages/openapi-fetch/examples/vue-3/package.json b/packages/openapi-fetch/examples/vue-3/package.json index 044fb8cd5..041a807b3 100644 --- a/packages/openapi-fetch/examples/vue-3/package.json +++ b/packages/openapi-fetch/examples/vue-3/package.json @@ -16,7 +16,6 @@ }, "devDependencies": { "@tsconfig/node20": "^20.1.4", - "@types/node": "^20.14.6", "@vitejs/plugin-vue": "^5.0.5", "@vue/tsconfig": "^0.5.1", "openapi-typescript": "workspace:^", diff --git a/packages/openapi-fetch/package.json b/packages/openapi-fetch/package.json index 935d57c89..a38100e2b 100644 --- a/packages/openapi-fetch/package.json +++ b/packages/openapi-fetch/package.json @@ -54,15 +54,17 @@ "build:cjs": "esbuild --bundle src/index.js --format=cjs --outfile=dist/cjs/index.cjs && cp dist/index.d.ts dist/cjs/index.d.cts", "format": "biome format . --write", "lint": "biome check .", - "generate-types": "openapi-typescript test/fixtures/api.yaml -o test/fixtures/api.d.ts", + "generate-types": "openapi-typescript -c test/redocly.yaml", "pretest": "pnpm run generate-types", "test": "pnpm run \"/^test:/\"", "test:js": "vitest run", "test:ts": "tsc --noEmit", + "test-e2e": "playwright test", + "e2e-vite-build": "vite build test/fixtures/e2e", + "e2e-vite-start": "vite preview test/fixtures/e2e", "version": "pnpm run prepare && pnpm run build" }, "dependencies": { - "nanoid": "^5.0.7", "openapi-typescript-helpers": "workspace:^" }, "devDependencies": { @@ -76,6 +78,6 @@ "openapi-typescript-fetch": "^2.0.0", "superagent": "^9.0.2", "typescript": "^5.4.5", - "vitest": "^1.6.0" + "vite": "^5.3.1" } } diff --git a/packages/openapi-fetch/playwright.config.ts b/packages/openapi-fetch/playwright.config.ts new file mode 100644 index 000000000..a49933843 --- /dev/null +++ b/packages/openapi-fetch/playwright.config.ts @@ -0,0 +1,28 @@ +import { defineConfig, devices } from "@playwright/test"; + +const PORT = Number.parseInt(process.env.PORT || 4173 || "", 10); + +export default defineConfig({ + testMatch: "test/**/*.e2e.ts", + webServer: { + command: "pnpm run e2e-vite-build && pnpm run e2e-vite-start", + port: PORT, + }, + use: { + baseURL: `http://localhost:${PORT}`, + }, + projects: [ + { + name: "chrome", + use: { ...devices["Desktop Chrome"] }, + }, + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + }, + { + name: "webkit", + use: { ...devices["Desktop Safari"] }, + }, + ], +}); diff --git a/packages/openapi-fetch/src/index.d.ts b/packages/openapi-fetch/src/index.d.ts index fc0b03ae6..dd302d2aa 100644 --- a/packages/openapi-fetch/src/index.d.ts +++ b/packages/openapi-fetch/src/index.d.ts @@ -15,7 +15,7 @@ export interface ClientOptions extends Omit { /** set the common root URL for all API requests */ baseUrl?: string; /** custom fetch (defaults to globalThis.fetch) */ - fetch?: (input: string, init?: RequestInit) => Promise; + fetch?: (input: Request) => Promise; /** global querySerializer */ querySerializer?: QuerySerializer | QuerySerializerOptions; /** global bodySerializer */ diff --git a/packages/openapi-fetch/src/index.js b/packages/openapi-fetch/src/index.js index 20f316fdc..5ad584386 100644 --- a/packages/openapi-fetch/src/index.js +++ b/packages/openapi-fetch/src/index.js @@ -1,5 +1,3 @@ -import { nanoid } from "nanoid"; - // settings & const const DEFAULT_HEADERS = { "Content-Type": "application/json", @@ -21,6 +19,14 @@ class CustomRequest extends Request { } } +/** + * Returns a cheap, non-cryptographically-secure random ID + * Courtesy of @imranbarbhuiya (https://github.com/imranbarbhuiya) + */ +export function randomID() { + return Math.random().toString(36).slice(2, 11); +} + /** * Create an openapi-fetch client. * @type {import("./index.js").default} @@ -84,56 +90,63 @@ export default function createClient(clientOptions) { requestInit.headers.delete("Content-Type"); } - const id = nanoid(); + let id; + let options; let request = new CustomRequest(createFinalURL(schemaPath, { baseUrl, params, querySerializer }), requestInit); - // middleware (request) - const options = Object.freeze({ - baseUrl, - fetch, - parseAs, - querySerializer, - bodySerializer, - }); - for (const m of middlewares) { - if (m && typeof m === "object" && typeof m.onRequest === "function") { - const result = await m.onRequest({ - request, - schemaPath, - params, - options, - id, - }); - if (result) { - if (!(result instanceof Request)) { - throw new Error("onRequest: must return new Request() when modifying the request"); + if (middlewares.length) { + id = randomID(); + + // middleware (request) + options = Object.freeze({ + baseUrl, + fetch, + parseAs, + querySerializer, + bodySerializer, + }); + for (const m of middlewares) { + if (m && typeof m === "object" && typeof m.onRequest === "function") { + const result = await m.onRequest({ + request, + schemaPath, + params, + options, + id, + }); + if (result) { + if (!(result instanceof Request)) { + throw new Error("onRequest: must return new Request() when modifying the request"); + } + request = result; } - request = result; } } } // fetch! - let response = await fetch(request.url, request); + let response = await fetch(request); // middleware (response) // execute in reverse-array order (first priority gets last transform) - for (let i = middlewares.length - 1; i >= 0; i--) { - const m = middlewares[i]; - if (m && typeof m === "object" && typeof m.onResponse === "function") { - const result = await m.onResponse({ - request, - response, - schemaPath, - params, - options, - id, - }); - if (result) { - if (!(result instanceof Response)) { - throw new Error("onResponse: must return new Response() when modifying the response"); + if (middlewares.length) { + for (let i = middlewares.length - 1; i >= 0; i--) { + const m = middlewares[i]; + if (m && typeof m === "object" && typeof m.onResponse === "function") { + const result = await m.onResponse({ + request, + response, + schemaPath, + params, + options, + id, + }); + if (result) { + if (!(result instanceof Response)) { + throw new Error("onResponse: must return new Response() when modifying the response"); + } + response = result; } - response = result; } } } diff --git a/packages/openapi-fetch/test-results/.last-run.json b/packages/openapi-fetch/test-results/.last-run.json new file mode 100644 index 000000000..cbcc1fbac --- /dev/null +++ b/packages/openapi-fetch/test-results/.last-run.json @@ -0,0 +1,4 @@ +{ + "status": "passed", + "failedTests": [] +} \ No newline at end of file diff --git a/packages/openapi-fetch/test/fixtures/e2e/app.ts b/packages/openapi-fetch/test/fixtures/e2e/app.ts new file mode 100644 index 000000000..4460b28c5 --- /dev/null +++ b/packages/openapi-fetch/test/fixtures/e2e/app.ts @@ -0,0 +1,52 @@ +import createClient from "../../../src"; +import type { paths } from "./e2e.d.ts"; + +const client = createClient({ + baseUrl: "/api/v1", +}); + +/** + * Test 1: GET /api/v1/get + */ +async function testGet() { + const { data } = await client.GET("/get"); + if (!data) { + throw new Error("/get: No data"); + } +} + +/** + * Test 2: POST /api/v1/post + */ +async function testPost() { + const { data } = await client.POST("/post", { body: { message: "POST" } }); + if (!data) { + throw new Error("/post: No data"); + } +} + +/** + * Test 3: PUT /api/v1/multi-form + */ +async function testMultiForm() { + const { data } = await client.POST("/multi-form", { + body: { + message: "Form", + file: new File(["Hello, World!"], "hello.txt") as unknown as string, + }, + }); + if (!data) { + throw new Error("/multi-form: No data"); + } +} + +// run all tests immediately on load +(async () => { + await Promise.all([testGet(), testPost(), testMultiForm()]); + + // add element Playwright is waiting for + const div = document.createElement("div"); + div.setAttribute("data-status", "success"); + div.innerHTML = "Success"; + document.body.appendChild(div); +})(); diff --git a/packages/openapi-fetch/test/fixtures/e2e/e2e.d.ts b/packages/openapi-fetch/test/fixtures/e2e/e2e.d.ts new file mode 100644 index 000000000..e732bbe34 --- /dev/null +++ b/packages/openapi-fetch/test/fixtures/e2e/e2e.d.ts @@ -0,0 +1,176 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/get": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/post": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + message: string; + }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/multi-form": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "multipart/form-data": { + message?: string; + /** Format: binary */ + file?: string; + }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export type operations = Record; diff --git a/packages/openapi-fetch/test/fixtures/e2e/e2e.yaml b/packages/openapi-fetch/test/fixtures/e2e/e2e.yaml new file mode 100644 index 000000000..44b97faa4 --- /dev/null +++ b/packages/openapi-fetch/test/fixtures/e2e/e2e.yaml @@ -0,0 +1,94 @@ +openapi: 3.1.0 +servers: + - url: /api/v1 +paths: + /get: + get: + responses: + 200: + description: OK + content: + application/json: + schema: + type: object + required: [message] + properties: + message: + type: string + 500: + description: Internal Server Error + content: + application/json: + schema: + type: object + required: [message] + properties: + message: + type: string + /post: + post: + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [message] + properties: + message: + type: string + responses: + 200: + description: OK + content: + application/json: + schema: + type: object + required: [message] + properties: + message: + type: string + 500: + description: Internal Server Error + content: + application/json: + schema: + type: object + required: [message] + properties: + message: + type: string + /multi-form: + post: + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + message: + type: string + file: + type: string + format: binary + responses: + 200: + description: OK + content: + application/json: + schema: + type: object + required: [message] + properties: + message: + type: string + 500: + description: Internal Server Error + content: + application/json: + schema: + type: object + required: [message] + properties: + message: + type: string diff --git a/packages/openapi-fetch/test/fixtures/e2e/index.html b/packages/openapi-fetch/test/fixtures/e2e/index.html new file mode 100644 index 000000000..aec993998 --- /dev/null +++ b/packages/openapi-fetch/test/fixtures/e2e/index.html @@ -0,0 +1,10 @@ + + + + + OpenAPI Fetch E2E Tests + + + + + diff --git a/packages/openapi-fetch/test/fixtures/e2e/vite.config.ts b/packages/openapi-fetch/test/fixtures/e2e/vite.config.ts new file mode 100644 index 000000000..b4109e498 --- /dev/null +++ b/packages/openapi-fetch/test/fixtures/e2e/vite.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + build: { + outDir: "./dist/", + }, + preview: { + port: Number.parseInt(process.env.PORT || "4173", 10), + }, +}); diff --git a/packages/openapi-fetch/test/index.bench.js b/packages/openapi-fetch/test/index.bench.js index cd1b59e9b..99463b3ba 100644 --- a/packages/openapi-fetch/test/index.bench.js +++ b/packages/openapi-fetch/test/index.bench.js @@ -2,6 +2,7 @@ import axios from "axios"; import { http, HttpResponse } from "msw"; import { setupServer } from "msw/node"; import { Fetcher } from "openapi-typescript-fetch"; +import { nanoid } from "nanoid"; import superagent from "superagent"; import { afterAll, bench, describe } from "vitest"; import createClient from "../dist/index.js"; diff --git a/packages/openapi-fetch/test/index.e2e.ts b/packages/openapi-fetch/test/index.e2e.ts new file mode 100644 index 000000000..ecd6cfaa5 --- /dev/null +++ b/packages/openapi-fetch/test/index.e2e.ts @@ -0,0 +1,35 @@ +import { expect, type Page, test } from "@playwright/test"; + +// note: these tests load Chrome, Firefox, and Safari in Playwright to test a browser-realistic runtime. +// the frontend is prepared via Vite to create a production-accurate app (and throw add’l type errors) +// the backend is mocked here, in Playwright + +test("basic", async ({ page }) => { + // mock API + await mockAPI(page); + + // throw on any error + page.on("pageerror", (error) => { + throw error; + }); + + // load page + await page.goto("/"); + + // wait for element + await page.waitForSelector('[data-status="success"]'); +}); + +/** Mock API */ +async function mockAPI(page: Page) { + await Promise.all([ + // GET /api/v1/get + page.route("/api/v1/get", (route) => route.fulfill({ status: 200, body: JSON.stringify({ message: "success" }) })), + // POST /api/v1/post + page.route("/api/v1/post", (route) => route.fulfill({ status: 200, body: JSON.stringify({ message: "success" }) })), + // POST /api/v1/multi-form + page.route("/api/v1/multi-form", (route) => + route.fulfill({ status: 200, body: JSON.stringify({ message: "success" }) }), + ), + ]); +} diff --git a/packages/openapi-fetch/test/index.test.ts b/packages/openapi-fetch/test/index.test.ts index ce540367b..737e50349 100644 --- a/packages/openapi-fetch/test/index.test.ts +++ b/packages/openapi-fetch/test/index.test.ts @@ -1304,8 +1304,8 @@ describe("client", () => { status: 200, ok: true, } as Response; - return async (input: string, requestInit?: RequestInit) => { - expect(requestInit).toHaveProperty("customProperty", "value"); + return async (input: Request) => { + expect(input).toHaveProperty("customProperty", "value"); return Promise.resolve(response); }; } diff --git a/packages/openapi-fetch/test/redocly.yaml b/packages/openapi-fetch/test/redocly.yaml new file mode 100644 index 000000000..f181f9992 --- /dev/null +++ b/packages/openapi-fetch/test/redocly.yaml @@ -0,0 +1,9 @@ +apis: + unit: + root: ./fixtures/api.yaml + x-openapi-ts: + output: ./fixtures/api.d.ts + e2e: + root: ./fixtures/e2e/e2e.yaml + x-openapi-ts: + output: ./fixtures/e2e/e2e.d.ts diff --git a/packages/openapi-typescript/package.json b/packages/openapi-typescript/package.json index e984bcd9d..e635970d5 100644 --- a/packages/openapi-typescript/package.json +++ b/packages/openapi-typescript/package.json @@ -69,14 +69,12 @@ "devDependencies": { "@types/degit": "^2.8.6", "@types/js-yaml": "^4.0.9", - "@types/node": "^20.14.6", "degit": "^2.8.4", "del-cli": "^5.1.0", "esbuild": "^0.20.2", "execa": "^8.0.1", "strip-ansi": "^7.1.0", "typescript": "^5.4.5", - "vite-node": "^1.6.0", - "vitest": "^1.6.0" + "vite-node": "^1.6.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dbc9a9cb9..f45e5ca83 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,12 @@ importers: '@changesets/cli': specifier: ^2.27.5 version: 2.27.5 + '@playwright/test': + specifier: ^1.44.1 + version: 1.44.1 + '@types/node': + specifier: ^20.14.7 + version: 20.14.7 del-cli: specifier: ^5.1.0 version: 5.1.0 @@ -26,18 +32,18 @@ importers: typescript: specifier: ^5.4.5 version: 5.4.5 + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.14.7)(jsdom@20.0.3) docs: devDependencies: vitepress: specifier: 1.1.4 - version: 1.1.4(@algolia/client-search@4.23.3)(@types/node@20.14.6)(@types/react@18.3.1)(axios@1.7.2)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.4.5) + version: 1.1.4(@algolia/client-search@4.23.3)(@types/node@20.14.7)(@types/react@18.3.1)(axios@1.7.2)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.4.5) packages/openapi-fetch: dependencies: - nanoid: - specifier: ^5.0.7 - version: 5.0.7 openapi-typescript-helpers: specifier: workspace:^ version: link:../openapi-typescript-helpers @@ -72,15 +78,15 @@ importers: typescript: specifier: ^5.4.5 version: 5.4.5 - vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.6)(jsdom@20.0.3(supports-color@9.4.0))(supports-color@9.4.0) + vite: + specifier: ^5.3.1 + version: 5.3.1(@types/node@20.14.7) packages/openapi-fetch/examples/nextjs: dependencies: next: specifier: 14.2.3 - version: 14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.3(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) openapi-fetch: specifier: workspace:^ version: link:../.. @@ -91,9 +97,6 @@ importers: specifier: 18.3.1 version: 18.3.1(react@18.3.1) devDependencies: - '@types/node': - specifier: 20.14.6 - version: 20.14.6 '@types/react': specifier: 18.3.1 version: 18.3.1 @@ -133,13 +136,13 @@ importers: version: 18.3.0 '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.0(@swc/helpers@0.5.5)(vite@5.3.1(@types/node@20.14.6)) + version: 3.7.0(@swc/helpers@0.5.5)(vite@5.3.1(@types/node@20.14.7)) typescript: specifier: ^5.4.5 version: 5.4.5 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.6) + version: 5.3.1(@types/node@20.14.7) packages/openapi-fetch/examples/sveltekit: dependencies: @@ -149,13 +152,13 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^3.2.0 - version: 3.2.0(@sveltejs/kit@2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6))) + version: 3.2.0(@sveltejs/kit@2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7))) '@sveltejs/kit': specifier: ^2.5.8 - version: 2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)) + version: 2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)) + version: 3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)) openapi-typescript: specifier: workspace:^ version: link:../../../openapi-typescript @@ -173,7 +176,7 @@ importers: version: 5.4.5 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.6) + version: 5.3.1(@types/node@20.14.7) packages/openapi-fetch/examples/vue-3: dependencies: @@ -187,12 +190,9 @@ importers: '@tsconfig/node20': specifier: ^20.1.4 version: 20.1.4 - '@types/node': - specifier: ^20.14.6 - version: 20.14.6 '@vitejs/plugin-vue': specifier: ^5.0.5 - version: 5.0.5(vite@5.3.1(@types/node@20.14.6))(vue@3.4.29(typescript@5.4.5)) + version: 5.0.5(vite@5.3.1(@types/node@20.14.7))(vue@3.4.29(typescript@5.4.5)) '@vue/tsconfig': specifier: ^0.5.1 version: 0.5.1 @@ -204,7 +204,7 @@ importers: version: 5.4.5 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.14.6) + version: 5.3.1(@types/node@20.14.7) vue-tsc: specifier: ^2.0.21 version: 2.0.21(typescript@5.4.5) @@ -233,9 +233,6 @@ importers: '@types/js-yaml': specifier: ^4.0.9 version: 4.0.9 - '@types/node': - specifier: ^20.14.6 - version: 20.14.6 degit: specifier: ^2.8.4 version: 2.8.4 @@ -256,10 +253,7 @@ importers: version: 5.4.5 vite-node: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.6)(supports-color@9.4.0) - vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.6)(jsdom@20.0.3(supports-color@9.4.0))(supports-color@9.4.0) + version: 1.6.0(@types/node@20.14.7)(supports-color@9.4.0) packages/openapi-typescript-helpers: devDependencies: @@ -934,6 +928,11 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@playwright/test@1.44.1': + resolution: {integrity: sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==} + engines: {node: '>=16'} + hasBin: true + '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} @@ -1191,8 +1190,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.14.6': - resolution: {integrity: sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==} + '@types/node@20.14.7': + resolution: {integrity: sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1365,10 +1364,6 @@ packages: acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} @@ -1982,6 +1977,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2524,11 +2524,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.0.7: - resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} - engines: {node: ^18 || >=20} - hasBin: true - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -2726,6 +2721,16 @@ packages: pkg-types@1.1.1: resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + playwright-core@1.44.1: + resolution: {integrity: sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.44.1: + resolution: {integrity: sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==} + engines: {node: '>=16'} + hasBin: true + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -3718,7 +3723,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.5 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 '@babel/highlight@7.24.7': dependencies: @@ -4131,7 +4136,7 @@ snapshots: '@inquirer/figures': 1.0.3 '@inquirer/type': 1.3.3 '@types/mute-stream': 0.0.4 - '@types/node': 20.14.6 + '@types/node': 20.14.7 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -4246,6 +4251,10 @@ snapshots: '@open-draft/until@2.1.0': {} + '@playwright/test@1.44.1': + dependencies: + playwright: 1.44.1 + '@polka/url@1.0.0-next.25': {} '@redocly/ajv@8.11.0': @@ -4330,14 +4339,14 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)))': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)))': dependencies: - '@sveltejs/kit': 2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)) + '@sveltejs/kit': 2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)) import-meta-resolve: 4.1.0 - '@sveltejs/kit@2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6))': + '@sveltejs/kit@2.5.8(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -4351,28 +4360,28 @@ snapshots: sirv: 2.0.4 svelte: 4.2.17 tiny-glob: 0.2.9 - vite: 5.3.1(@types/node@20.14.6) + vite: 5.3.1(@types/node@20.14.7) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)) - debug: 4.3.4(supports-color@9.4.0) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)) + debug: 4.3.4 svelte: 4.2.17 - vite: 5.3.1(@types/node@20.14.6) + vite: 5.3.1(@types/node@20.14.7) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6))': + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.6)) - debug: 4.3.4(supports-color@9.4.0) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)))(svelte@4.2.17)(vite@5.3.1(@types/node@20.14.7)) + debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 svelte: 4.2.17 svelte-hmr: 0.16.0(svelte@4.2.17) - vite: 5.3.1(@types/node@20.14.6) - vitefu: 0.2.5(vite@5.3.1(@types/node@20.14.6)) + vite: 5.3.1(@types/node@20.14.7) + vitefu: 0.2.5(vite@5.3.1(@types/node@20.14.7)) transitivePeerDependencies: - supports-color @@ -4469,11 +4478,11 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.14.6 + '@types/node': 20.14.7 '@types/node@12.20.55': {} - '@types/node@20.14.6': + '@types/node@20.14.7': dependencies: undici-types: 5.26.5 @@ -4500,16 +4509,16 @@ snapshots: '@types/wrap-ansi@3.0.0': {} - '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.5)(vite@5.3.1(@types/node@20.14.6))': + '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.5)(vite@5.3.1(@types/node@20.14.7))': dependencies: '@swc/core': 1.6.3(@swc/helpers@0.5.5) - vite: 5.3.1(@types/node@20.14.6) + vite: 5.3.1(@types/node@20.14.7) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-vue@5.0.5(vite@5.3.1(@types/node@20.14.6))(vue@3.4.29(typescript@5.4.5))': + '@vitejs/plugin-vue@5.0.5(vite@5.3.1(@types/node@20.14.7))(vue@3.4.29(typescript@5.4.5))': dependencies: - vite: 5.3.1(@types/node@20.14.6) + vite: 5.3.1(@types/node@20.14.7) vue: 3.4.29(typescript@5.4.5) '@vitest/expect@1.6.0': @@ -4682,19 +4691,15 @@ snapshots: acorn-walk: 8.3.3 optional: true - acorn-walk@8.3.2: {} - acorn-walk@8.3.3: dependencies: acorn: 8.12.0 - optional: true acorn@8.11.3: {} - acorn@8.12.0: - optional: true + acorn@8.12.0: {} - agent-base@6.0.2(supports-color@9.4.0): + agent-base@6.0.2: dependencies: debug: 4.3.5(supports-color@9.4.0) transitivePeerDependencies: @@ -5061,11 +5066,9 @@ snapshots: de-indent@1.0.2: {} - debug@4.3.4(supports-color@9.4.0): + debug@4.3.4: dependencies: ms: 2.1.2 - optionalDependencies: - supports-color: 9.4.0 debug@4.3.5(supports-color@9.4.0): dependencies: @@ -5425,6 +5428,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -5560,18 +5566,18 @@ snapshots: whatwg-encoding: 2.0.0 optional: true - http-proxy-agent@5.0.0(supports-color@9.4.0): + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 - agent-base: 6.0.2(supports-color@9.4.0) + agent-base: 6.0.2 debug: 4.3.5(supports-color@9.4.0) transitivePeerDependencies: - supports-color optional: true - https-proxy-agent@5.0.1(supports-color@9.4.0): + https-proxy-agent@5.0.1: dependencies: - agent-base: 6.0.2(supports-color@9.4.0) + agent-base: 6.0.2 debug: 4.3.5(supports-color@9.4.0) transitivePeerDependencies: - supports-color @@ -5742,7 +5748,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@20.0.3(supports-color@9.4.0): + jsdom@20.0.3: dependencies: abab: 2.0.6 acorn: 8.12.0 @@ -5755,8 +5761,8 @@ snapshots: escodegen: 2.1.0 form-data: 4.0.0 html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0(supports-color@9.4.0) - https-proxy-agent: 5.0.1(supports-color@9.4.0) + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.10 parse5: 7.1.2 @@ -5944,7 +5950,7 @@ snapshots: mlly@1.7.0: dependencies: - acorn: 8.11.3 + acorn: 8.12.0 pathe: 1.1.2 pkg-types: 1.1.1 ufo: 1.5.3 @@ -5983,11 +5989,9 @@ snapshots: nanoid@3.3.7: {} - nanoid@5.0.7: {} - neo-async@2.6.2: {} - next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.3(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.3 '@swc/helpers': 0.5.5 @@ -6008,6 +6012,7 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.3 '@next/swc-win32-ia32-msvc': 14.2.3 '@next/swc-win32-x64-msvc': 14.2.3 + '@playwright/test': 1.44.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -6174,6 +6179,14 @@ snapshots: mlly: 1.7.0 pathe: 1.1.2 + playwright-core@1.44.1: {} + + playwright@1.44.1: + dependencies: + playwright-core: 1.44.1 + optionalDependencies: + fsevents: 2.3.2 + pluralize@8.0.0: {} possible-typed-array-names@1.0.0: {} @@ -6799,13 +6812,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@1.6.0(@types/node@20.14.6)(supports-color@9.4.0): + vite-node@1.6.0(@types/node@20.14.7)(supports-color@9.4.0): dependencies: cac: 6.7.14 debug: 4.3.5(supports-color@9.4.0) pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.1(@types/node@20.14.6) + vite: 5.3.1(@types/node@20.14.7) transitivePeerDependencies: - '@types/node' - less @@ -6816,27 +6829,27 @@ snapshots: - supports-color - terser - vite@5.3.1(@types/node@20.14.6): + vite@5.3.1(@types/node@20.14.7): dependencies: esbuild: 0.21.5 postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: - '@types/node': 20.14.6 + '@types/node': 20.14.7 fsevents: 2.3.3 - vitefu@0.2.5(vite@5.3.1(@types/node@20.14.6)): + vitefu@0.2.5(vite@5.3.1(@types/node@20.14.7)): optionalDependencies: - vite: 5.3.1(@types/node@20.14.6) + vite: 5.3.1(@types/node@20.14.7) - vitepress@1.1.4(@algolia/client-search@4.23.3)(@types/node@20.14.6)(@types/react@18.3.1)(axios@1.7.2)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.4.5): + vitepress@1.1.4(@algolia/client-search@4.23.3)(@types/node@20.14.7)(@types/react@18.3.1)(axios@1.7.2)(postcss@8.4.38)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.4.5): dependencies: '@docsearch/css': 3.6.0 '@docsearch/js': 3.6.0(@algolia/client-search@4.23.3)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0) '@shikijs/core': 1.6.4 '@shikijs/transformers': 1.6.4 '@types/markdown-it': 14.1.1 - '@vitejs/plugin-vue': 5.0.5(vite@5.3.1(@types/node@20.14.6))(vue@3.4.29(typescript@5.4.5)) + '@vitejs/plugin-vue': 5.0.5(vite@5.3.1(@types/node@20.14.7))(vue@3.4.29(typescript@5.4.5)) '@vue/devtools-api': 7.2.1(vue@3.4.29(typescript@5.4.5)) '@vueuse/core': 10.11.0(vue@3.4.29(typescript@5.4.5)) '@vueuse/integrations': 10.11.0(axios@1.7.2)(focus-trap@7.5.4)(vue@3.4.29(typescript@5.4.5)) @@ -6844,7 +6857,7 @@ snapshots: mark.js: 8.11.1 minisearch: 6.3.0 shiki: 1.6.4 - vite: 5.3.1(@types/node@20.14.6) + vite: 5.3.1(@types/node@20.14.7) vue: 3.4.29(typescript@5.4.5) optionalDependencies: postcss: 8.4.38 @@ -6875,16 +6888,16 @@ snapshots: - typescript - universal-cookie - vitest@1.6.0(@types/node@20.14.6)(jsdom@20.0.3(supports-color@9.4.0))(supports-color@9.4.0): + vitest@1.6.0(@types/node@20.14.7)(jsdom@20.0.3): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 '@vitest/snapshot': 1.6.0 '@vitest/spy': 1.6.0 '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 + acorn-walk: 8.3.3 chai: 4.4.1 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.5(supports-color@9.4.0) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -6894,12 +6907,12 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.3.1(@types/node@20.14.6) - vite-node: 1.6.0(@types/node@20.14.6)(supports-color@9.4.0) + vite: 5.3.1(@types/node@20.14.7) + vite-node: 1.6.0(@types/node@20.14.7)(supports-color@9.4.0) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.14.6 - jsdom: 20.0.3(supports-color@9.4.0) + '@types/node': 20.14.7 + jsdom: 20.0.3 transitivePeerDependencies: - less - lightningcss