trpc-nuxt-module 3.9.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ const WEBSOCKET_HANDLER_FILENAME = `#${MODULE_NAME}/webSocketHandler.mjs`;
16
16
  const trpcNuxtModule = defineNuxtModule({
17
17
  defaults: { endpoint: DEFAULT_ENDPOINT },
18
18
  meta: {
19
- compatibility: { nuxt: ">=4.0.0" },
19
+ compatibility: { nuxt: ">=5.0.0-0" },
20
20
  configKey: "trpc",
21
21
  name: MODULE_NAME
22
22
  },
@@ -29,17 +29,18 @@ const trpcNuxtModule = defineNuxtModule({
29
29
  ...createContext,
30
30
  from: await resolvePath(createContext.from)
31
31
  };
32
+ const routedEndpoint = `${nuxt.options.app.baseURL.replace(/\/$/u, "")}${endpoint}`;
32
33
  addServerTemplate({
33
34
  filename: EVENT_HANDLER_FILENAME,
34
- getContents: () => getEventHandlerTemplate(resolvedRouter, endpoint, resolvedCreateContext)
35
+ getContents: () => getEventHandlerTemplate(resolvedRouter, routedEndpoint, resolvedCreateContext)
35
36
  });
36
37
  addServerHandler({
37
38
  handler: EVENT_HANDLER_FILENAME,
38
39
  route: `${endpoint}/**`
39
40
  });
40
41
  if (webSocket) {
41
- nuxt.options.nitro.experimental = {
42
- ...nuxt.options.nitro.experimental,
42
+ nuxt.options.nitro.features = {
43
+ ...nuxt.options.nitro.features,
43
44
  websocket: true
44
45
  };
45
46
  addServerTemplate({
@@ -1,8 +1,9 @@
1
1
  //#region src/runtime/client/models/SubscriptionStatus.d.ts
2
- export declare enum SubscriptionStatus {
3
- Connecting = "connecting",
4
- Error = "error",
5
- Idle = "idle",
6
- Pending = "pending"
7
- }
2
+ export declare const SubscriptionStatus: {
3
+ readonly Connecting: "connecting";
4
+ readonly Error: "error";
5
+ readonly Idle: "idle";
6
+ readonly Pending: "pending";
7
+ };
8
+ export type SubscriptionStatus = (typeof SubscriptionStatus)[keyof typeof SubscriptionStatus];
8
9
  //#endregion
@@ -1,10 +1,9 @@
1
1
  //#region src/runtime/client/models/SubscriptionStatus.ts
2
- let SubscriptionStatus = /* @__PURE__ */ function(SubscriptionStatus) {
3
- SubscriptionStatus["Connecting"] = "connecting";
4
- SubscriptionStatus["Error"] = "error";
5
- SubscriptionStatus["Idle"] = "idle";
6
- SubscriptionStatus["Pending"] = "pending";
7
- return SubscriptionStatus;
8
- }({});
2
+ const SubscriptionStatus = {
3
+ Connecting: "connecting",
4
+ Error: "error",
5
+ Idle: "idle",
6
+ Pending: "pending"
7
+ };
9
8
  //#endregion
10
9
  export { SubscriptionStatus };
@@ -1,10 +1,11 @@
1
1
  import { useRequestEvent } from "nuxt/app";
2
2
  import { checkIsServer } from "@esposter/shared";
3
+ import { fetchWithEvent } from "nitro/h3";
3
4
  //#region src/runtime/client/services/getLinkFetch.ts
4
5
  const getLinkFetch = () => {
5
6
  if (checkIsServer()) {
6
7
  const event = useRequestEvent();
7
- if (event) return event.fetch;
8
+ if (event) return (url, options) => fetchWithEvent(event, url, options);
8
9
  }
9
10
  return (input, init) => fetch(new URL(input, window.location.href), init);
10
11
  };
@@ -16,7 +16,7 @@ const useProcedureMutation = (client, path, { mutationKey = getProcedureKey(path
16
16
  mutationInput = input;
17
17
  await asyncData.execute();
18
18
  if (asyncData.error.value) throw asyncData.error.value;
19
- return asyncData.data.value;
19
+ else return asyncData.data.value;
20
20
  } });
21
21
  };
22
22
  //#endregion
@@ -1,34 +1,34 @@
1
- import "../models/SubscriptionStatus.js";
1
+ import { SubscriptionStatus } from "../models/SubscriptionStatus.js";
2
2
  import { getCurrentScope, onScopeDispose, shallowRef, toValue, watch } from "vue";
3
3
  import { checkIsServer } from "@esposter/shared";
4
4
  //#region src/runtime/client/services/useProcedureSubscription.ts
5
5
  const ConnectionStateSubscriptionStatusMap = {
6
- connecting: "connecting",
7
- idle: "idle",
8
- pending: "pending"
6
+ connecting: SubscriptionStatus.Connecting,
7
+ idle: SubscriptionStatus.Idle,
8
+ pending: SubscriptionStatus.Pending
9
9
  };
10
10
  const useProcedureSubscription = (client, path, input, { enabled = true, ...options } = {}) => {
11
11
  const data = shallowRef();
12
12
  const error = shallowRef();
13
- const status = shallowRef("idle");
13
+ const status = shallowRef(SubscriptionStatus.Idle);
14
14
  let unsubscribable;
15
15
  const unsubscribe = () => {
16
16
  unsubscribable?.unsubscribe();
17
17
  unsubscribable = void 0;
18
- status.value = "idle";
18
+ status.value = SubscriptionStatus.Idle;
19
19
  };
20
20
  const subscribe = () => {
21
21
  unsubscribable?.unsubscribe();
22
22
  error.value = void 0;
23
- status.value = "connecting";
23
+ status.value = SubscriptionStatus.Connecting;
24
24
  unsubscribable = client.subscription(path, toValue(input), {
25
25
  ...options,
26
26
  onComplete: () => {
27
- status.value = "idle";
27
+ status.value = SubscriptionStatus.Idle;
28
28
  options.onComplete?.();
29
29
  },
30
30
  onConnectionStateChange: (state) => {
31
- status.value = state.error ? "error" : ConnectionStateSubscriptionStatusMap[state.state];
31
+ status.value = state.error ? SubscriptionStatus.Error : ConnectionStateSubscriptionStatusMap[state.state];
32
32
  options.onConnectionStateChange?.(state);
33
33
  },
34
34
  onData: (value) => {
@@ -37,11 +37,11 @@ const useProcedureSubscription = (client, path, input, { enabled = true, ...opti
37
37
  },
38
38
  onError: (newError) => {
39
39
  error.value = newError;
40
- status.value = "error";
40
+ status.value = SubscriptionStatus.Error;
41
41
  options.onError?.(newError);
42
42
  },
43
43
  onStarted: (startedOptions) => {
44
- status.value = "pending";
44
+ status.value = SubscriptionStatus.Pending;
45
45
  options.onStarted?.(startedOptions);
46
46
  }
47
47
  });
@@ -50,7 +50,9 @@ const useProcedureSubscription = (client, path, input, { enabled = true, ...opti
50
50
  if (isEnabled) subscribe();
51
51
  else unsubscribe();
52
52
  }, { immediate: true });
53
- if (getCurrentScope()) onScopeDispose(unsubscribe);
53
+ if (getCurrentScope()) onScopeDispose(() => {
54
+ unsubscribe();
55
+ });
54
56
  return {
55
57
  data,
56
58
  error,
@@ -1,6 +1,6 @@
1
1
  import { TRPCEventHandlerOptions } from "./models/TRPCEventHandlerOptions.js";
2
2
  import { AnyTRPCRouter } from "@trpc/server";
3
- import { EventHandler, EventHandlerRequest } from "h3";
3
+ import { EventHandler } from "nitro/h3";
4
4
  //#region src/runtime/server/createTRPCEventHandler.d.ts
5
- export declare const createTRPCEventHandler: <TRouter extends AnyTRPCRouter>({ createContext, endpoint, ...options }: TRPCEventHandlerOptions<TRouter>) => EventHandler<EventHandlerRequest, Promise<Response | undefined>>;
5
+ export declare const createTRPCEventHandler: <TRouter extends AnyTRPCRouter>({ createContext, endpoint, ...options }: TRPCEventHandlerOptions<TRouter>) => EventHandler;
6
6
  //#endregion
@@ -1,17 +1,31 @@
1
1
  import { DEFAULT_ENDPOINT } from "../constants.js";
2
- import { toRequest } from "./services/toRequest.js";
3
- import { defineEventHandler } from "h3";
2
+ import { defineHandler } from "nitro/h3";
4
3
  import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
5
4
  //#region src/runtime/server/createTRPCEventHandler.ts
6
- const createTRPCEventHandler = ({ createContext, endpoint = DEFAULT_ENDPOINT, ...options }) => defineEventHandler(async (event) => {
5
+ const NULL_BODY_STATUSES = /* @__PURE__ */ new Set([
6
+ 204,
7
+ 205,
8
+ 304
9
+ ]);
10
+ const createTRPCEventHandler = ({ createContext, endpoint = DEFAULT_ENDPOINT, ...options }) => defineHandler(async (event) => {
7
11
  const response = await fetchRequestHandler({
8
12
  ...options,
9
13
  createContext: createContext && ((fetchCreateContextOptions) => createContext(event, fetchCreateContextOptions)),
10
14
  endpoint,
11
- req: await toRequest(event)
15
+ req: event.req
16
+ });
17
+ const { status } = event.res;
18
+ if (!status) return response;
19
+ else if (!NULL_BODY_STATUSES.has(status)) return new Response(response.body, {
20
+ headers: response.headers,
21
+ status
22
+ });
23
+ const headers = new Headers(response.headers);
24
+ headers.delete("content-length");
25
+ return new Response(null, {
26
+ headers,
27
+ status
12
28
  });
13
- if (event.handled) return void 0;
14
- return response;
15
29
  });
16
30
  //#endregion
17
31
  export { createTRPCEventHandler };
@@ -1,5 +1,5 @@
1
1
  import { AnyTRPCRouter, inferRouterContext } from "@trpc/server";
2
- import { H3Event } from "h3";
2
+ import { H3Event } from "nitro/h3";
3
3
  import { FetchCreateContextFnOptions } from "@trpc/server/adapters/fetch";
4
4
  import { Promisable } from "type-fest";
5
5
  import { HTTPBaseHandlerOptions } from "@trpc/server/http";
@@ -2,13 +2,13 @@ import { MODULE_NAME } from "../runtime/constants.js";
2
2
  import { getImportStatement } from "./getImportStatement.js";
3
3
  //#region src/services/getWebSocketHandlerTemplate.ts
4
4
  const getWebSocketHandlerTemplate = (router, { keepAlive }, createContext) => [
5
- `import { defineWebSocketHandler } from "h3";`,
6
- `import { useNitroApp } from "nitropack/runtime";`,
5
+ `import { useNitroHooks } from "nitro/app";`,
6
+ `import { defineWebSocketHandler } from "nitro/h3";`,
7
7
  `import { WEBSOCKET_CLOSE_HOOK, WEBSOCKET_OPEN_HOOK } from "${MODULE_NAME}/runtime/constants";`,
8
8
  `import { createTRPCWebSocketHandler } from "${MODULE_NAME}/runtime/server/createTRPCWebSocketHandler";`,
9
9
  getImportStatement(router, "router"),
10
10
  createContext ? getImportStatement(createContext, "createContext") : "const createContext = () => ({});",
11
- `const { hooks: nitroHooks } = useNitroApp();`,
11
+ `const nitroHooks = useNitroHooks();`,
12
12
  `const { broadcastReconnectNotification, hooks } = createTRPCWebSocketHandler({`,
13
13
  ` createContext,`,
14
14
  ` keepAlive: ${JSON.stringify(keepAlive)},`,
@@ -5,7 +5,7 @@ const getWebSocketHooksTypeTemplate = ({ from, name }) => {
5
5
  return [
6
6
  `import type { inferRouterContext } from "@trpc/server";`,
7
7
  `import type { TRPCWebSocketConnection } from "${MODULE_NAME}/runtime/server/models/TRPCWebSocketConnection";`,
8
- `declare module "nitropack/types" {`,
8
+ `declare module "nitro/types" {`,
9
9
  ` interface NitroRuntimeHooks {`,
10
10
  ` ${JSON.stringify(WEBSOCKET_CLOSE_HOOK)}: (connection: ${connectionType}) => Promise<void> | void;`,
11
11
  ` ${JSON.stringify(WEBSOCKET_OPEN_HOOK)}: (connection: ${connectionType}) => Promise<void> | void;`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trpc-nuxt-module",
3
- "version": "3.9.0",
3
+ "version": "4.1.0",
4
4
  "description": "tRPC for Nuxt — a Nuxt module that registers your router's HTTP and WebSocket handlers, fetches through the request event during SSR, and decorates the typed client with useQuery, useMutation and useSubscription over useAsyncData.",
5
5
  "keywords": [
6
6
  "nitro",
@@ -82,33 +82,33 @@
82
82
  "typecheck": "tsc"
83
83
  },
84
84
  "dependencies": {
85
- "@esposter/shared": "3.9.0",
86
- "@nuxt/kit": "^4.5.2",
87
- "@nuxt/schema": "^4.5.2",
85
+ "@esposter/shared": "4.1.0",
86
+ "@nuxt/kit": "npm:@nuxt/kit-nightly@5x",
87
+ "@nuxt/schema": "npm:@nuxt/schema-nightly@5x",
88
88
  "ohash": "^2.0.12",
89
89
  "type-fest": "^5.10.0"
90
90
  },
91
91
  "devDependencies": {
92
92
  "@arethetypeswrong/core": "^0.18.5",
93
- "@esposter/configuration": "3.9.0",
94
- "@esposter/shared-node": "3.9.0",
95
- "@nuxt/nitro-server": "^4.5.2",
96
- "@nuxt/test-utils": "^4.3.2",
97
- "@types/node": "^26.6.4",
98
- "happy-dom": "^20.14.5",
93
+ "@esposter/configuration": "4.1.0",
94
+ "@esposter/shared-node": "4.1.0",
95
+ "@nuxt/nitro-server": "npm:@nuxt/nitro-server-nightly@5x",
96
+ "@nuxt/test-utils": "^4.3.3",
97
+ "@types/node": "^26.6.5",
98
+ "happy-dom": "^21.0.1",
99
99
  "publint": "^0.3.25",
100
100
  "superjson": "^2.2.6",
101
- "tsdown": "^0.23.0",
102
- "vitest": "^5.0.3",
103
- "zod": "^4.6.5"
101
+ "tsdown": "^0.23.1",
102
+ "vitest": "^5.0.4",
103
+ "zod": "^4.6.7"
104
104
  },
105
105
  "peerDependencies": {
106
106
  "@trpc/client": "^11.19.0",
107
107
  "@trpc/server": "^11.19.0",
108
- "crossws": "^0.4.12",
109
- "h3": "^1.15.11",
110
- "nuxt": "^4.5.2",
111
- "vue": "^3.5.43"
108
+ "crossws": "^0.4.15",
109
+ "nitro": "npm:nitro-nightly@latest",
110
+ "nuxt": "npm:nuxt-nightly@5x",
111
+ "vue": "^3.5.44"
112
112
  },
113
- "gitHead": "f9f6208c35e6cff4ed33910623c798cd88f09301"
113
+ "gitHead": "68de4c22fa7591bf6f6cc0fab2c9a906d8c4d71a"
114
114
  }
@@ -1,4 +0,0 @@
1
- import { H3Event } from "h3";
2
- //#region src/runtime/server/services/getRequestSignal.d.ts
3
- export declare const getRequestSignal: (event: H3Event) => AbortSignal;
4
- //#endregion
@@ -1,11 +0,0 @@
1
- //#region src/runtime/server/services/getRequestSignal.ts
2
- const getRequestSignal = (event) => {
3
- const abortController = new AbortController();
4
- const { res } = event.node;
5
- res.once("close", () => {
6
- if (!res.writableFinished) abortController.abort();
7
- });
8
- return abortController.signal;
9
- };
10
- //#endregion
11
- export { getRequestSignal };
@@ -1,4 +0,0 @@
1
- import { H3Event } from "h3";
2
- //#region src/runtime/server/services/toRequest.d.ts
3
- export declare const toRequest: (event: H3Event) => Promise<Request>;
4
- //#endregion
@@ -1,20 +0,0 @@
1
- import { getRequestSignal } from "./getRequestSignal.js";
2
- import { getRequestHost, getRequestProtocol, isMethod, readRawBody } from "h3";
3
- //#region src/runtime/server/services/toRequest.ts
4
- const PAYLOAD_METHODS = [
5
- "DELETE",
6
- "PATCH",
7
- "POST",
8
- "PUT"
9
- ];
10
- const toRequest = async (event) => {
11
- const body = isMethod(event, PAYLOAD_METHODS) ? await readRawBody(event, false) : void 0;
12
- return new Request(`${getRequestProtocol(event)}://${getRequestHost(event)}${event.path}`, {
13
- body: body && new Uint8Array(body),
14
- headers: event.headers,
15
- method: event.method,
16
- signal: getRequestSignal(event)
17
- });
18
- };
19
- //#endregion
20
- export { toRequest };