diff --git a/docs/src/content/docs/openapi-fetch/examples.md b/docs/src/content/docs/openapi-fetch/examples.md index 8ced98832..7908eb939 100644 --- a/docs/src/content/docs/openapi-fetch/examples.md +++ b/docs/src/content/docs/openapi-fetch/examples.md @@ -78,9 +78,11 @@ openapi-fetch is simple vanilla JS that can be used in any project. But sometime [View a code example in GitHub](https://github.com/drwpow/openapi-typescript/tree/main/packages/openapi-fetch/examples/react-query) -### React + SWR +### Next.js -TODO +Next.js is the most popular SSR framework for React. While [React Query](#react--react-query) is recommended for clientside fetching, this example shows how to take advantage of server-side fetching. + +[View a code example in GitHub](https://github.com/drwpow/openapi-typescript/tree/main/packages/openapi-fetch/examples/nextjs) ### Svelte / SvelteKit diff --git a/packages/openapi-fetch/examples/nextjs/.gitignore b/packages/openapi-fetch/examples/nextjs/.gitignore new file mode 100644 index 000000000..8f322f0d8 --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/packages/openapi-fetch/examples/nextjs/README.md b/packages/openapi-fetch/examples/nextjs/README.md new file mode 100644 index 000000000..4c9bed7ba --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/README.md @@ -0,0 +1,14 @@ +# openapi-fetch + Next.js + +Example of using openapi-fetch in [Next.js](https://nextjs.org) using server-rendered data. + +For an example of fetching clientside, see the [React Query example](../react-query) which also works in Next.js (React Query is recommended over SWR because of type inference). + +## Setup + +```sh +pnpm i +pnpm run dev +``` + +You’ll see the server running at `localhost:3000` diff --git a/packages/openapi-fetch/examples/nextjs/app/favicon.ico b/packages/openapi-fetch/examples/nextjs/app/favicon.ico new file mode 100644 index 000000000..718d6fea4 Binary files /dev/null and b/packages/openapi-fetch/examples/nextjs/app/favicon.ico differ diff --git a/packages/openapi-fetch/examples/nextjs/app/layout.tsx b/packages/openapi-fetch/examples/nextjs/app/layout.tsx new file mode 100644 index 000000000..33d46c728 --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/app/layout.tsx @@ -0,0 +1,13 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "openapi-fetch + Next.js", +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/packages/openapi-fetch/examples/nextjs/app/page.tsx b/packages/openapi-fetch/examples/nextjs/app/page.tsx new file mode 100644 index 000000000..5afc1b31b --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/app/page.tsx @@ -0,0 +1,25 @@ +import client from "../lib/api"; + +async function getFact() { + return await client.GET("/fact", { + params: { + query: { max_length: 500 }, + }, + }); +} + +export default async function Home() { + const fact = await getFact(); + + return ( +
+ {fact.error ? ( +
There was an error: {fact.error.message}
+ ) : ( +
+          {JSON.stringify(fact.data, undefined, 2)}
+        
+ )} +
+ ); +} diff --git a/packages/openapi-fetch/examples/nextjs/lib/api/index.ts b/packages/openapi-fetch/examples/nextjs/lib/api/index.ts new file mode 100644 index 000000000..bdbdcbd21 --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/lib/api/index.ts @@ -0,0 +1,5 @@ +import createClient from "openapi-fetch"; +import type { paths } from "./v1"; + +const client = createClient({ baseUrl: "https://catfact.ninja/" }); +export default client; diff --git a/packages/openapi-fetch/examples/nextjs/lib/api/v1.d.ts b/packages/openapi-fetch/examples/nextjs/lib/api/v1.d.ts new file mode 100644 index 000000000..fad1c0cc0 --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/lib/api/v1.d.ts @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + + +export interface paths { + "/breeds": { + /** + * Get a list of breeds + * @description Returns a a list of breeds + */ + get: operations["getBreeds"]; + }; + "/fact": { + /** + * Get Random Fact + * @description Returns a random fact + */ + get: operations["getRandomFact"]; + }; + "/facts": { + /** + * Get a list of facts + * @description Returns a a list of facts + */ + get: operations["getFacts"]; + }; +} + +export type webhooks = Record; + +export interface components { + schemas: { + /** + * Breed model + * @description Breed + */ + Breed: { + /** + * Breed + * Format: string + * @description Breed + */ + breed?: string; + /** + * Country + * Format: string + * @description Country + */ + country?: string; + /** + * Origin + * Format: string + * @description Origin + */ + origin?: string; + /** + * Coat + * Format: string + * @description Coat + */ + coat?: string; + /** + * Pattern + * Format: string + * @description Pattern + */ + pattern?: string; + }; + /** + * CatFact model + * @description CatFact + */ + CatFact: { + /** + * Fact + * Format: string + * @description Fact + */ + fact?: string; + /** + * Length + * Format: int32 + * @description Length + */ + length?: number; + }; + Error: { + code: number; + message: string; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} + +export type external = Record; + +export interface operations { + + /** + * Get a list of breeds + * @description Returns a a list of breeds + */ + getBreeds: { + parameters: { + query?: { + /** @description limit the amount of results returned */ + limit?: number; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": components["schemas"]["Breed"][]; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + }; + }; + /** + * Get Random Fact + * @description Returns a random fact + */ + getRandomFact: { + parameters: { + query?: { + /** @description maximum length of returned fact */ + max_length?: number; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": components["schemas"]["CatFact"]; + }; + }; + /** @description not found */ + 404: { + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + }; + }; + /** + * Get a list of facts + * @description Returns a a list of facts + */ + getFacts: { + parameters: { + query?: { + /** @description maximum length of returned fact */ + max_length?: number; + /** @description limit the amount of results returned */ + limit?: number; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": components["schemas"]["CatFact"][]; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + }; + }; +} diff --git a/packages/openapi-fetch/examples/nextjs/lib/api/v1.json b/packages/openapi-fetch/examples/nextjs/lib/api/v1.json new file mode 100644 index 000000000..baf0c069e --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/lib/api/v1.json @@ -0,0 +1,229 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Cat Facts API", + "version": "1.0" + }, + "paths": { + "/breeds": { + "get": { + "tags": ["Breeds"], + "summary": "Get a list of breeds", + "description": "Returns a a list of breeds", + "operationId": "getBreeds", + "parameters": [ + { + "name": "limit", + "in": "query", + "description": "limit the amount of results returned", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Breed" + } + } + } + } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/fact": { + "get": { + "tags": ["Facts"], + "summary": "Get Random Fact", + "description": "Returns a random fact", + "operationId": "getRandomFact", + "parameters": [ + { + "name": "max_length", + "in": "query", + "description": "maximum length of returned fact", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CatFact" + } + } + } + }, + "404": { + "description": "not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/facts": { + "get": { + "tags": ["Facts"], + "summary": "Get a list of facts", + "description": "Returns a a list of facts", + "operationId": "getFacts", + "parameters": [ + { + "name": "max_length", + "in": "query", + "description": "maximum length of returned fact", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "limit", + "in": "query", + "description": "limit the amount of results returned", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CatFact" + } + } + } + } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Breed": { + "title": "Breed model", + "description": "Breed", + "properties": { + "breed": { + "title": "Breed", + "description": "Breed", + "type": "string", + "format": "string" + }, + "country": { + "title": "Country", + "description": "Country", + "type": "string", + "format": "string" + }, + "origin": { + "title": "Origin", + "description": "Origin", + "type": "string", + "format": "string" + }, + "coat": { + "title": "Coat", + "description": "Coat", + "type": "string", + "format": "string" + }, + "pattern": { + "title": "Pattern", + "description": "Pattern", + "type": "string", + "format": "string" + } + }, + "type": "object" + }, + "CatFact": { + "title": "CatFact model", + "description": "CatFact", + "properties": { + "fact": { + "title": "Fact", + "description": "Fact", + "type": "string", + "format": "string" + }, + "length": { + "title": "Length", + "description": "Length", + "type": "integer", + "format": "int32" + } + }, + "type": "object" + }, + "Error": { + "type": "object", + "required": ["code", "message"], + "properties": { + "code": { "type": "number" }, + "message": { "type": "string" } + } + } + } + } +} diff --git a/packages/openapi-fetch/examples/nextjs/next.config.js b/packages/openapi-fetch/examples/nextjs/next.config.js new file mode 100644 index 000000000..c4a407b7c --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/next.config.js @@ -0,0 +1,2 @@ +/** @type {import('next').NextConfig} */ +export default {}; diff --git a/packages/openapi-fetch/examples/nextjs/package.json b/packages/openapi-fetch/examples/nextjs/package.json new file mode 100644 index 000000000..f92efb4b5 --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/package.json @@ -0,0 +1,22 @@ +{ + "name": "@example/openapi-fetch-nextjs", + "private": true, + "type": "module", + "scripts": { + "dev": "next dev", + "prepare": "openapi-typescript lib/api/v1.json -o lib/api/v1.d.ts" + }, + "dependencies": { + "next": "13.4.19", + "openapi-fetch": "file:../..", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@types/node": "20.5.1", + "@types/react": "18.2.20", + "@types/react-dom": "18.2.7", + "openapi-typescript": "workspace:^", + "typescript": "5.1.6" + } +} diff --git a/packages/openapi-fetch/examples/nextjs/public/next.svg b/packages/openapi-fetch/examples/nextjs/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/openapi-fetch/examples/nextjs/public/vercel.svg b/packages/openapi-fetch/examples/nextjs/public/vercel.svg new file mode 100644 index 000000000..d2f842227 --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/openapi-fetch/examples/nextjs/tsconfig.json b/packages/openapi-fetch/examples/nextjs/tsconfig.json new file mode 100644 index 000000000..c459a618f --- /dev/null +++ b/packages/openapi-fetch/examples/nextjs/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "allowJs": true, + "esModuleInterop": true, + "incremental": true, + "isolatedModules": true, + "jsx": "preserve", + "lib": ["dom", "dom.iterable", "esnext"], + "module": "esnext", + "moduleResolution": "bundler", + "noEmit": true, + "paths": { + "@/*": ["./*"] + }, + "plugins": [{ "name": "next" }], + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/openapi-fetch/examples/react-query/package.json b/packages/openapi-fetch/examples/react-query/package.json index 85dcd85b9..d2a400b72 100644 --- a/packages/openapi-fetch/examples/react-query/package.json +++ b/packages/openapi-fetch/examples/react-query/package.json @@ -1,6 +1,7 @@ { "name": "@example/openapi-fetch-react-query", "private": true, + "type": "module", "scripts": { "dev": "vite dev", "prepare": "openapi-typescript src/lib/api/v1.json -o src/lib/api/v1.d.ts" diff --git a/packages/openapi-fetch/examples/react-query/src/index.tsx b/packages/openapi-fetch/examples/react-query/src/index.tsx index ecf35ea4e..d10ae09e9 100644 --- a/packages/openapi-fetch/examples/react-query/src/index.tsx +++ b/packages/openapi-fetch/examples/react-query/src/index.tsx @@ -13,8 +13,9 @@ function Fact() { return (
{fact.isLoading &&
Loading...
} - {!!fact.error &&
There was an error: {String(fact.error)}
} - {!!fact.data && ( + {fact.error ? ( +
There was an error: {fact.error}
+ ) : (
           {JSON.stringify(fact.data, undefined, 2)}
         
diff --git a/packages/openapi-fetch/examples/react-query/src/lib/api/v1.d.ts b/packages/openapi-fetch/examples/react-query/src/lib/api/v1.d.ts index 335091dfa..fad1c0cc0 100644 --- a/packages/openapi-fetch/examples/react-query/src/lib/api/v1.d.ts +++ b/packages/openapi-fetch/examples/react-query/src/lib/api/v1.d.ts @@ -86,6 +86,10 @@ export interface components { */ length?: number; }; + Error: { + code: number; + message: string; + }; }; responses: never; parameters: never; @@ -116,6 +120,12 @@ export interface operations { "application/json": components["schemas"]["Breed"][]; }; }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; + }; }; }; /** @@ -136,9 +146,17 @@ export interface operations { "application/json": components["schemas"]["CatFact"]; }; }; - /** @description Fact not found */ + /** @description not found */ 404: { - content: never; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; }; }; }; @@ -162,6 +180,12 @@ export interface operations { "application/json": components["schemas"]["CatFact"][]; }; }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; + }; }; }; } diff --git a/packages/openapi-fetch/examples/react-query/src/lib/api/v1.json b/packages/openapi-fetch/examples/react-query/src/lib/api/v1.json index 198b17f79..baf0c069e 100644 --- a/packages/openapi-fetch/examples/react-query/src/lib/api/v1.json +++ b/packages/openapi-fetch/examples/react-query/src/lib/api/v1.json @@ -36,6 +36,16 @@ } } } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } } } @@ -70,7 +80,24 @@ } }, "404": { - "description": "Fact not found" + "description": "not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } } } @@ -116,6 +143,16 @@ } } } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } } } @@ -178,6 +215,14 @@ } }, "type": "object" + }, + "Error": { + "type": "object", + "required": ["code", "message"], + "properties": { + "code": { "type": "number" }, + "message": { "type": "string" } + } } } } diff --git a/packages/openapi-fetch/examples/sveltekit/package.json b/packages/openapi-fetch/examples/sveltekit/package.json index db5df1404..e7a0415e6 100644 --- a/packages/openapi-fetch/examples/sveltekit/package.json +++ b/packages/openapi-fetch/examples/sveltekit/package.json @@ -1,7 +1,7 @@ { - "name": "sveltekit", - "version": "0.0.1", + "name": "@example/openapi-fetch-sveltekit", "private": true, + "type": "module", "scripts": { "dev": "vite dev", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", @@ -20,6 +20,5 @@ "tslib": "^2.6.2", "typescript": "^5.1.6", "vite": "^4.4.9" - }, - "type": "module" + } } diff --git a/packages/openapi-fetch/examples/sveltekit/src/lib/api/v1.d.ts b/packages/openapi-fetch/examples/sveltekit/src/lib/api/v1.d.ts index 335091dfa..fad1c0cc0 100644 --- a/packages/openapi-fetch/examples/sveltekit/src/lib/api/v1.d.ts +++ b/packages/openapi-fetch/examples/sveltekit/src/lib/api/v1.d.ts @@ -86,6 +86,10 @@ export interface components { */ length?: number; }; + Error: { + code: number; + message: string; + }; }; responses: never; parameters: never; @@ -116,6 +120,12 @@ export interface operations { "application/json": components["schemas"]["Breed"][]; }; }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; + }; }; }; /** @@ -136,9 +146,17 @@ export interface operations { "application/json": components["schemas"]["CatFact"]; }; }; - /** @description Fact not found */ + /** @description not found */ 404: { - content: never; + content: { + "application/json": components["schemas"]["Error"]; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; }; }; }; @@ -162,6 +180,12 @@ export interface operations { "application/json": components["schemas"]["CatFact"][]; }; }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["Error"]; + }; + }; }; }; } diff --git a/packages/openapi-fetch/examples/sveltekit/src/lib/api/v1.json b/packages/openapi-fetch/examples/sveltekit/src/lib/api/v1.json index 198b17f79..baf0c069e 100644 --- a/packages/openapi-fetch/examples/sveltekit/src/lib/api/v1.json +++ b/packages/openapi-fetch/examples/sveltekit/src/lib/api/v1.json @@ -36,6 +36,16 @@ } } } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } } } @@ -70,7 +80,24 @@ } }, "404": { - "description": "Fact not found" + "description": "not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } } } @@ -116,6 +143,16 @@ } } } + }, + "default": { + "description": "error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } } } @@ -178,6 +215,14 @@ } }, "type": "object" + }, + "Error": { + "type": "object", + "required": ["code", "message"], + "properties": { + "code": { "type": "number" }, + "message": { "type": "string" } + } } } } diff --git a/packages/openapi-fetch/examples/sveltekit/src/routes/+page.svelte b/packages/openapi-fetch/examples/sveltekit/src/routes/+page.svelte index b3cfa1234..ccd8001b3 100644 --- a/packages/openapi-fetch/examples/sveltekit/src/routes/+page.svelte +++ b/packages/openapi-fetch/examples/sveltekit/src/routes/+page.svelte @@ -1,23 +1,30 @@

Example: Client | Page Data

- {#await fact} -
Loading...
- {:then { data, error }} - {#if error} -
There was an error: {String(error)}
+ {#if fact} + {#if fact.error} +
There was an error: {fact.error}
{:else} -
{JSON.stringify(data, undefined, 2)}
+
{JSON.stringify(fact.data, undefined, 2)}
{/if} - {/await} - + {/if} +
diff --git a/packages/openapi-fetch/examples/sveltekit/src/routes/page-data/+page.svelte b/packages/openapi-fetch/examples/sveltekit/src/routes/page-data/+page.svelte index 4658321b8..9a33d3dc3 100644 --- a/packages/openapi-fetch/examples/sveltekit/src/routes/page-data/+page.svelte +++ b/packages/openapi-fetch/examples/sveltekit/src/routes/page-data/+page.svelte @@ -7,11 +7,11 @@

Example: Client | Page Data

{#if data.fact.error} -
There was an error: {String(data.fact.error)}
+
There was an error: {data.fact.error.message}
{:else if data.fact.data}
{JSON.stringify(data.fact.data, undefined, 2)}
{:else}
Loading...
{/if} - +
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82d420b2d..3d85a4dba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,11 +144,42 @@ importers: version: 5.1.6 vitest: specifier: ^0.34.1 - version: 0.34.1(supports-color@9.4.0) + version: 0.34.1 vitest-fetch-mock: specifier: ^0.2.2 version: 0.2.2(vitest@0.34.1) + packages/openapi-fetch/examples/nextjs: + dependencies: + next: + specifier: 13.4.19 + version: 13.4.19(react-dom@18.2.0)(react@18.2.0) + openapi-fetch: + specifier: file:../.. + version: file:packages/openapi-fetch + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/node': + specifier: 20.5.1 + version: 20.5.1 + '@types/react': + specifier: 18.2.20 + version: 18.2.20 + '@types/react-dom': + specifier: 18.2.7 + version: 18.2.7 + openapi-typescript: + specifier: workspace:^ + version: link:../../../openapi-typescript + typescript: + specifier: 5.1.6 + version: 5.1.6 + packages/openapi-fetch/examples/react-query: dependencies: '@tanstack/react-query': @@ -1768,6 +1799,91 @@ packages: read-yaml-file: 1.1.0 dev: true + /@next/env@13.4.19: + resolution: {integrity: sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==} + dev: false + + /@next/swc-darwin-arm64@13.4.19: + resolution: {integrity: sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@13.4.19: + resolution: {integrity: sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@13.4.19: + resolution: {integrity: sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@13.4.19: + resolution: {integrity: sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@13.4.19: + resolution: {integrity: sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@13.4.19: + resolution: {integrity: sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@13.4.19: + resolution: {integrity: sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc@13.4.19: + resolution: {integrity: sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@13.4.19: + resolution: {integrity: sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2002,6 +2118,12 @@ packages: '@swc/core-win32-x64-msvc': 1.3.78 dev: true + /@swc/helpers@0.5.1: + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + dependencies: + tslib: 2.6.2 + dev: false + /@tanstack/query-core@4.33.0: resolution: {integrity: sha512-qYu73ptvnzRh6se2nyBIDHGBQvPY1XXl3yR769B7B6mIDD7s+EZhdlWHQ67JI6UOTFRaI7wupnTnwJ3gE0Mr/g==} dev: false @@ -2167,7 +2289,6 @@ packages: /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - dev: false /@types/pug@2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} @@ -2177,7 +2298,6 @@ packages: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: '@types/react': 18.2.20 - dev: false /@types/react@18.2.20: resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} @@ -2185,7 +2305,6 @@ packages: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 csstype: 3.1.2 - dev: false /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -2194,12 +2313,11 @@ packages: /@types/sax@1.2.4: resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 20.5.0 + '@types/node': 20.5.1 dev: true /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - dev: false /@types/semver@7.5.0: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} @@ -2822,7 +2940,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001521 + caniuse-lite: 1.0.30001522 electron-to-chromium: 1.4.494 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) @@ -2905,8 +3023,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - /caniuse-lite@1.0.30001521: - resolution: {integrity: sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==} + /caniuse-lite@1.0.30001522: + resolution: {integrity: sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==} dev: false /ccount@2.0.1: @@ -3008,6 +3126,10 @@ packages: engines: {node: '>=6'} dev: false + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: @@ -3176,7 +3298,6 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: false /csv-generate@3.4.3: resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} @@ -4136,6 +4257,10 @@ packages: is-glob: 4.0.3 dev: true + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: false + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -5504,6 +5629,46 @@ packages: typescript: 5.1.6 dev: false + /next@13.4.19(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==} + engines: {node: '>=16.8.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.4.19 + '@swc/helpers': 0.5.1 + busboy: 1.6.0 + caniuse-lite: 1.0.30001522 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + watchpack: 2.4.0 + zod: 3.21.4 + optionalDependencies: + '@next/swc-darwin-arm64': 13.4.19 + '@next/swc-darwin-x64': 13.4.19 + '@next/swc-linux-arm64-gnu': 13.4.19 + '@next/swc-linux-arm64-musl': 13.4.19 + '@next/swc-linux-x64-gnu': 13.4.19 + '@next/swc-linux-x64-musl': 13.4.19 + '@next/swc-win32-arm64-msvc': 13.4.19 + '@next/swc-win32-ia32-msvc': 13.4.19 + '@next/swc-win32-x64-msvc': 13.4.19 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /nice-napi@1.0.2: resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} os: ['!win32'] @@ -5937,6 +6102,15 @@ packages: postcss: 8.4.28 dev: true + /postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + /postcss@8.4.28: resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} engines: {node: ^10 || ^12 || >=14} @@ -6791,6 +6965,23 @@ packages: acorn: 8.10.0 dev: true + /styled-jsx@5.1.1(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.2.0 + dev: false + /suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} dependencies: @@ -7327,6 +7518,28 @@ packages: vfile-message: 3.1.4 dev: false + /vite-node@0.34.1(@types/node@20.5.0): + resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4(supports-color@9.4.0) + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.9(@types/node@20.5.0)(sass@1.65.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite-node@0.34.1(@types/node@20.5.0)(supports-color@9.4.0): resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} engines: {node: '>=v14.18.0'} @@ -7349,6 +7562,28 @@ packages: - terser dev: true + /vite-node@0.34.1(@types/node@20.5.1)(supports-color@9.4.0): + resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4(supports-color@9.4.0) + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.9(@types/node@20.5.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite-node@0.34.2(@types/node@20.5.1): resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} engines: {node: '>=v14.18.0'} @@ -7476,12 +7711,12 @@ packages: vitest: '>=0.16.0' dependencies: cross-fetch: 3.1.8 - vitest: 0.34.1(supports-color@9.4.0) + vitest: 0.34.1 transitivePeerDependencies: - encoding dev: true - /vitest@0.34.1(supports-color@9.4.0): + /vitest@0.34.1: resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -7534,7 +7769,72 @@ packages: tinybench: 2.5.0 tinypool: 0.7.0 vite: 4.4.9(@types/node@20.5.0)(sass@1.65.1) - vite-node: 0.34.1(@types/node@20.5.0)(supports-color@9.4.0) + vite-node: 0.34.1(@types/node@20.5.0) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vitest@0.34.1(supports-color@9.4.0): + resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 20.5.1 + '@vitest/expect': 0.34.1 + '@vitest/runner': 0.34.1 + '@vitest/snapshot': 0.34.1 + '@vitest/spy': 0.34.1 + '@vitest/utils': 0.34.1 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4(supports-color@9.4.0) + local-pkg: 0.4.3 + magic-string: 0.30.2 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.7.0 + vite: 4.4.9(@types/node@20.5.1) + vite-node: 0.34.1(@types/node@20.5.1)(supports-color@9.4.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -7672,6 +7972,14 @@ packages: resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} dev: false + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: false + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: @@ -7868,6 +8176,10 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false + /zod@3.22.1: resolution: {integrity: sha512-+qUhAMl414+Elh+fRNtpU+byrwjDFOS1N7NioLY+tSlcADTx4TkCUua/hxJvxwDXcV4397/nZ420jy4n4+3WUg==}