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 +5 -4
- package/dist/runtime/client/models/SubscriptionStatus.d.ts +7 -6
- package/dist/runtime/client/models/SubscriptionStatus.js +6 -7
- package/dist/runtime/client/services/getLinkFetch.js +2 -1
- package/dist/runtime/client/services/useProcedureMutation.js +1 -1
- package/dist/runtime/client/services/useProcedureSubscription.js +14 -12
- package/dist/runtime/server/createTRPCEventHandler.d.ts +2 -2
- package/dist/runtime/server/createTRPCEventHandler.js +20 -6
- package/dist/runtime/server/models/TRPCEventHandlerOptions.d.ts +1 -1
- package/dist/services/getWebSocketHandlerTemplate.js +3 -3
- package/dist/services/getWebSocketHooksTypeTemplate.js +1 -1
- package/package.json +18 -18
- package/dist/runtime/server/services/getRequestSignal.d.ts +0 -4
- package/dist/runtime/server/services/getRequestSignal.js +0 -11
- package/dist/runtime/server/services/toRequest.d.ts +0 -4
- package/dist/runtime/server/services/toRequest.js +0 -20
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: ">=
|
|
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,
|
|
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.
|
|
42
|
-
...nuxt.options.nitro.
|
|
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
|
|
3
|
-
Connecting
|
|
4
|
-
Error
|
|
5
|
-
Idle
|
|
6
|
-
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
|
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:
|
|
7
|
-
idle:
|
|
8
|
-
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(
|
|
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 =
|
|
18
|
+
status.value = SubscriptionStatus.Idle;
|
|
19
19
|
};
|
|
20
20
|
const subscribe = () => {
|
|
21
21
|
unsubscribable?.unsubscribe();
|
|
22
22
|
error.value = void 0;
|
|
23
|
-
status.value =
|
|
23
|
+
status.value = SubscriptionStatus.Connecting;
|
|
24
24
|
unsubscribable = client.subscription(path, toValue(input), {
|
|
25
25
|
...options,
|
|
26
26
|
onComplete: () => {
|
|
27
|
-
status.value =
|
|
27
|
+
status.value = SubscriptionStatus.Idle;
|
|
28
28
|
options.onComplete?.();
|
|
29
29
|
},
|
|
30
30
|
onConnectionStateChange: (state) => {
|
|
31
|
-
status.value = state.error ?
|
|
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 =
|
|
40
|
+
status.value = SubscriptionStatus.Error;
|
|
41
41
|
options.onError?.(newError);
|
|
42
42
|
},
|
|
43
43
|
onStarted: (startedOptions) => {
|
|
44
|
-
status.value =
|
|
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(
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
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:
|
|
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 {
|
|
6
|
-
`import {
|
|
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
|
|
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 "
|
|
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
|
+
"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": "
|
|
86
|
-
"@nuxt/kit": "
|
|
87
|
-
"@nuxt/schema": "
|
|
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": "
|
|
94
|
-
"@esposter/shared-node": "
|
|
95
|
-
"@nuxt/nitro-server": "
|
|
96
|
-
"@nuxt/test-utils": "^4.3.
|
|
97
|
-
"@types/node": "^26.6.
|
|
98
|
-
"happy-dom": "^
|
|
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.
|
|
102
|
-
"vitest": "^5.0.
|
|
103
|
-
"zod": "^4.6.
|
|
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.
|
|
109
|
-
"
|
|
110
|
-
"nuxt": "
|
|
111
|
-
"vue": "^3.5.
|
|
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": "
|
|
113
|
+
"gitHead": "68de4c22fa7591bf6f6cc0fab2c9a906d8c4d71a"
|
|
114
114
|
}
|
|
@@ -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,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 };
|