diff --git a/.changeset/clever-hotels-juggle.md b/.changeset/clever-hotels-juggle.md new file mode 100644 index 000000000..d550b83db --- /dev/null +++ b/.changeset/clever-hotels-juggle.md @@ -0,0 +1,6 @@ +--- +"effect-http-node": minor +"effect-http": minor +--- + +Update effect dependencies. diff --git a/CHANGELOG.md b/CHANGELOG.md index 75bacc2e2..4a511ee14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -589,13 +589,13 @@ Instead of ```ts - const client = pipe(api, Http.client(url, options)); + const client = pipe(api, Http.client.execute(url, options)); ``` use ```ts - const client = Http.client(api, url, options); + const client = Http.client.execute(api, url, options); ``` - e0fa6e6: Remove `effect-log` and logging functionality. @@ -660,7 +660,7 @@ headers: { "X-Another": Schema.string }, }, ], - }), + }) ); ``` @@ -1007,7 +1007,7 @@ server, Http.listen({ port: 3000 }), Effect.provideLayer(layer), - Effect.runPromise, + Effect.runPromise ); ``` diff --git a/package.json b/package.json index 2c7273a4b..7c8c7a0f5 100644 --- a/package.json +++ b/package.json @@ -28,15 +28,15 @@ "@changesets/cli": "^2.27.8", "@effect/build-utils": "^0.7.8", "@effect/docgen": "^0.4.4", - "@effect/dtslint": "^0.1.0", + "@effect/dtslint": "^0.1.1", "@effect/eslint-plugin": "^0.2.0", "@effect/language-service": "^0.1.0", - "@effect/vitest": "^0.9.2", - "@types/node": "^22.5.4", + "@effect/vitest": "^0.10.0", + "@types/node": "^22.5.5", "@types/swagger-ui-dist": "^3.30.5", "@typescript-eslint/eslint-plugin": "^8.5.0", "@typescript-eslint/parser": "^8.5.0", - "@vitest/coverage-v8": "^2.0.5", + "@vitest/coverage-v8": "^2.1.1", "babel-plugin-annotate-pure-calls": "^0.4.0", "eslint": "^8.57.0", "eslint-import-resolver-typescript": "^3.6.3", @@ -49,9 +49,9 @@ "madge": "^8.0.0", "prettier": "^3.3.3", "rimraf": "^6.0.1", - "tsx": "^4.19.0", + "tsx": "^4.19.1", "typescript": "^5.6.2", - "vitest": "^2.0.5" + "vitest": "^2.1.1" }, "pnpm": { "updateConfig": { diff --git a/packages/effect-http-node/CHANGELOG.md b/packages/effect-http-node/CHANGELOG.md index 28c3c1876..d6b0c852f 100644 --- a/packages/effect-http-node/CHANGELOG.md +++ b/packages/effect-http-node/CHANGELOG.md @@ -152,21 +152,23 @@ import { NodeTesting } from "effect-http-node"; const myEndpoint = Api.get("myEndpoint", "/my-endpoint").pipe( - Api.setResponseBody(Schema.Struct({ hello: Schema.String })), + Api.setResponseBody(Schema.Struct({ hello: Schema.String })) ); const myHandler = Handler.make(myEndpoint, () => - Effect.succeed({ hello: "world" }), + Effect.succeed({ hello: "world" }) ); it.scoped("myHandler", () => Effect.gen(function* () { const client = yield* NodeTesting.handler(myHandler); - const response = yield* client(HttpClientRequest.get("/my-endpoint")); + const response = yield* client.execute( + HttpClientRequest.get("/my-endpoint") + ); expect(response.status).toEqual(200); expect(yield* response.json).toEqual({ hello: "world" }); - }), + }) ); ``` @@ -322,13 +324,13 @@ const myEndpointHandler = RouterBuilder.handler( api, "myEndpoint", - ({ query }) => Effect.succeed(query.country), + ({ query }) => Effect.succeed(query.country) ); const app = pipe( RouterBuilder.make(api), RouterBuilder.handle(myEndpointHandler), - RouterBuilder.build, + RouterBuilder.build ); ``` @@ -484,9 +486,9 @@ scheme: "basic", }, schema: Schema.Secret, - }), - ), - ), + }) + ) + ) ); ``` @@ -497,9 +499,9 @@ Api.addEndpoint( Api.post("mySecuredEndpoint", "/my-secured-endpoint").pipe( Api.setResponseBody(Schema.string), - Api.setSecurity(Security.basic()), - ), - ), + Api.setSecurity(Security.basic()) + ) + ) ); ``` @@ -564,7 +566,7 @@ Api.get("getUser", "/user", { response: User, request: { query: GetUserQuery }, - }), + }) ); ``` @@ -577,9 +579,9 @@ pipe( Api.get("getUser", "/user"), Api.setResponseBody(UserResponse), - Api.setRequestQuery(GetUserQuery), - ), - ), + Api.setRequestQuery(GetUserQuery) + ) + ) ); ``` @@ -601,9 +603,9 @@ pipe( Api.post("createUser", "/user"), Api.setResponseStatus(201), - Api.setResponseBody(UserResponse), - ), - ), + Api.setResponseBody(UserResponse) + ) + ) ); const client = Client.make(api); @@ -622,7 +624,7 @@ Api.addResponse({ status: 204, headers: Schema.struct({ "x-another": Schema.NumberFromString }), - }), + }) ); ``` @@ -635,7 +637,7 @@ ```ts const mySecuredEnpoint = Api.post("security", "/testSecurity").pipe( Api.setResponseBody(Schema.string), - Api.addSecurity("myAwesomeBearerAuth", mySecuritySchema), + Api.addSecurity("myAwesomeBearerAuth", mySecuritySchema) ); const api = Api.make().pipe(Api.addEndpoint(mySecuredEnpoint)); diff --git a/packages/effect-http-node/package.json b/packages/effect-http-node/package.json index a0da05ab8..b36f03618 100644 --- a/packages/effect-http-node/package.json +++ b/packages/effect-http-node/package.json @@ -32,19 +32,19 @@ "swagger-ui-dist": "^5.17.14" }, "peerDependencies": { - "@effect/platform": "^0.64.0", - "@effect/platform-node": "^0.59.0", - "@effect/schema": "^0.72.0", - "effect": "^3.7.0", + "@effect/platform": "^0.65.0", + "@effect/platform-node": "^0.60.0", + "@effect/schema": "^0.73.0", + "effect": "^3.8.0", "effect-http": "workspace:^" }, "devDependencies": { - "@effect/platform": "^0.64.0", - "@effect/platform-bun": "^0.44.0", - "@effect/platform-node": "^0.59.0", - "@effect/schema": "^0.72.3", - "@types/node": "^22.5.4", - "effect": "^3.7.2", + "@effect/platform": "^0.65.1", + "@effect/platform-bun": "^0.45.1", + "@effect/platform-node": "^0.60.1", + "@effect/schema": "^0.73.0", + "@types/node": "^22.5.5", + "effect": "^3.8.0", "effect-http": "workspace:^" } } diff --git a/packages/effect-http-node/src/NodeTesting.ts b/packages/effect-http-node/src/NodeTesting.ts index 7c5c651c5..1b086f89d 100644 --- a/packages/effect-http-node/src/NodeTesting.ts +++ b/packages/effect-http-node/src/NodeTesting.ts @@ -57,7 +57,7 @@ export const make: ( export const makeRaw: ( app: HttpApp.Default ) => Effect.Effect< - HttpClient.HttpClient.Default, + HttpClient.HttpClient.Service, never, | Scope.Scope | Exclude< @@ -90,7 +90,7 @@ export const makeRaw: ( * * Effect.gen(function*() { * const client = yield* NodeTesting.handler(myHandler) - * const response = yield* client(HttpClientRequest.get("/my-endpoint")) + * const response = yield* client.execute(HttpClientRequest.get("/my-endpoint")) * * assert.deepStrictEqual(response.status, 200) * assert.deepStrictEqual(yield* response.json, { hello: "world" }) @@ -102,7 +102,7 @@ export const makeRaw: ( export const handler: ( app: Handler.Handler ) => Effect.Effect< - HttpClient.HttpClient.Default, + HttpClient.HttpClient.Service, never, | Scope.Scope | Exclude< diff --git a/packages/effect-http-node/src/internal/node-testing.ts b/packages/effect-http-node/src/internal/node-testing.ts index e9b7a338e..d52ea7006 100644 --- a/packages/effect-http-node/src/internal/node-testing.ts +++ b/packages/effect-http-node/src/internal/node-testing.ts @@ -2,13 +2,16 @@ import { createServer } from "http" import * as NodeContext from "@effect/platform-node/NodeContext" import * as NodeHttpServer from "@effect/platform-node/NodeHttpServer" +import * as FetchHttpClient from "@effect/platform/FetchHttpClient" import type * as HttpApp from "@effect/platform/HttpApp" import * as HttpClient from "@effect/platform/HttpClient" import * as HttpClientRequest from "@effect/platform/HttpClientRequest" import * as HttpServer from "@effect/platform/HttpServer" +import * as Context from "effect/Context" import * as Deferred from "effect/Deferred" import * as Effect from "effect/Effect" import * as Layer from "effect/Layer" +import type * as Scope from "effect/Scope" import type * as Api from "effect-http/Api" import type * as ApiEndpoint from "effect-http/ApiEndpoint" @@ -18,6 +21,14 @@ import type * as SwaggerRouter from "effect-http/SwaggerRouter" import * as NodeSwaggerFiles from "../NodeSwaggerFiles.js" +/** @internal */ +const defaultHttpClient = FetchHttpClient.layer.pipe( + Layer.build, + Effect.map(Context.get(HttpClient.HttpClient)), + Effect.scoped, + Effect.runSync +) + /** @internal */ export const make = ( app: HttpApp.Default, @@ -28,7 +39,7 @@ export const make = ( Effect.map((url) => Client.make(api, { ...options, - httpClient: makeHttpClient(options?.httpClient ?? HttpClient.fetch, url) + httpClient: makeHttpClient(options?.httpClient ?? defaultHttpClient, url) }) ), Effect.provide(NodeSwaggerFiles.SwaggerFilesLive), @@ -40,7 +51,7 @@ export const makeRaw = ( app: HttpApp.Default ) => startTestServer(app).pipe( - Effect.map((url) => makeHttpClient(HttpClient.fetch, url)), + Effect.map((url) => makeHttpClient(defaultHttpClient, url)), Effect.provide(NodeSwaggerFiles.SwaggerFilesLive), Effect.provide(NodeContext.layer) ) @@ -50,7 +61,7 @@ export const handler = ( handler: Handler.Handler ) => startTestServer(Handler.getRouter(handler)).pipe( - Effect.map((url) => makeHttpClient(HttpClient.fetch, url)), + Effect.map((url) => makeHttpClient(defaultHttpClient, url)), Effect.provide(NodeContext.layer) ) @@ -68,14 +79,14 @@ const startTestServer = ( )) /** @internal */ -const makeHttpClient = (client: HttpClient.HttpClient.Default, url: string) => +const makeHttpClient = (client: HttpClient.HttpClient.Service, url: string) => client.pipe( HttpClient.mapRequest(HttpClientRequest.prependUrl(url)), - HttpClient.transform( - Effect.locallyWith( - HttpClient.currentFetchOptions, - (currentFetchOptions) => ({ keepalive: false, ...currentFetchOptions }) - ) + HttpClient.transformResponse( + Effect.mapInputContext((ctx: Context.Context) => { + const init = ctx.unsafeMap.get(FetchHttpClient.RequestInit.key) ?? {} + return Context.add(ctx, FetchHttpClient.RequestInit, { keepalive: false, ...init }) + }) ) ) diff --git a/packages/effect-http-node/test/handler.test.ts b/packages/effect-http-node/test/handler.test.ts index abf5e6339..94de2f227 100644 --- a/packages/effect-http-node/test/handler.test.ts +++ b/packages/effect-http-node/test/handler.test.ts @@ -1,4 +1,4 @@ -import { Cookies, Headers, HttpClient, HttpClientRequest, HttpServerResponse } from "@effect/platform" +import { Cookies, FetchHttpClient, Headers, HttpClientRequest, HttpServerResponse } from "@effect/platform" import { Schema } from "@effect/schema" import * as it from "@effect/vitest" import { Effect, Option } from "effect" @@ -80,7 +80,7 @@ describe("examples", () => { Handler.make(() => Effect.succeed(12)) ) const client = yield* NodeTesting.handler(getValueHandler) - const response = yield* client(HttpClientRequest.get("/get-value")) + const response = yield* client.execute(HttpClientRequest.get("/get-value")) expect(yield* response.json).toEqual(12) })) @@ -90,14 +90,14 @@ describe("examples", () => { Handler.make(() => Effect.succeed({ value: Option.some("test") })) ) const client = yield* NodeTesting.handler(route) - const response = yield* client(HttpClientRequest.post("/test")) + const response = yield* client.execute(HttpClientRequest.post("/test")) expect(yield* response.json).toEqual({ value: "test" }) })) it.scoped("get, query parameter", () => Effect.gen(function*() { const client = yield* NodeTesting.handler(exampleRouteGetQueryParameter) - const response = yield* client( + const response = yield* client.execute( HttpClientRequest.get("/hello").pipe(HttpClientRequest.appendUrlParam("country", "CZ")) ) expect(yield* response.json).toEqual("CZ") @@ -112,7 +112,7 @@ describe("examples", () => { ) const client = yield* NodeTesting.handler(handler) - const response = yield* client(HttpClientRequest.get("/hello")) + const response = yield* client.execute(HttpClientRequest.get("/hello")) const body = yield* response.json expect(response.status).toEqual(201) @@ -135,7 +135,7 @@ describe("examples", () => { const client = yield* NodeTesting.handler(handler) const response = yield* HttpClientRequest.get("/hello").pipe( HttpClientRequest.setUrlParam("value", "off"), - client + client.execute ) const body = yield* response.json @@ -146,9 +146,9 @@ describe("examples", () => { it.scoped("post, request body", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteRequestBody) - const response = yield* client( + const response = yield* client.execute( HttpClientRequest.post("/hello").pipe( - HttpClientRequest.unsafeJsonBody({ foo: "hello" }) + HttpClientRequest.bodyUnsafeJson({ foo: "hello" }) ) ) const body = yield* response.json @@ -158,7 +158,7 @@ describe("examples", () => { it.scoped("path parameters", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteParams) - const response = yield* client(HttpClientRequest.post("/hello/a")) + const response = yield* client.execute(HttpClientRequest.post("/hello/a")) expect(yield* response.json).toEqual("a") })) }) @@ -167,7 +167,7 @@ describe("error reporting", () => { it.scoped("missing query parameter", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteGetQueryParameter) - const response = yield* client(HttpClientRequest.get("/hello")) + const response = yield* client.execute(HttpClientRequest.get("/hello")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -182,7 +182,7 @@ describe("error reporting", () => { it.scoped("invalid query parameter", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteGetQueryParameter) - const response = yield* client( + const response = yield* client.execute( HttpClientRequest.get("/hello").pipe( HttpClientRequest.setUrlParam("country", "CZE") ) @@ -201,7 +201,7 @@ describe("error reporting", () => { it.scoped("invalid JSON body - empty", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteRequestBody) - const response = yield* client(HttpClientRequest.post("/hello")) + const response = yield* client.execute(HttpClientRequest.post("/hello")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -214,8 +214,8 @@ describe("error reporting", () => { it.scoped("invalid JSON body - text", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteRequestBody) - const response = yield* client( - HttpClientRequest.post("/hello").pipe(HttpClientRequest.textBody("value")) + const response = yield* client.execute( + HttpClientRequest.post("/hello").pipe(HttpClientRequest.bodyText("value")) ) expect(response.status).toEqual(400) @@ -229,9 +229,9 @@ describe("error reporting", () => { it.scoped("invalid JSON body - incorrect schema", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteRequestBody) - const response = yield* client( + const response = yield* client.execute( HttpClientRequest.post("/hello").pipe( - HttpClientRequest.unsafeJsonBody({ foo: 1 }) + HttpClientRequest.bodyUnsafeJson({ foo: 1 }) ) ) @@ -248,7 +248,7 @@ describe("error reporting", () => { it.scoped("invalid header", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteRequestHeaders) - const response = yield* client(HttpClientRequest.post("/hello")) + const response = yield* client.execute(HttpClientRequest.post("/hello")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -263,7 +263,7 @@ describe("error reporting", () => { it.scoped("invalid param", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRouteParams) - const response = yield* client(HttpClientRequest.post("/hello/c")) + const response = yield* client.execute(HttpClientRequest.post("/hello/c")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -284,7 +284,7 @@ describe("error reporting", () => { ) const client = yield* NodeTesting.handler(helloHandler) - const response = yield* client(HttpClientRequest.post("/hello/a")) + const response = yield* client.execute(HttpClientRequest.post("/hello/a")) expect(response.status).toEqual(500) expect(yield* response.json).toEqual({ @@ -296,7 +296,7 @@ describe("error reporting", () => { it.scoped("multiple errors", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleMultipleQueryAllErrors) - const response = yield* client(HttpClientRequest.post("/test")) + const response = yield* client.execute(HttpClientRequest.post("/test")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -313,7 +313,7 @@ describe("error reporting", () => { it.scoped("multiple errors", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleMultipleQueryFirstError) - const response = yield* client(HttpClientRequest.post("/test")) + const response = yield* client.execute(HttpClientRequest.post("/test")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -328,8 +328,8 @@ describe("error reporting", () => { it.scoped("redirect using makeRaw", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRedirectRaw) - const response = yield* client(HttpClientRequest.post("/test")).pipe( - HttpClient.withFetchOptions({ redirect: "manual" }) + const response = yield* client.execute(HttpClientRequest.post("/test")).pipe( + Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" }) ) expect(response.status).toEqual(302) @@ -339,8 +339,8 @@ describe("error reporting", () => { it.scoped("redirect using make", () => Effect.gen(function*(_) { const client = yield* NodeTesting.handler(exampleRedirect) - const response = yield* client(HttpClientRequest.post("/test")).pipe( - HttpClient.withFetchOptions({ redirect: "manual" }) + const response = yield* client.execute(HttpClientRequest.post("/test")).pipe( + Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" }) ) expect(response.status).toEqual(302) @@ -357,8 +357,8 @@ describe("error reporting", () => { const client = yield* NodeTesting.handler(handler) const [response1, response2] = yield* Effect.zip( - client(HttpClientRequest.get("/get-value")), - client(HttpClientRequest.post("/test")) + client.execute(HttpClientRequest.get("/get-value")), + client.execute(HttpClientRequest.post("/test")) ) expect(yield* response1.json).toEqual(12) @@ -378,9 +378,9 @@ describe("error reporting", () => { const client = yield* NodeTesting.handler(handler) const [response1, response2, response3] = yield* Effect.all([ - client(HttpClientRequest.get("/get-value")), - client(HttpClientRequest.post("/test")), - client(HttpClientRequest.post("/hello/a")) + client.execute(HttpClientRequest.get("/get-value")), + client.execute(HttpClientRequest.post("/test")), + client.execute(HttpClientRequest.post("/hello/a")) ]) expect(yield* response1.json).toEqual(12) diff --git a/packages/effect-http-node/test/router-builder.test.ts b/packages/effect-http-node/test/router-builder.test.ts index 95270a1f2..266629ca4 100644 --- a/packages/effect-http-node/test/router-builder.test.ts +++ b/packages/effect-http-node/test/router-builder.test.ts @@ -3,7 +3,6 @@ import * as it from "@effect/vitest" import { Effect, Option } from "effect" import { Api, RouterBuilder } from "effect-http" import { NodeTesting } from "effect-http-node" -import { apply } from "effect/Function" import { describe, expect } from "vitest" import { exampleApiFullResponse, @@ -54,7 +53,7 @@ describe("examples", () => { ) const client = yield* NodeTesting.makeRaw(router) - const response = yield* client(HttpClientRequest.get("/get-value")) + const response = yield* client.execute(HttpClientRequest.get("/get-value")) const body = yield* response.json expect(response.status).toEqual(200) @@ -73,7 +72,7 @@ describe("examples", () => { ) const client = yield* NodeTesting.makeRaw(router) - const response = yield* client(HttpClientRequest.post("/test")) + const response = yield* client.execute(HttpClientRequest.post("/test")) const body = yield* response.json expect(response.status).toEqual(200) @@ -89,7 +88,7 @@ describe("examples", () => { const response = yield* _( HttpClientRequest.get("/hello"), HttpClientRequest.appendUrlParam("country", "CZ"), - client + client.execute ) const body = yield* response.json @@ -117,7 +116,7 @@ describe("examples", () => { ) const client = yield* NodeTesting.makeRaw(router) - const response = yield* client(HttpClientRequest.get("/hello")) + const response = yield* client.execute(HttpClientRequest.get("/hello")) const body = yield* response.json expect(response.status).toEqual(201) @@ -145,7 +144,7 @@ describe("examples", () => { const response = yield* _( HttpClientRequest.get("/hello"), HttpClientRequest.setUrlParam("value", "off"), - client + client.execute ) const body = yield* response.json @@ -161,8 +160,8 @@ describe("examples", () => { const client = yield* NodeTesting.makeRaw(exampleRouteRequestBody) const response = yield* _( HttpClientRequest.post("/hello"), - HttpClientRequest.unsafeJsonBody({ foo: "hello" }), - client + HttpClientRequest.bodyUnsafeJson({ foo: "hello" }), + client.execute ) const body = yield* response.json @@ -177,7 +176,7 @@ describe("examples", () => { () => Effect.gen(function*(_) { const client = yield* NodeTesting.makeRaw(exampleRouteParams) - const response = yield* client(HttpClientRequest.post("/hello/a")) + const response = yield* client.execute(HttpClientRequest.post("/hello/a")) const body = yield* response.json @@ -193,7 +192,7 @@ describe("error reporting", () => { () => Effect.gen(function*(_) { const client = yield* NodeTesting.makeRaw(exampleRouteGetQueryParameter) - const response = yield* client(HttpClientRequest.get("/hello")) + const response = yield* client.execute(HttpClientRequest.get("/hello")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -214,7 +213,7 @@ describe("error reporting", () => { const response = yield* _( HttpClientRequest.get("/hello"), HttpClientRequest.setUrlParam("country", "CZE"), - client + client.execute ) expect(response.status).toEqual(400) @@ -233,7 +232,7 @@ describe("error reporting", () => { () => Effect.gen(function*(_) { const client = yield* NodeTesting.makeRaw(exampleRouteRequestBody) - const response = yield* client(HttpClientRequest.post("/hello")) + const response = yield* client.execute(HttpClientRequest.post("/hello")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -251,8 +250,8 @@ describe("error reporting", () => { const client = yield* NodeTesting.makeRaw(exampleRouteRequestBody) const response = yield* _( HttpClientRequest.post("/hello"), - HttpClientRequest.textBody("value"), - client + HttpClientRequest.bodyText("value"), + client.execute ) expect(response.status).toEqual(400) @@ -271,8 +270,8 @@ describe("error reporting", () => { const client = yield* NodeTesting.makeRaw(exampleRouteRequestBody) const response = yield* _( HttpClientRequest.post("/hello"), - HttpClientRequest.unsafeJsonBody({ foo: 1 }), - client + HttpClientRequest.bodyUnsafeJson({ foo: 1 }), + client.execute ) expect(response.status).toEqual(400) @@ -291,7 +290,7 @@ describe("error reporting", () => { () => Effect.gen(function*(_) { const client = yield* NodeTesting.makeRaw(exampleRouteRequestHeaders) - const response = yield* client(HttpClientRequest.post("/hello")) + const response = yield* client.execute(HttpClientRequest.post("/hello")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -310,7 +309,7 @@ describe("error reporting", () => { Effect.gen(function*(_) { const response = yield* _( NodeTesting.makeRaw(exampleRouteParams), - Effect.flatMap(apply(HttpClientRequest.post("/hello/c"))) + Effect.flatMap((client) => client.execute(HttpClientRequest.post("/hello/c"))) ) expect(response.status).toEqual(400) @@ -337,7 +336,7 @@ describe("error reporting", () => { ) const client = yield* NodeTesting.makeRaw(exampleRouteInvalid) - const response = yield* client(HttpClientRequest.post("/hello/a")) + const response = yield* client.execute(HttpClientRequest.post("/hello/a")) expect(response.status).toEqual(500) expect(yield* response.json).toEqual({ @@ -367,8 +366,8 @@ it.scoped( const client = yield* NodeTesting.makeRaw(app) const [response1, response2] = yield* Effect.all([ - client(HttpClientRequest.post("/hello")), - client(HttpClientRequest.post("/another")) + client.execute(HttpClientRequest.post("/hello")), + client.execute(HttpClientRequest.post("/another")) ]) expect(response1.status).toEqual(200) @@ -393,15 +392,15 @@ it.scoped( const client = yield* NodeTesting.makeRaw(app) const [textResponse, jsonResponse, xmlResponse] = yield* Effect.all([ - client( + client.execute( HttpClientRequest.post("/test").pipe(HttpClientRequest.accept("text/plain")) ), - client( + client.execute( HttpClientRequest.post("/test").pipe( HttpClientRequest.accept("application/json") ) ), - client( + client.execute( HttpClientRequest.post("/test").pipe( HttpClientRequest.accept("application/xml") ) @@ -443,8 +442,8 @@ it.scoped( const client = yield* NodeTesting.makeRaw(app) const [response1, response2] = yield* Effect.all([ - client(HttpClientRequest.post("/hello")), - client(HttpClientRequest.post("/another")) + client.execute(HttpClientRequest.post("/hello")), + client.execute(HttpClientRequest.post("/another")) ]) expect(response1.status).toEqual(200) @@ -479,9 +478,9 @@ it.scoped( const client = yield* NodeTesting.makeRaw(app) const responses = yield* Effect.all([ - client(HttpClientRequest.get("/endpoint-1")), - client(HttpClientRequest.get("/endpoint-2")), - client(HttpClientRequest.get("/endpoint-3")) + client.execute(HttpClientRequest.get("/endpoint-1")), + client.execute(HttpClientRequest.get("/endpoint-2")), + client.execute(HttpClientRequest.get("/endpoint-3")) ]) for (const response of responses) { diff --git a/packages/effect-http-node/test/server.test.ts b/packages/effect-http-node/test/server.test.ts index 52d50704f..b840ef0b8 100644 --- a/packages/effect-http-node/test/server.test.ts +++ b/packages/effect-http-node/test/server.test.ts @@ -505,7 +505,7 @@ it.scoped("uuid", () => ) const client = yield* NodeTesting.makeRaw(app) - const response = yield* client(HttpClientRequest.get("/test/invalid")) + const response = yield* client.execute(HttpClientRequest.get("/test/invalid")) expect(response.status).toEqual(400) expect(yield* response.json).toEqual({ @@ -541,17 +541,17 @@ it.scoped("array query parameter", () => const client = yield* NodeTesting.makeRaw(app) // empty array works - const response0 = yield* client(HttpClientRequest.get("/test")) + const response0 = yield* client.execute(HttpClientRequest.get("/test")) expect(response0.status).toEqual(200) expect(yield* response0.json).toEqual([]) // single-item array works - const response1 = yield* client(HttpClientRequest.get("/test?id=1")) + const response1 = yield* client.execute(HttpClientRequest.get("/test?id=1")) expect(response1.status).toEqual(200) expect(yield* response1.json).toEqual([1]) // array of length >1 works - const response2 = yield* client(HttpClientRequest.get("/test?id=1&id=2")) + const response2 = yield* client.execute(HttpClientRequest.get("/test?id=1&id=2")) expect(response2.status).toEqual(200) expect(yield* response2.json).toEqual([1, 2]) })) @@ -578,7 +578,7 @@ it.scoped("non-empty array query parameter", () => const client = yield* NodeTesting.makeRaw(app) // empty array errors - const response0 = yield* client(HttpClientRequest.get("/test")) + const response0 = yield* client.execute(HttpClientRequest.get("/test")) expect(response0.status).toEqual(400) expect(yield* response0.json).toEqual({ "error": "Request validation error", @@ -590,12 +590,12 @@ it.scoped("non-empty array query parameter", () => }) // single-item array works - const response1 = yield* client(HttpClientRequest.get("/test?id=1")) + const response1 = yield* client.execute(HttpClientRequest.get("/test?id=1")) expect(response1.status).toEqual(200) expect(yield* response1.json).toEqual([1]) // array of length >1 works - const response2 = yield* client(HttpClientRequest.get("/test?id=1&id=2")) + const response2 = yield* client.execute(HttpClientRequest.get("/test?id=1&id=2")) expect(response2.status).toEqual(200) expect(yield* response2.json).toEqual([1, 2]) })) diff --git a/packages/effect-http-node/test/swagger-router.test.ts b/packages/effect-http-node/test/swagger-router.test.ts index c9cd7ae25..1e4b94d4f 100644 --- a/packages/effect-http-node/test/swagger-router.test.ts +++ b/packages/effect-http-node/test/swagger-router.test.ts @@ -22,7 +22,7 @@ it.scoped("swagger-router mount", () => const responses = yield* _( docsUrls, Array.map((url) => HttpClientRequest.get(url)), - Effect.forEach(client) + Effect.forEach(client.execute) ) expect(responses.map((response) => response.status)).toStrictEqual(Array.replicate(200, docsUrls.length)) @@ -42,7 +42,7 @@ it.scoped("swagger-router mountApp", () => const responses = yield* _( docsUrls, Array.map((url) => HttpClientRequest.get(url)), - Effect.forEach(client) + Effect.forEach(client.execute) ) expect(responses.map((response) => response.status)).toStrictEqual(Array.replicate(200, docsUrls.length)) diff --git a/packages/effect-http/package.json b/packages/effect-http/package.json index 0a72b9dfe..f5acb5c5a 100644 --- a/packages/effect-http/package.json +++ b/packages/effect-http/package.json @@ -31,14 +31,14 @@ "coverage": "vitest --coverage" }, "peerDependencies": { - "@effect/platform": "^0.64.0", - "@effect/schema": "^0.72.0", - "effect": "^3.7.0" + "@effect/platform": "^0.65.0", + "@effect/schema": "^0.73.0", + "effect": "^3.8.0" }, "devDependencies": { "@apidevtools/swagger-parser": "^10.1.0", - "@effect/platform": "^0.64.0", - "@effect/schema": "^0.72.3", - "effect": "^3.7.2" + "@effect/platform": "^0.65.1", + "@effect/schema": "^0.73.0", + "effect": "^3.8.0" } } diff --git a/packages/effect-http/src/Client.ts b/packages/effect-http/src/Client.ts index 2e6f873c0..d919fa0be 100644 --- a/packages/effect-http/src/Client.ts +++ b/packages/effect-http/src/Client.ts @@ -32,7 +32,7 @@ export type Client = Types.Simplify< * @since 1.0.0 */ export interface Options { - httpClient?: HttpClient.HttpClient.Default + httpClient?: HttpClient.HttpClient.Service baseUrl?: string } diff --git a/packages/effect-http/src/internal/client.ts b/packages/effect-http/src/internal/client.ts index 42c41f71a..9b2222f32 100644 --- a/packages/effect-http/src/internal/client.ts +++ b/packages/effect-http/src/internal/client.ts @@ -1,8 +1,11 @@ +import * as FetchHttpClient from "@effect/platform/FetchHttpClient" import * as HttpClient from "@effect/platform/HttpClient" import * as HttpClientRequest from "@effect/platform/HttpClientRequest" +import * as Context from "effect/Context" import * as Effect from "effect/Effect" import * as Encoding from "effect/Encoding" import { dual, identity, pipe } from "effect/Function" +import * as Layer from "effect/Layer" import * as Api from "../Api.js" import * as ApiEndpoint from "../ApiEndpoint.js" import type * as Client from "../Client.js" @@ -11,7 +14,12 @@ import * as ClientRequestEncoder from "./clientRequestEncoder.js" import * as ClientResponseParser from "./clientResponseParser.js" /** @internal */ -const defaultHttpClient = HttpClient.fetch +const defaultHttpClient = FetchHttpClient.layer.pipe( + Layer.build, + Effect.map(Context.get(HttpClient.HttpClient)), + Effect.scoped, + Effect.runSync +) /** @internal */ export const endpointClient = >( @@ -36,7 +44,7 @@ export const endpointClient = > pipe( requestEncoder.encodeRequest(args), Effect.map(mapper ?? identity), - Effect.flatMap(httpClient), + Effect.flatMap(httpClient.execute), Effect.catchTags({ RequestError: (err) => ClientError.makeClientSide(err.cause, err.message), ResponseError: (err) => ClientError.makeServerSide(err.cause, err.response.status, err.message), diff --git a/packages/effect-http/src/internal/clientRequestEncoder.ts b/packages/effect-http/src/internal/clientRequestEncoder.ts index e5385eb72..449622b6d 100644 --- a/packages/effect-http/src/internal/clientRequestEncoder.ts +++ b/packages/effect-http/src/internal/clientRequestEncoder.ts @@ -44,8 +44,8 @@ export const create = (endpoint: ApiEndpoint.ApiEndpoint.Any): ClientRequestEnco body === undefined ? identity : body instanceof FormData - ? HttpClientRequest.formDataBody(body) - : HttpClientRequest.unsafeJsonBody(body), + ? HttpClientRequest.bodyFormData(body) + : HttpClientRequest.bodyUnsafeJson(body), query ? HttpClientRequest.setUrlParams(query) : identity, headers ? HttpClientRequest.setHeaders(headers) : identity ) diff --git a/packages/effect-http/test/openapi.test.ts b/packages/effect-http/test/openapi.test.ts index 848ced6f7..97560b00d 100644 --- a/packages/effect-http/test/openapi.test.ts +++ b/packages/effect-http/test/openapi.test.ts @@ -269,6 +269,11 @@ test("union in query params", () => { "description": "a string", "type": "string" }, + { + "description": "a number", + "type": "number" + }, + // TODO: this doesnt look correct { "description": "a number", "type": "number" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3356342f2..14ab561dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,10 +36,10 @@ importers: version: 0.7.8 '@effect/docgen': specifier: ^0.4.4 - version: 0.4.4(tsx@4.19.0)(typescript@5.6.2) + version: 0.4.4(tsx@4.19.1)(typescript@5.6.2) '@effect/dtslint': - specifier: ^0.1.0 - version: 0.1.0(typescript@5.6.2) + specifier: ^0.1.1 + version: 0.1.1(typescript@5.6.2) '@effect/eslint-plugin': specifier: ^0.2.0 version: 0.2.0 @@ -47,11 +47,11 @@ importers: specifier: ^0.1.0 version: 0.1.0 '@effect/vitest': - specifier: ^0.9.2 - version: 0.9.2(effect@3.7.2)(vitest@2.0.5(@types/node@22.5.4)) + specifier: ^0.10.0 + version: 0.10.0(effect@3.8.0)(vitest@2.1.1(@types/node@22.5.5)) '@types/node': - specifier: ^22.5.4 - version: 22.5.4 + specifier: ^22.5.5 + version: 22.5.5 '@types/swagger-ui-dist': specifier: ^3.30.5 version: 3.30.5 @@ -62,8 +62,8 @@ importers: specifier: ^8.5.0 version: 8.5.0(eslint@8.57.0)(typescript@5.6.2) '@vitest/coverage-v8': - specifier: ^2.0.5 - version: 2.0.5(vitest@2.0.5(@types/node@22.5.4)) + specifier: ^2.1.1 + version: 2.1.1(vitest@2.1.1(@types/node@22.5.5)) babel-plugin-annotate-pure-calls: specifier: ^0.4.0 version: 0.4.0(@babel/core@7.25.2) @@ -101,14 +101,14 @@ importers: specifier: ^6.0.1 version: 6.0.1 tsx: - specifier: ^4.19.0 - version: 4.19.0 + specifier: ^4.19.1 + version: 4.19.1 typescript: specifier: ^5.6.2 version: 5.6.2 vitest: - specifier: ^2.0.5 - version: 2.0.5(@types/node@22.5.4) + specifier: ^2.1.1 + version: 2.1.1(@types/node@22.5.5) packages/effect-http: devDependencies: @@ -116,14 +116,14 @@ importers: specifier: ^10.1.0 version: 10.1.0(openapi-types@12.1.3) '@effect/platform': - specifier: ^0.64.0 - version: 0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2) + specifier: ^0.65.1 + version: 0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0) '@effect/schema': - specifier: ^0.72.3 - version: 0.72.3(effect@3.7.2) + specifier: ^0.73.0 + version: 0.73.0(effect@3.8.0) effect: - specifier: ^3.7.2 - version: 3.7.2 + specifier: ^3.8.0 + version: 3.8.0 publishDirectory: dist packages/effect-http-node: @@ -133,23 +133,23 @@ importers: version: 5.17.14 devDependencies: '@effect/platform': - specifier: ^0.64.0 - version: 0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2) + specifier: ^0.65.1 + version: 0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0) '@effect/platform-bun': - specifier: ^0.44.0 - version: 0.44.0(@effect/platform@0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2))(effect@3.7.2) + specifier: ^0.45.1 + version: 0.45.1(@effect/platform@0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0))(effect@3.8.0) '@effect/platform-node': - specifier: ^0.59.0 - version: 0.59.0(@effect/platform@0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2))(effect@3.7.2) + specifier: ^0.60.1 + version: 0.60.1(@effect/platform@0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0))(effect@3.8.0) '@effect/schema': - specifier: ^0.72.3 - version: 0.72.3(effect@3.7.2) + specifier: ^0.73.0 + version: 0.73.0(effect@3.8.0) '@types/node': - specifier: ^22.5.4 - version: 22.5.4 + specifier: ^22.5.5 + version: 22.5.5 effect: - specifier: ^3.7.2 - version: 3.7.2 + specifier: ^3.8.0 + version: 3.8.0 effect-http: specifier: workspace:^ version: link:../effect-http/dist @@ -326,6 +326,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-export-namespace-from@7.8.3': resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -379,6 +384,10 @@ packages: resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -466,8 +475,9 @@ packages: tsx: ^4.1.0 typescript: ^5.2.2 - '@effect/dtslint@0.1.0': - resolution: {integrity: sha512-PNdoBeyA7v+LRhri+3GF0bXzya4v+skh8euiYKLLxDxJ/ymryn9y1XBJBdPYzvYFmatELNWCBlas/ZZ7AbCQVg==} + '@effect/dtslint@0.1.1': + resolution: {integrity: sha512-/xbyEjxt31JsBp5YlJiRPlBz01tOgkk2NTgYJFYNS9OoH1x2xaiwMrzJFjg3/6S+D7D2Tqi7jKQTRXTQSSW8AA==} + engines: {node: '>=18.0.0'} hasBin: true peerDependencies: typescript: ^5.x @@ -483,40 +493,40 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - '@effect/platform-bun@0.44.0': - resolution: {integrity: sha512-qgPsw/6HcsVaQv1zx4e6mr8niZknnZYwIaiyIQAr4dBaaJ8BQFPe4wjBHHJsaLRPLaqKd81nnnDr2ceFzNTlaw==} + '@effect/platform-bun@0.45.1': + resolution: {integrity: sha512-jfbQ+try9DLWyWM6fBzk5GPtDZb809RkUPG/HpUYW/yNXhC1oB0rJcAQkbYMMl2xnKH5JQMsXZlh9c71E2Cbyw==} peerDependencies: - '@effect/platform': ^0.64.0 - effect: ^3.7.2 + '@effect/platform': ^0.65.1 + effect: ^3.8.0 - '@effect/platform-node-shared@0.14.0': - resolution: {integrity: sha512-3g1vr7Mq/9PsM39WQsEGyY3cfGTJ8p1XtLGLv2p4S5tM3x0dPTfQa+E/bW8H33wuaNbj3smfSmVRJrmWsGwb6g==} + '@effect/platform-node-shared@0.15.1': + resolution: {integrity: sha512-rCGg+NzCGvxG9NHnNTY9H4wt/Gqzxh/4/DjwsXlrscC6VS0DouHqSFjPAK9mIaRInlyWZ7S3VGtAGZIHiQ/Aag==} peerDependencies: - '@effect/platform': ^0.64.0 - effect: ^3.7.2 + '@effect/platform': ^0.65.1 + effect: ^3.8.0 - '@effect/platform-node@0.59.0': - resolution: {integrity: sha512-qTZvD3eaW2mJRYXp1LkyzmiXAgAyil1OTQsKVmZ7qdMkuD184DN8ZYnZ79X0eM3EXgLIgE8QlCmViCgJlevJDQ==} + '@effect/platform-node@0.60.1': + resolution: {integrity: sha512-ZjxolfhTZf9wYIEiWaqMeIu2h94zf1OAvsVmia3Av2N0XlAYhjHP1LOCFaZWtFPHkjYCMnSNnwGe6j8zkzgu7w==} peerDependencies: - '@effect/platform': ^0.64.0 - effect: ^3.7.2 + '@effect/platform': ^0.65.1 + effect: ^3.8.0 - '@effect/platform@0.64.0': - resolution: {integrity: sha512-Q2gwiY69ka5OF29bsc+7ENjLQa4hiedJf7mjf/JKx3fFcvq1vRkyCB5+neVDCsDrEPHYAHLZyjur0AiiML2l7A==} + '@effect/platform@0.65.1': + resolution: {integrity: sha512-wAo/sq+08gX4WoeQcM9pncQZPneyKRWFa43e+MGg1tzstuQqgfKvobhb3TbK24c0dn1eU9rxQNASPz6MHH43fA==} peerDependencies: - '@effect/schema': ^0.72.3 - effect: ^3.7.2 + '@effect/schema': ^0.73.0 + effect: ^3.8.0 - '@effect/schema@0.72.3': - resolution: {integrity: sha512-T1TV/8TMnEm5RSYQXOPmkqEWt8NfRd8E6FSJh9+eZ+jDc8bhAmh3K4J0BQZZcdqaftH21GdflAUbYScy8DZ71Q==} + '@effect/schema@0.73.0': + resolution: {integrity: sha512-y/TSwJcv4N6sAuJIHY5siGS+cNteiwryf4CBJaGib01ypgg+7/CUl3AwXTW1AI3oaYWmccAjww5zurHiVaooBw==} peerDependencies: - effect: ^3.7.2 + effect: ^3.8.0 - '@effect/vitest@0.9.2': - resolution: {integrity: sha512-bzoW6v2jIkl68jEIkTbfFJL8n85mldHvQjjHmMVrb2ym7jt4eBI9U4P/TLoBA/3pAXEGhGkovq1jqET3LBmvFw==} + '@effect/vitest@0.10.0': + resolution: {integrity: sha512-mswjy6XtiC/hF+Q4aEWEgBgq+dVnhYxQOc2sTMNZ+mICyzOSeJvq/FJGtHGPOGPXeHCiOmOPQ0K94RVVewThSA==} peerDependencies: - effect: ^3.7.2 - vitest: ^2.0.4 + effect: ^3.8.0 + vitest: ^2.0.5 '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} @@ -986,83 +996,83 @@ packages: resolution: {integrity: sha512-vWWVbYYBBN/kweokmURicokyg7crzcDZo9/naziv8B8RSWrLWFpq5Xl0ro6QCQKgRmb6O78Qy9uQT+Fp79RxsA==} engines: {node: '>=16.14'} - '@rollup/rollup-android-arm-eabi@4.19.1': - resolution: {integrity: sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==} + '@rollup/rollup-android-arm-eabi@4.21.3': + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.19.1': - resolution: {integrity: sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==} + '@rollup/rollup-android-arm64@4.21.3': + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.19.1': - resolution: {integrity: sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==} + '@rollup/rollup-darwin-arm64@4.21.3': + resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.19.1': - resolution: {integrity: sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==} + '@rollup/rollup-darwin-x64@4.21.3': + resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.19.1': - resolution: {integrity: sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.19.1': - resolution: {integrity: sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==} + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.19.1': - resolution: {integrity: sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==} + '@rollup/rollup-linux-arm64-gnu@4.21.3': + resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.19.1': - resolution: {integrity: sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==} + '@rollup/rollup-linux-arm64-musl@4.21.3': + resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': - resolution: {integrity: sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.19.1': - resolution: {integrity: sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==} + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.19.1': - resolution: {integrity: sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==} + '@rollup/rollup-linux-s390x-gnu@4.21.3': + resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.19.1': - resolution: {integrity: sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==} + '@rollup/rollup-linux-x64-gnu@4.21.3': + resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.19.1': - resolution: {integrity: sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==} + '@rollup/rollup-linux-x64-musl@4.21.3': + resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.19.1': - resolution: {integrity: sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==} + '@rollup/rollup-win32-arm64-msvc@4.21.3': + resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.19.1': - resolution: {integrity: sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==} + '@rollup/rollup-win32-ia32-msvc@4.21.3': + resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.19.1': - resolution: {integrity: sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==} + '@rollup/rollup-win32-x64-msvc@4.21.3': + resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} cpu: [x64] os: [win32] @@ -1133,8 +1143,8 @@ packages: '@types/node@20.16.5': resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} - '@types/node@22.5.4': - resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} + '@types/node@22.5.5': + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1261,28 +1271,44 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/coverage-v8@2.0.5': - resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} + '@vitest/coverage-v8@2.1.1': + resolution: {integrity: sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==} peerDependencies: - vitest: 2.0.5 + '@vitest/browser': 2.1.1 + vitest: 2.1.1 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + peerDependencies: + '@vitest/spy': 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} - '@vitest/runner@2.0.5': - resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} - '@vitest/snapshot@2.0.5': - resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} '@vue/compiler-core@3.4.38': resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} @@ -1754,8 +1780,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - effect@3.7.2: - resolution: {integrity: sha512-pV7l1+LSZFvVObj4zuy4nYiBaC7qZOfrKV6s/Ef4p3KueiQwZFgamazklwyZ+x7Nyj2etRDFvHE/xkThTfQD1w==} + effect@3.8.0: + resolution: {integrity: sha512-9ouAF51iUYMhbWOSQjWayfoyDDMziQCr2Y8VfhnUmRdfi44n+91VplTA5qqV2mWvFNM3ZV4R6bcfW2js9fK7IA==} electron-to-chromium@1.5.3: resolution: {integrity: sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==} @@ -1978,10 +2004,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - expand-range@1.8.2: resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} engines: {node: '>=0.10.0'} @@ -2073,8 +2095,8 @@ packages: fp-ts@2.16.6: resolution: {integrity: sha512-v7w209VPj4L6pPn/ftFRJu31Oa8QagwcVw7BZmLCUWU4AQoc954rX9ogSIahDf67Pg+GjPbkW/Kn9XWnlWJG0g==} - fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -2124,10 +2146,6 @@ packages: get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -2135,6 +2153,9 @@ packages: get-tsconfig@4.8.0: resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2233,10 +2254,6 @@ packages: human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -2405,10 +2422,6 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -2640,8 +2653,8 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -2664,9 +2677,6 @@ packages: mdast-util-to-string@2.0.0: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2691,10 +2701,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - minimatch@10.0.1: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} @@ -2785,10 +2791,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - object-inspect@1.13.2: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} @@ -2824,10 +2826,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} @@ -2907,10 +2905,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2961,14 +2955,14 @@ packages: peerDependencies: postcss: ^8.2.9 - postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.41: resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + precinct@12.1.2: resolution: {integrity: sha512-x2qVN3oSOp3D05ihCd8XdkIPuEQsyte7PSxzLqiRgktu79S5Dr1I75/S+zAup8/0cwjoiJTQztE9h0/sWp9bJQ==} engines: {node: '>=18'} @@ -3123,8 +3117,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.19.1: - resolution: {integrity: sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==} + rollup@4.21.3: + resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3225,6 +3219,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -3313,10 +3311,6 @@ packages: resolution: {integrity: sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==} engines: {node: '>=0.10.0'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -3363,19 +3357,22 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} - tinypool@1.0.0: - resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@1.2.0: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyspy@3.0.0: - resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -3433,8 +3430,8 @@ packages: peerDependencies: typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev' - tsx@4.19.0: - resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} engines: {node: '>=18.0.0'} hasBin: true @@ -3514,13 +3511,13 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vite-node@2.0.5: - resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.3.5: - resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + vite@5.4.5: + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3528,6 +3525,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -3540,6 +3538,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -3547,15 +3547,15 @@ packages: terser: optional: true - vitest@2.0.5: - resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.5 - '@vitest/ui': 2.0.5 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3861,6 +3861,10 @@ snapshots: dependencies: '@babel/types': 7.25.2 + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -3957,6 +3961,12 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} '@changesets/apply-release-plan@7.0.5': @@ -4129,18 +4139,18 @@ snapshots: '@effect/build-utils@0.7.8': {} - '@effect/docgen@0.4.4(tsx@4.19.0)(typescript@5.6.2)': + '@effect/docgen@0.4.4(tsx@4.19.1)(typescript@5.6.2)': dependencies: '@effect/markdown-toc': 0.1.0 doctrine: 3.0.0 glob: 10.4.5 prettier: 3.3.3 - tsx: 4.19.0 + tsx: 4.19.1 typescript: 5.6.2 - '@effect/dtslint@0.1.0(typescript@5.6.2)': + '@effect/dtslint@0.1.1(typescript@5.6.2)': dependencies: - fs-extra: 11.1.1 + fs-extra: 11.2.0 tslint: 6.1.3(typescript@5.6.2) typescript: 5.6.2 @@ -4167,24 +4177,24 @@ snapshots: repeat-string: 1.6.1 strip-color: 0.1.0 - '@effect/platform-bun@0.44.0(@effect/platform@0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2))(effect@3.7.2)': + '@effect/platform-bun@0.45.1(@effect/platform@0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0))(effect@3.8.0)': dependencies: - '@effect/platform': 0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2) - '@effect/platform-node-shared': 0.14.0(@effect/platform@0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2))(effect@3.7.2) - effect: 3.7.2 + '@effect/platform': 0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0) + '@effect/platform-node-shared': 0.15.1(@effect/platform@0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0))(effect@3.8.0) + effect: 3.8.0 - '@effect/platform-node-shared@0.14.0(@effect/platform@0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2))(effect@3.7.2)': + '@effect/platform-node-shared@0.15.1(@effect/platform@0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0))(effect@3.8.0)': dependencies: - '@effect/platform': 0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2) + '@effect/platform': 0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0) '@parcel/watcher': 2.4.1 - effect: 3.7.2 + effect: 3.8.0 multipasta: 0.2.5 - '@effect/platform-node@0.59.0(@effect/platform@0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2))(effect@3.7.2)': + '@effect/platform-node@0.60.1(@effect/platform@0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0))(effect@3.8.0)': dependencies: - '@effect/platform': 0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2) - '@effect/platform-node-shared': 0.14.0(@effect/platform@0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2))(effect@3.7.2) - effect: 3.7.2 + '@effect/platform': 0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0) + '@effect/platform-node-shared': 0.15.1(@effect/platform@0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0))(effect@3.8.0) + effect: 3.8.0 mime: 3.0.0 undici: 6.19.8 ws: 8.18.0 @@ -4192,22 +4202,22 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform@0.64.0(@effect/schema@0.72.3(effect@3.7.2))(effect@3.7.2)': + '@effect/platform@0.65.1(@effect/schema@0.73.0(effect@3.8.0))(effect@3.8.0)': dependencies: - '@effect/schema': 0.72.3(effect@3.7.2) - effect: 3.7.2 + '@effect/schema': 0.73.0(effect@3.8.0) + effect: 3.8.0 find-my-way-ts: 0.1.5 multipasta: 0.2.5 - '@effect/schema@0.72.3(effect@3.7.2)': + '@effect/schema@0.73.0(effect@3.8.0)': dependencies: - effect: 3.7.2 + effect: 3.8.0 fast-check: 3.22.0 - '@effect/vitest@0.9.2(effect@3.7.2)(vitest@2.0.5(@types/node@22.5.4))': + '@effect/vitest@0.10.0(effect@3.8.0)(vitest@2.1.1(@types/node@22.5.5))': dependencies: - effect: 3.7.2 - vitest: 2.0.5(@types/node@22.5.4) + effect: 3.8.0 + vitest: 2.1.1(@types/node@22.5.5) '@esbuild/aix-ppc64@0.21.5': optional: true @@ -4411,7 +4421,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -4530,52 +4540,52 @@ snapshots: '@pnpm/deps.graph-sequencer@1.0.0': {} - '@rollup/rollup-android-arm-eabi@4.19.1': + '@rollup/rollup-android-arm-eabi@4.21.3': optional: true - '@rollup/rollup-android-arm64@4.19.1': + '@rollup/rollup-android-arm64@4.21.3': optional: true - '@rollup/rollup-darwin-arm64@4.19.1': + '@rollup/rollup-darwin-arm64@4.21.3': optional: true - '@rollup/rollup-darwin-x64@4.19.1': + '@rollup/rollup-darwin-x64@4.21.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.19.1': + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.19.1': + '@rollup/rollup-linux-arm-musleabihf@4.21.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.19.1': + '@rollup/rollup-linux-arm64-gnu@4.21.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.19.1': + '@rollup/rollup-linux-arm64-musl@4.21.3': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.19.1': + '@rollup/rollup-linux-riscv64-gnu@4.21.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.19.1': + '@rollup/rollup-linux-s390x-gnu@4.21.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.19.1': + '@rollup/rollup-linux-x64-gnu@4.21.3': optional: true - '@rollup/rollup-linux-x64-musl@4.19.1': + '@rollup/rollup-linux-x64-musl@4.21.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.19.1': + '@rollup/rollup-win32-arm64-msvc@4.21.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.19.1': + '@rollup/rollup-win32-ia32-msvc@4.21.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.19.1': + '@rollup/rollup-win32-x64-msvc@4.21.3': optional: true '@rtsao/scc@1.1.0': {} @@ -4609,7 +4619,7 @@ snapshots: '@types/glob@7.1.3': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.5.4 + '@types/node': 22.5.5 '@types/istanbul-lib-coverage@2.0.6': {} @@ -4641,7 +4651,7 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.5.4': + '@types/node@22.5.5': dependencies: undici-types: 6.19.8 @@ -4804,54 +4814,61 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@22.5.4))': + '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@22.5.5))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.6 + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magic-string: 0.30.11 - magicast: 0.3.4 + magicast: 0.3.5 std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.0.5(@types/node@22.5.4) + vitest: 2.1.1(@types/node@22.5.5) transitivePeerDependencies: - supports-color - '@vitest/expect@2.0.5': + '@vitest/expect@2.1.1': dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/pretty-format@2.0.5': + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@22.5.5))': + dependencies: + '@vitest/spy': 2.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.5(@types/node@22.5.5) + + '@vitest/pretty-format@2.1.1': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.0.5': + '@vitest/runner@2.1.1': dependencies: - '@vitest/utils': 2.0.5 + '@vitest/utils': 2.1.1 pathe: 1.1.2 - '@vitest/snapshot@2.0.5': + '@vitest/snapshot@2.1.1': dependencies: - '@vitest/pretty-format': 2.0.5 + '@vitest/pretty-format': 2.1.1 magic-string: 0.30.11 pathe: 1.1.2 - '@vitest/spy@2.0.5': + '@vitest/spy@2.1.1': dependencies: - tinyspy: 3.0.0 + tinyspy: 3.0.2 - '@vitest/utils@2.0.5': + '@vitest/utils@2.1.1': dependencies: - '@vitest/pretty-format': 2.0.5 - estree-walker: 3.0.3 + '@vitest/pretty-format': 2.1.1 loupe: 3.1.1 tinyrainbow: 1.2.0 @@ -5330,7 +5347,7 @@ snapshots: eastasianwidth@0.2.0: {} - effect@3.7.2: {} + effect@3.8.0: {} electron-to-chromium@1.5.3: {} @@ -5704,18 +5721,6 @@ snapshots: esutils@2.0.3: {} - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - expand-range@1.8.2: dependencies: fill-range: 2.2.4 @@ -5827,7 +5832,7 @@ snapshots: fp-ts@2.16.6: {} - fs-extra@11.1.1: + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -5882,8 +5887,6 @@ snapshots: get-own-enumerable-property-symbols@3.0.2: {} - get-stream@8.0.1: {} - get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 @@ -5894,6 +5897,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6002,8 +6009,6 @@ snapshots: human-id@1.0.2: {} - human-signals@5.0.0: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -6150,8 +6155,6 @@ snapshots: dependencies: call-bind: 1.0.7 - is-stream@3.0.0: {} - is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -6203,7 +6206,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.6 + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -6256,7 +6259,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.5.4 + '@types/node': 22.5.5 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -6401,11 +6404,11 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magicast@0.3.4: + magicast@0.3.5: dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 - source-map-js: 1.2.0 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + source-map-js: 1.2.1 make-dir@2.1.0: dependencies: @@ -6432,8 +6435,6 @@ snapshots: mdast-util-to-string@2.0.0: {} - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromark@2.11.4: @@ -6457,8 +6458,6 @@ snapshots: mimic-fn@2.1.0: {} - mimic-fn@4.0.0: {} - minimatch@10.0.1: dependencies: brace-expansion: 2.0.1 @@ -6536,10 +6535,6 @@ snapshots: normalize-path@3.0.0: optional: true - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - object-inspect@1.13.2: {} object-keys@1.1.1: {} @@ -6582,10 +6577,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - openapi-types@12.1.3: {} optionator@0.9.3: @@ -6669,8 +6660,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-scurry@1.11.1: @@ -6708,17 +6697,17 @@ snapshots: postcss: 8.4.41 quote-unquote: 1.0.0 - postcss@8.4.40: + postcss@8.4.41: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - postcss@8.4.41: + postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 precinct@12.1.2: dependencies: @@ -6885,26 +6874,26 @@ snapshots: glob: 11.0.0 package-json-from-dist: 1.0.0 - rollup@4.19.1: + rollup@4.21.3: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.19.1 - '@rollup/rollup-android-arm64': 4.19.1 - '@rollup/rollup-darwin-arm64': 4.19.1 - '@rollup/rollup-darwin-x64': 4.19.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.19.1 - '@rollup/rollup-linux-arm-musleabihf': 4.19.1 - '@rollup/rollup-linux-arm64-gnu': 4.19.1 - '@rollup/rollup-linux-arm64-musl': 4.19.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.19.1 - '@rollup/rollup-linux-riscv64-gnu': 4.19.1 - '@rollup/rollup-linux-s390x-gnu': 4.19.1 - '@rollup/rollup-linux-x64-gnu': 4.19.1 - '@rollup/rollup-linux-x64-musl': 4.19.1 - '@rollup/rollup-win32-arm64-msvc': 4.19.1 - '@rollup/rollup-win32-ia32-msvc': 4.19.1 - '@rollup/rollup-win32-x64-msvc': 4.19.1 + '@rollup/rollup-android-arm-eabi': 4.21.3 + '@rollup/rollup-android-arm64': 4.21.3 + '@rollup/rollup-darwin-arm64': 4.21.3 + '@rollup/rollup-darwin-x64': 4.21.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 + '@rollup/rollup-linux-arm-musleabihf': 4.21.3 + '@rollup/rollup-linux-arm64-gnu': 4.21.3 + '@rollup/rollup-linux-arm64-musl': 4.21.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 + '@rollup/rollup-linux-riscv64-gnu': 4.21.3 + '@rollup/rollup-linux-s390x-gnu': 4.21.3 + '@rollup/rollup-linux-x64-gnu': 4.21.3 + '@rollup/rollup-linux-x64-musl': 4.21.3 + '@rollup/rollup-win32-arm64-msvc': 4.21.3 + '@rollup/rollup-win32-ia32-msvc': 4.21.3 + '@rollup/rollup-win32-x64-msvc': 4.21.3 fsevents: 2.3.3 run-parallel@1.2.0: @@ -6993,6 +6982,8 @@ snapshots: source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map@0.5.7: {} source-map@0.6.1: {} @@ -7089,8 +7080,6 @@ snapshots: strip-color@0.1.0: {} - strip-final-newline@3.0.0: {} - strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -7128,13 +7117,15 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - tinybench@2.8.0: {} + tinybench@2.9.0: {} + + tinyexec@0.3.0: {} - tinypool@1.0.0: {} + tinypool@1.0.1: {} tinyrainbow@1.2.0: {} - tinyspy@3.0.0: {} + tinyspy@3.0.2: {} tmp@0.0.33: dependencies: @@ -7182,7 +7173,7 @@ snapshots: tslint@6.1.3(typescript@5.6.2): dependencies: - '@babel/code-frame': 7.24.6 + '@babel/code-frame': 7.24.7 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 @@ -7202,10 +7193,10 @@ snapshots: tslib: 1.14.1 typescript: 5.6.2 - tsx@4.19.0: + tsx@4.19.1: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.8.0 + get-tsconfig: 4.8.1 optionalDependencies: fsevents: 2.3.3 @@ -7291,59 +7282,61 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@2.0.5(@types/node@22.5.4): + vite-node@2.1.1(@types/node@22.5.5): dependencies: cac: 6.7.14 - debug: 4.3.6 + debug: 4.3.7 pathe: 1.1.2 - tinyrainbow: 1.2.0 - vite: 5.3.5(@types/node@22.5.4) + vite: 5.4.5(@types/node@22.5.5) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite@5.3.5(@types/node@22.5.4): + vite@5.4.5(@types/node@22.5.5): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 - rollup: 4.19.1 + postcss: 8.4.47 + rollup: 4.21.3 optionalDependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 fsevents: 2.3.3 - vitest@2.0.5(@types/node@22.5.4): + vitest@2.1.1(@types/node@22.5.5): dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.5 - '@vitest/pretty-format': 2.0.5 - '@vitest/runner': 2.0.5 - '@vitest/snapshot': 2.0.5 - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@22.5.5)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 chai: 5.1.1 - debug: 4.3.6 - execa: 8.0.1 + debug: 4.3.7 magic-string: 0.30.11 pathe: 1.1.2 std-env: 3.7.0 - tinybench: 2.8.0 - tinypool: 1.0.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.3.5(@types/node@22.5.4) - vite-node: 2.0.5(@types/node@22.5.4) + vite: 5.4.5(@types/node@22.5.5) + vite-node: 2.1.1(@types/node@22.5.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.5.4 + '@types/node': 22.5.5 transitivePeerDependencies: - less - lightningcss + - msw - sass + - sass-embedded - stylus - sugarss - supports-color