@pluv/types 0.17.2 → 0.18.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @pluv/types@0.17.2 build /home/runner/work/pluv/pluv/packages/types
2
+ > @pluv/types@0.18.0 build /home/runner/work/pluv/pluv/packages/types
3
3
  > tsup src/index.ts --format esm,cjs --dts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -9,10 +9,10 @@
9
9
  ESM Build start
10
10
  CJS Build start
11
11
  ESM dist/index.mjs 0 B
12
- ESM ⚡️ Build success in 35ms
12
+ ESM ⚡️ Build success in 27ms
13
13
  CJS dist/index.js 754.00 B
14
- CJS ⚡️ Build success in 38ms
14
+ CJS ⚡️ Build success in 27ms
15
15
  DTS Build start
16
- DTS ⚡️ Build success in 998ms
17
- DTS dist/index.d.mts 7.36 KB
18
- DTS dist/index.d.ts 7.36 KB
16
+ DTS ⚡️ Build success in 889ms
17
+ DTS dist/index.d.mts 7.31 KB
18
+ DTS dist/index.d.ts 7.31 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,103 @@
1
1
  # @pluv/types
2
2
 
3
+ ## 0.18.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 99b5ca9: ## Breaking Changes
8
+
9
+ - `@pluv/io` has been updated to introduce `PluvProcedure`, `PluvRouter` and `PluvServer`. This change is intended to improve the ergonomics of declaring events and simplifying inferences of event types.
10
+
11
+ ### Before:
12
+
13
+ ```ts
14
+ // backend/io.ts
15
+
16
+ import { createIO } from "@pluv/io";
17
+ import { createPluvHandler, platformNode } from "@pluv/platform-node";
18
+ import { z } from "zod";
19
+
20
+ export const io = createIO({
21
+ platform: platformNode(),
22
+ })
23
+ .event("SEND_MESSAGE", {
24
+ input: z.object({ message: z.string() }),
25
+ resolver: ({ message }) => ({ RECEIVE_MESSAGE: { message } }),
26
+ })
27
+ .event("DOUBLE_VALUE", {
28
+ input: z.object({ value: z.number() }),
29
+ resolver: ({ value }) => ({ VALUE_DOUBLED: { value: value * 2 } }),
30
+ });
31
+
32
+ const Pluv = createPluvHandler({
33
+ io,
34
+ /* ... */
35
+ });
36
+ ```
37
+
38
+ ```ts
39
+ // frontend/pluv.ts
40
+
41
+ import { createClient } from "@pluv/react";
42
+ import type { io } from "../backend/io";
43
+
44
+ const client = createClient<typeof io>({
45
+ /* ... */
46
+ });
47
+ ```
48
+
49
+ ### Now:
50
+
51
+ ```ts
52
+ import { createIO } from "@pluv/io";
53
+ import { createPluvHandler, platformNode } from "@pluv/platform-node";
54
+ import { z } from "zod";
55
+
56
+ const io = createIO({
57
+ platform: platformNode(),
58
+ });
59
+
60
+ const router = io.router({
61
+ SEND_MESSAGE: io.procedure
62
+ .input(z.object({ message: z.string() }))
63
+ .broadcast(({ message }) => ({
64
+ RECEIVE_MESSAGE: { message },
65
+ })),
66
+ DOUBLE_VALUE: io.procedure
67
+ .input(z.object({ value: z.number() }))
68
+ .broadcast(({ value }) => ({
69
+ VALUE_DOUBLED: { value: value * 2 },
70
+ })),
71
+ });
72
+
73
+ export const ioServer = io.server({ router });
74
+
75
+ const Pluv = createPluvHandler({
76
+ io: ioServer, // <- This uses the PluvServer now
77
+ /* ... */
78
+ });
79
+ ```
80
+
81
+ ```ts
82
+ // frontend/pluv.ts
83
+
84
+ import { createClient } from "@pluv/react";
85
+ import type { ioServer } from "../backend/io";
86
+
87
+ // This users the PluvServer type now
88
+ const client = createClient<typeof ioServer>({
89
+ /* ... */
90
+ });
91
+ ```
92
+
93
+ - `PluvRouter` instances can also be merged via the `mergeRouters` method, which effectively performs an `Object.assign` of the events object and returns a new `PluvRouter` with the correct types:
94
+
95
+ ```ts
96
+ const router = io.mergeRouters(router1, router2);
97
+ ```
98
+
99
+ ## 0.17.3
100
+
3
101
  ## 0.17.2
4
102
 
5
103
  ## 0.17.1
package/dist/index.d.mts CHANGED
@@ -12,14 +12,11 @@ type OptionalPropertyNames<T> = {
12
12
  type SpreadProperties<L, R, K extends keyof L & keyof R> = {
13
13
  [P in K]: L[P] | Exclude<R[P], undefined>;
14
14
  };
15
- type Id<T> = T extends infer U ? U extends Constructable ? U : {
15
+ type Id<T> = T extends infer U ? (U extends Constructable ? U : {
16
16
  [K in keyof U]: U[K];
17
- } : never;
17
+ }) : never;
18
18
  type SpreadTwo<L, R> = Id<Pick<L, Exclude<keyof L, keyof R>> & Pick<R, Exclude<keyof R, OptionalPropertyNames<R>>> & Pick<R, Exclude<OptionalPropertyNames<R>, keyof L>> & SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>>;
19
- type Spread<A extends readonly [...any]> = A extends [
20
- infer L,
21
- ...infer R
22
- ] ? SpreadTwo<L, Spread<R>> : unknown;
19
+ type Spread<A extends readonly [...any]> = A extends [infer L, ...infer R] ? SpreadTwo<L, Spread<R>> : unknown;
23
20
  type DeepPartial<T> = {
24
21
  [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : DeepPartial<T[P]>;
25
22
  };
@@ -35,6 +32,7 @@ type Json = JsonPrimitive | Json[] | readonly Json[] | {
35
32
  [key: string]: Json;
36
33
  };
37
34
  type JsonObject = Record<string, Json>;
35
+ type UnionToIntersection<U> = (U extends any ? (arg: U) => any : never) extends (arg: infer I) => void ? I : never;
38
36
 
39
37
  type BaseUser = {
40
38
  id: string;
@@ -107,17 +105,9 @@ type EventRecord<TEvent extends string, TData extends JsonObject> = {
107
105
  [key in `${TEvent}`]: TData;
108
106
  };
109
107
  type GetEventMessage<T extends EventRecord<string, any>, TEvent extends keyof T> = TEvent extends string ? EventMessage<TEvent, T[TEvent]> : never;
110
- type InferEventMessage<TEvents extends EventRecord<string, any> = EventRecord<string, any>, TEvent extends keyof TEvents = keyof TEvents> = {
111
- [P in TEvent]: P extends string ? Id<EventMessage<P, TEvents[P]>> : never;
112
- }[TEvent];
113
108
  type InferIOAuthorize<TIO extends IOLike> = TIO extends IOLike<infer IAuthorize> ? IAuthorize : never;
114
109
  type InferIOAuthorizeRequired<TAuthorize extends IOAuthorize<any, any, any>> = TAuthorize extends IOAuthorize<any, infer IRequired> ? IRequired : never;
115
110
  type InferIOAuthorizeUser<TAuthorize extends IOAuthorize<any, any, any>> = TAuthorize extends IOAuthorize<infer IUser, infer IRequired> ? IRequired extends true ? IUser : IUser | null : never;
116
- type InferIOInput<TIO extends IOLike> = TIO extends IOLike<any, infer IInput> ? IInput : never;
117
- type InferIOOutput<TIO extends IOLike> = TIO extends IOLike<any, any, infer IOutputBroadcast, infer IOutputSelf, infer IOutputSync> ? Spread<[IOutputBroadcast, IOutputSelf, IOutputSync]> : never;
118
- type InferIOOutputBroadcast<TIO extends IOLike> = TIO extends IOLike<any, any, infer IOutput> ? IOutput : never;
119
- type InferIOOutputSelf<TIO extends IOLike> = TIO extends IOLike<any, any, any, infer IOutput> ? IOutput : never;
120
- type InferIOOutputSync<TIO extends IOLike> = TIO extends IOLike<any, any, any, any, infer IOutput> ? IOutput : never;
121
111
  type InputZodLike<TData extends JsonObject> = {
122
112
  _input: TData;
123
113
  parse: (data: unknown) => TData;
@@ -137,20 +127,32 @@ interface IOAuthorizeOptionalEventMessage<TIO extends IOLike> {
137
127
  user: InferIOAuthorizeUser<InferIOAuthorize<TIO>> | null;
138
128
  }
139
129
  type IOAuthorizeRequiredEventMessage<TIO extends IOLike> = NonNilProps<IOAuthorizeOptionalEventMessage<TIO>, "connectionId" | "user">;
140
- type IOEventMessage<TIO extends IOLike, TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>> = Id<{
141
- room: string;
142
- } & InferEventMessage<InferIOOutput<TIO>, TEvent> & (InferEventMessage<InferIOOutput<TIO>, TEvent>["type"] extends "$ERROR" ? IOAuthorizeOptionalEventMessage<TIO> : IOAuthorizeEventMessage<TIO>)>;
143
- interface IOLike<TAuthorize extends IOAuthorize<any, any, any> = IOAuthorize<any, any, any>, TInput extends EventRecord<string, any> = {}, TOutputBroadcast extends EventRecord<string, any> = {}, TOutputSelf extends EventRecord<string, any> = {}, TOutputSync extends EventRecord<string, any> = {}> {
144
- _authorize: TAuthorize | null;
145
- _events: {
146
- [P in keyof TInput]: P extends string ? {
147
- resolver: ((data: TInput[P], ...args: any[]) => MaybePromise<TOutputBroadcast | void>) | {
148
- broadcast?: (data: TInput[P], ...args: any[]) => MaybePromise<TOutputBroadcast | void>;
149
- self?: (data: TInput[P], ...args: any[]) => MaybePromise<TOutputSelf | void>;
150
- sync?: (data: TInput[P], ...args: any[]) => MaybePromise<TOutputSync | void>;
151
- };
152
- } : never;
130
+ type ProcedureLike<TInput extends JsonObject = {}, TOutput extends EventRecord<string, any> = {}> = {
131
+ config: {
132
+ broadcast?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
133
+ input?: InputZodLike<TInput> | null;
134
+ resolver: (data: TInput, ...args: any[]) => MaybePromise<TOutput>;
135
+ self?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
136
+ sync?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
153
137
  };
138
+ };
139
+ interface IORouterLike<TEvents extends Record<string, ProcedureLike<any, any>> = {}> {
140
+ _events: TEvents;
154
141
  }
142
+ interface IOLike<TAuthorize extends IOAuthorize<any, any, any> = IOAuthorize<any, any, any>, TEvents extends Record<string, ProcedureLike<any, any>> = {}> extends IORouterLike<TEvents> {
143
+ _authorize: TAuthorize | null;
144
+ }
145
+ type InferIOInput<TRouter extends IORouterLike<any>> = TRouter extends IORouterLike<infer IEvents> ? {
146
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<infer IInput, any> ? IInput : never;
147
+ } : never;
148
+ type InferIOOutput<TRouter extends IORouterLike<any>> = TRouter extends IORouterLike<infer IEvents> ? UnionToIntersection<{
149
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<any, infer IOutput> ? IOutput : never;
150
+ }[keyof IEvents]> : never;
151
+ type InferEventMessage<TEvents extends EventRecord<string, any> = EventRecord<string, any>, TEvent extends keyof TEvents = keyof TEvents> = {
152
+ [P in TEvent]: P extends string ? Id<EventMessage<P, TEvents[P]>> : never;
153
+ }[TEvent];
154
+ type IOEventMessage<TIO extends IOLike<any>, TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>> = Id<{
155
+ room: string;
156
+ } & InferEventMessage<InferIOOutput<TIO>, TEvent> & (InferEventMessage<InferIOOutput<TIO>, TEvent>["type"] extends "$ERROR" ? IOAuthorizeOptionalEventMessage<TIO> : IOAuthorizeEventMessage<TIO>)>;
155
157
 
156
- export type { BaseClientEventRecord, BaseClientMessage, BaseIOAuthorize, BaseIOAuthorizeEventRecord, BaseIOEventRecord, BaseUser, Constructable, DeepPartial, DeepWriteable, EventMessage, EventRecord, GetEventMessage, IOAuthorize, IOAuthorizeEventMessage, IOAuthorizeOptionalEventMessage, IOAuthorizeRequiredEventMessage, IOEventMessage, IOLike, Id, InferEventMessage, InferIOAuthorize, InferIOAuthorizeRequired, InferIOAuthorizeUser, InferIOInput, InferIOOutput, InferIOOutputBroadcast, InferIOOutputSelf, InferIOOutputSync, InputZodLike, Json, JsonObject, JsonPrimitive, Maybe, MaybePromise, MaybeReadonlyArray, NonNilProps, OptionalProps, Spread, SpreadProperties };
158
+ export type { BaseClientEventRecord, BaseClientMessage, BaseIOAuthorize, BaseIOAuthorizeEventRecord, BaseIOEventRecord, BaseUser, Constructable, DeepPartial, DeepWriteable, EventMessage, EventRecord, GetEventMessage, IOAuthorize, IOAuthorizeEventMessage, IOAuthorizeOptionalEventMessage, IOAuthorizeRequiredEventMessage, IOEventMessage, IOLike, IORouterLike, Id, InferEventMessage, InferIOAuthorize, InferIOAuthorizeRequired, InferIOAuthorizeUser, InferIOInput, InferIOOutput, InputZodLike, Json, JsonObject, JsonPrimitive, Maybe, MaybePromise, MaybeReadonlyArray, NonNilProps, OptionalProps, ProcedureLike, Spread, SpreadProperties };
package/dist/index.d.ts CHANGED
@@ -12,14 +12,11 @@ type OptionalPropertyNames<T> = {
12
12
  type SpreadProperties<L, R, K extends keyof L & keyof R> = {
13
13
  [P in K]: L[P] | Exclude<R[P], undefined>;
14
14
  };
15
- type Id<T> = T extends infer U ? U extends Constructable ? U : {
15
+ type Id<T> = T extends infer U ? (U extends Constructable ? U : {
16
16
  [K in keyof U]: U[K];
17
- } : never;
17
+ }) : never;
18
18
  type SpreadTwo<L, R> = Id<Pick<L, Exclude<keyof L, keyof R>> & Pick<R, Exclude<keyof R, OptionalPropertyNames<R>>> & Pick<R, Exclude<OptionalPropertyNames<R>, keyof L>> & SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>>;
19
- type Spread<A extends readonly [...any]> = A extends [
20
- infer L,
21
- ...infer R
22
- ] ? SpreadTwo<L, Spread<R>> : unknown;
19
+ type Spread<A extends readonly [...any]> = A extends [infer L, ...infer R] ? SpreadTwo<L, Spread<R>> : unknown;
23
20
  type DeepPartial<T> = {
24
21
  [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : DeepPartial<T[P]>;
25
22
  };
@@ -35,6 +32,7 @@ type Json = JsonPrimitive | Json[] | readonly Json[] | {
35
32
  [key: string]: Json;
36
33
  };
37
34
  type JsonObject = Record<string, Json>;
35
+ type UnionToIntersection<U> = (U extends any ? (arg: U) => any : never) extends (arg: infer I) => void ? I : never;
38
36
 
39
37
  type BaseUser = {
40
38
  id: string;
@@ -107,17 +105,9 @@ type EventRecord<TEvent extends string, TData extends JsonObject> = {
107
105
  [key in `${TEvent}`]: TData;
108
106
  };
109
107
  type GetEventMessage<T extends EventRecord<string, any>, TEvent extends keyof T> = TEvent extends string ? EventMessage<TEvent, T[TEvent]> : never;
110
- type InferEventMessage<TEvents extends EventRecord<string, any> = EventRecord<string, any>, TEvent extends keyof TEvents = keyof TEvents> = {
111
- [P in TEvent]: P extends string ? Id<EventMessage<P, TEvents[P]>> : never;
112
- }[TEvent];
113
108
  type InferIOAuthorize<TIO extends IOLike> = TIO extends IOLike<infer IAuthorize> ? IAuthorize : never;
114
109
  type InferIOAuthorizeRequired<TAuthorize extends IOAuthorize<any, any, any>> = TAuthorize extends IOAuthorize<any, infer IRequired> ? IRequired : never;
115
110
  type InferIOAuthorizeUser<TAuthorize extends IOAuthorize<any, any, any>> = TAuthorize extends IOAuthorize<infer IUser, infer IRequired> ? IRequired extends true ? IUser : IUser | null : never;
116
- type InferIOInput<TIO extends IOLike> = TIO extends IOLike<any, infer IInput> ? IInput : never;
117
- type InferIOOutput<TIO extends IOLike> = TIO extends IOLike<any, any, infer IOutputBroadcast, infer IOutputSelf, infer IOutputSync> ? Spread<[IOutputBroadcast, IOutputSelf, IOutputSync]> : never;
118
- type InferIOOutputBroadcast<TIO extends IOLike> = TIO extends IOLike<any, any, infer IOutput> ? IOutput : never;
119
- type InferIOOutputSelf<TIO extends IOLike> = TIO extends IOLike<any, any, any, infer IOutput> ? IOutput : never;
120
- type InferIOOutputSync<TIO extends IOLike> = TIO extends IOLike<any, any, any, any, infer IOutput> ? IOutput : never;
121
111
  type InputZodLike<TData extends JsonObject> = {
122
112
  _input: TData;
123
113
  parse: (data: unknown) => TData;
@@ -137,20 +127,32 @@ interface IOAuthorizeOptionalEventMessage<TIO extends IOLike> {
137
127
  user: InferIOAuthorizeUser<InferIOAuthorize<TIO>> | null;
138
128
  }
139
129
  type IOAuthorizeRequiredEventMessage<TIO extends IOLike> = NonNilProps<IOAuthorizeOptionalEventMessage<TIO>, "connectionId" | "user">;
140
- type IOEventMessage<TIO extends IOLike, TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>> = Id<{
141
- room: string;
142
- } & InferEventMessage<InferIOOutput<TIO>, TEvent> & (InferEventMessage<InferIOOutput<TIO>, TEvent>["type"] extends "$ERROR" ? IOAuthorizeOptionalEventMessage<TIO> : IOAuthorizeEventMessage<TIO>)>;
143
- interface IOLike<TAuthorize extends IOAuthorize<any, any, any> = IOAuthorize<any, any, any>, TInput extends EventRecord<string, any> = {}, TOutputBroadcast extends EventRecord<string, any> = {}, TOutputSelf extends EventRecord<string, any> = {}, TOutputSync extends EventRecord<string, any> = {}> {
144
- _authorize: TAuthorize | null;
145
- _events: {
146
- [P in keyof TInput]: P extends string ? {
147
- resolver: ((data: TInput[P], ...args: any[]) => MaybePromise<TOutputBroadcast | void>) | {
148
- broadcast?: (data: TInput[P], ...args: any[]) => MaybePromise<TOutputBroadcast | void>;
149
- self?: (data: TInput[P], ...args: any[]) => MaybePromise<TOutputSelf | void>;
150
- sync?: (data: TInput[P], ...args: any[]) => MaybePromise<TOutputSync | void>;
151
- };
152
- } : never;
130
+ type ProcedureLike<TInput extends JsonObject = {}, TOutput extends EventRecord<string, any> = {}> = {
131
+ config: {
132
+ broadcast?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
133
+ input?: InputZodLike<TInput> | null;
134
+ resolver: (data: TInput, ...args: any[]) => MaybePromise<TOutput>;
135
+ self?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
136
+ sync?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
153
137
  };
138
+ };
139
+ interface IORouterLike<TEvents extends Record<string, ProcedureLike<any, any>> = {}> {
140
+ _events: TEvents;
154
141
  }
142
+ interface IOLike<TAuthorize extends IOAuthorize<any, any, any> = IOAuthorize<any, any, any>, TEvents extends Record<string, ProcedureLike<any, any>> = {}> extends IORouterLike<TEvents> {
143
+ _authorize: TAuthorize | null;
144
+ }
145
+ type InferIOInput<TRouter extends IORouterLike<any>> = TRouter extends IORouterLike<infer IEvents> ? {
146
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<infer IInput, any> ? IInput : never;
147
+ } : never;
148
+ type InferIOOutput<TRouter extends IORouterLike<any>> = TRouter extends IORouterLike<infer IEvents> ? UnionToIntersection<{
149
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<any, infer IOutput> ? IOutput : never;
150
+ }[keyof IEvents]> : never;
151
+ type InferEventMessage<TEvents extends EventRecord<string, any> = EventRecord<string, any>, TEvent extends keyof TEvents = keyof TEvents> = {
152
+ [P in TEvent]: P extends string ? Id<EventMessage<P, TEvents[P]>> : never;
153
+ }[TEvent];
154
+ type IOEventMessage<TIO extends IOLike<any>, TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>> = Id<{
155
+ room: string;
156
+ } & InferEventMessage<InferIOOutput<TIO>, TEvent> & (InferEventMessage<InferIOOutput<TIO>, TEvent>["type"] extends "$ERROR" ? IOAuthorizeOptionalEventMessage<TIO> : IOAuthorizeEventMessage<TIO>)>;
155
157
 
156
- export type { BaseClientEventRecord, BaseClientMessage, BaseIOAuthorize, BaseIOAuthorizeEventRecord, BaseIOEventRecord, BaseUser, Constructable, DeepPartial, DeepWriteable, EventMessage, EventRecord, GetEventMessage, IOAuthorize, IOAuthorizeEventMessage, IOAuthorizeOptionalEventMessage, IOAuthorizeRequiredEventMessage, IOEventMessage, IOLike, Id, InferEventMessage, InferIOAuthorize, InferIOAuthorizeRequired, InferIOAuthorizeUser, InferIOInput, InferIOOutput, InferIOOutputBroadcast, InferIOOutputSelf, InferIOOutputSync, InputZodLike, Json, JsonObject, JsonPrimitive, Maybe, MaybePromise, MaybeReadonlyArray, NonNilProps, OptionalProps, Spread, SpreadProperties };
158
+ export type { BaseClientEventRecord, BaseClientMessage, BaseIOAuthorize, BaseIOAuthorizeEventRecord, BaseIOEventRecord, BaseUser, Constructable, DeepPartial, DeepWriteable, EventMessage, EventRecord, GetEventMessage, IOAuthorize, IOAuthorizeEventMessage, IOAuthorizeOptionalEventMessage, IOAuthorizeRequiredEventMessage, IOEventMessage, IOLike, IORouterLike, Id, InferEventMessage, InferIOAuthorize, InferIOAuthorizeRequired, InferIOAuthorizeUser, InferIOInput, InferIOOutput, InputZodLike, Json, JsonObject, JsonPrimitive, Maybe, MaybePromise, MaybeReadonlyArray, NonNilProps, OptionalProps, ProcedureLike, Spread, SpreadProperties };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pluv/types",
3
- "version": "0.17.2",
3
+ "version": "0.18.0",
4
4
  "description": "@pluv/io shared types",
5
5
  "author": "leedavidcs",
6
6
  "license": "MIT",
@@ -18,8 +18,8 @@
18
18
  "devDependencies": {
19
19
  "tsup": "^8.0.2",
20
20
  "typescript": "^5.4.5",
21
- "@pluv/tsconfig": "^0.17.2",
22
- "eslint-config-pluv": "^0.17.2"
21
+ "@pluv/tsconfig": "^0.18.0",
22
+ "eslint-config-pluv": "^0.18.0"
23
23
  },
24
24
  "scripts": {
25
25
  "build": "tsup src/index.ts --format esm,cjs --dts",
package/src/general.ts CHANGED
@@ -12,11 +12,7 @@ export type SpreadProperties<L, R, K extends keyof L & keyof R> = {
12
12
  [P in K]: L[P] | Exclude<R[P], undefined>;
13
13
  };
14
14
 
15
- export type Id<T> = T extends infer U
16
- ? U extends Constructable
17
- ? U
18
- : { [K in keyof U]: U[K] }
19
- : never;
15
+ export type Id<T> = T extends infer U ? (U extends Constructable ? U : { [K in keyof U]: U[K] }) : never;
20
16
 
21
17
  type SpreadTwo<L, R> = Id<
22
18
  Pick<L, Exclude<keyof L, keyof R>> &
@@ -25,12 +21,7 @@ type SpreadTwo<L, R> = Id<
25
21
  SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>
26
22
  >;
27
23
 
28
- export type Spread<A extends readonly [...any]> = A extends [
29
- infer L,
30
- ...infer R,
31
- ]
32
- ? SpreadTwo<L, Spread<R>>
33
- : unknown;
24
+ export type Spread<A extends readonly [...any]> = A extends [infer L, ...infer R] ? SpreadTwo<L, Spread<R>> : unknown;
34
25
 
35
26
  export type DeepPartial<T> = {
36
27
  [P in keyof T]?: T[P] extends Array<infer U>
@@ -44,28 +35,21 @@ export type DeepWriteable<T> = {
44
35
  -readonly [P in keyof T]: DeepWriteable<T[P]>;
45
36
  };
46
37
 
47
- export type OptionalProps<
48
- T extends Record<string, any>,
49
- K extends keyof T = keyof T,
50
- > = Omit<T, K> & Partial<Pick<T, K>>;
38
+ export type OptionalProps<T extends Record<string, any>, K extends keyof T = keyof T> = Omit<T, K> &
39
+ Partial<Pick<T, K>>;
51
40
 
52
- export type NonNilProps<
53
- T extends Record<string, any>,
54
- K extends keyof T = keyof T,
55
- > = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };
41
+ export type NonNilProps<T extends Record<string, any>, K extends keyof T = keyof T> = Omit<T, K> & {
42
+ [P in K]-?: NonNullable<T[P]>;
43
+ };
56
44
 
57
45
  export type JsonPrimitive = string | number | boolean | null;
58
46
 
59
- export type Json =
60
- | JsonPrimitive
61
- | Json[]
62
- | readonly Json[]
63
- | { [key: string]: Json };
47
+ export type Json = JsonPrimitive | Json[] | readonly Json[] | { [key: string]: Json };
64
48
 
65
49
  export type JsonObject = Record<string, Json>;
66
50
 
67
- export type StringLiteral<T> = T extends string
68
- ? string extends T
69
- ? never
70
- : T
51
+ export type StringLiteral<T> = T extends string ? (string extends T ? never : T) : never;
52
+
53
+ export type UnionToIntersection<U> = (U extends any ? (arg: U) => any : never) extends (arg: infer I) => void
54
+ ? I
71
55
  : never;
package/src/index.ts CHANGED
@@ -15,29 +15,28 @@ export type {
15
15
  SpreadProperties,
16
16
  } from "./general";
17
17
  export type {
18
- BaseUser,
19
18
  BaseClientEventRecord,
20
19
  BaseClientMessage,
21
20
  BaseIOAuthorize,
22
21
  BaseIOAuthorizeEventRecord,
23
22
  BaseIOEventRecord,
23
+ BaseUser,
24
24
  EventMessage,
25
25
  EventRecord,
26
26
  GetEventMessage,
27
+ IOAuthorize,
28
+ IOAuthorizeEventMessage,
29
+ IOAuthorizeOptionalEventMessage,
30
+ IOAuthorizeRequiredEventMessage,
31
+ IOEventMessage,
32
+ IOLike,
33
+ IORouterLike,
27
34
  InferEventMessage,
28
35
  InferIOAuthorize,
29
36
  InferIOAuthorizeRequired,
30
37
  InferIOAuthorizeUser,
31
38
  InferIOInput,
32
39
  InferIOOutput,
33
- InferIOOutputBroadcast,
34
- InferIOOutputSelf,
35
- InferIOOutputSync,
36
40
  InputZodLike,
37
- IOEventMessage,
38
- IOAuthorize,
39
- IOAuthorizeEventMessage,
40
- IOAuthorizeOptionalEventMessage,
41
- IOAuthorizeRequiredEventMessage,
42
- IOLike,
41
+ ProcedureLike,
43
42
  } from "./pluv";
package/src/pluv.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Id, JsonObject, MaybePromise, NonNilProps, Spread } from "./general";
1
+ import type { Id, JsonObject, MaybePromise, NonNilProps, UnionToIntersection } from "./general";
2
2
 
3
3
  export type BaseUser = {
4
4
  id: string;
@@ -28,9 +28,7 @@ export interface BaseIOAuthorize {
28
28
  user: InputZodLike<BaseUser>;
29
29
  }
30
30
 
31
- export interface BaseIOAuthorizeEventRecord<
32
- TAuthorize extends IOAuthorize<any, any, any>,
33
- > {
31
+ export interface BaseIOAuthorizeEventRecord<TAuthorize extends IOAuthorize<any, any, any>> {
34
32
  $OTHERS_RECEIVED: {
35
33
  others: {
36
34
  [connectionId: string]: {
@@ -72,10 +70,7 @@ export type BaseIOEventRecord<TAuthorize extends IOAuthorize<any, any, any>> =
72
70
  };
73
71
  };
74
72
 
75
- export interface EventMessage<
76
- TEvent extends string,
77
- TData extends JsonObject = {},
78
- > {
73
+ export interface EventMessage<TEvent extends string, TData extends JsonObject = {}> {
79
74
  data: TData;
80
75
  type: TEvent;
81
76
  }
@@ -84,57 +79,22 @@ export type EventRecord<TEvent extends string, TData extends JsonObject> = {
84
79
  [key in `${TEvent}`]: TData;
85
80
  };
86
81
 
87
- export type GetEventMessage<
88
- T extends EventRecord<string, any>,
89
- TEvent extends keyof T,
90
- > = TEvent extends string ? EventMessage<TEvent, T[TEvent]> : never;
82
+ export type GetEventMessage<T extends EventRecord<string, any>, TEvent extends keyof T> = TEvent extends string
83
+ ? EventMessage<TEvent, T[TEvent]>
84
+ : never;
91
85
 
92
- export type InferEventMessage<
93
- TEvents extends EventRecord<string, any> = EventRecord<string, any>,
94
- TEvent extends keyof TEvents = keyof TEvents,
95
- > = {
96
- [P in TEvent]: P extends string ? Id<EventMessage<P, TEvents[P]>> : never;
97
- }[TEvent];
98
-
99
- export type InferIOAuthorize<TIO extends IOLike> =
100
- TIO extends IOLike<infer IAuthorize> ? IAuthorize : never;
86
+ export type InferIOAuthorize<TIO extends IOLike> = TIO extends IOLike<infer IAuthorize> ? IAuthorize : never;
101
87
 
102
- export type InferIOAuthorizeRequired<
103
- TAuthorize extends IOAuthorize<any, any, any>,
104
- > = TAuthorize extends IOAuthorize<any, infer IRequired> ? IRequired : never;
88
+ export type InferIOAuthorizeRequired<TAuthorize extends IOAuthorize<any, any, any>> =
89
+ TAuthorize extends IOAuthorize<any, infer IRequired> ? IRequired : never;
105
90
 
106
- export type InferIOAuthorizeUser<
107
- TAuthorize extends IOAuthorize<any, any, any>,
108
- > =
91
+ export type InferIOAuthorizeUser<TAuthorize extends IOAuthorize<any, any, any>> =
109
92
  TAuthorize extends IOAuthorize<infer IUser, infer IRequired>
110
93
  ? IRequired extends true
111
94
  ? IUser
112
95
  : IUser | null
113
96
  : never;
114
97
 
115
- export type InferIOInput<TIO extends IOLike> =
116
- TIO extends IOLike<any, infer IInput> ? IInput : never;
117
-
118
- export type InferIOOutput<TIO extends IOLike> =
119
- TIO extends IOLike<
120
- any,
121
- any,
122
- infer IOutputBroadcast,
123
- infer IOutputSelf,
124
- infer IOutputSync
125
- >
126
- ? Spread<[IOutputBroadcast, IOutputSelf, IOutputSync]>
127
- : never;
128
-
129
- export type InferIOOutputBroadcast<TIO extends IOLike> =
130
- TIO extends IOLike<any, any, infer IOutput> ? IOutput : never;
131
-
132
- export type InferIOOutputSelf<TIO extends IOLike> =
133
- TIO extends IOLike<any, any, any, infer IOutput> ? IOutput : never;
134
-
135
- export type InferIOOutputSync<TIO extends IOLike> =
136
- TIO extends IOLike<any, any, any, any, infer IOutput> ? IOutput : never;
137
-
138
98
  export type InputZodLike<TData extends JsonObject> = {
139
99
  _input: TData;
140
100
  parse: (data: unknown) => TData;
@@ -171,8 +131,50 @@ export type IOAuthorizeRequiredEventMessage<TIO extends IOLike> = NonNilProps<
171
131
  "connectionId" | "user"
172
132
  >;
173
133
 
134
+ export type ProcedureLike<TInput extends JsonObject = {}, TOutput extends EventRecord<string, any> = {}> = {
135
+ config: {
136
+ broadcast?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
137
+ input?: InputZodLike<TInput> | null;
138
+ resolver: (data: TInput, ...args: any[]) => MaybePromise<TOutput>;
139
+ self?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
140
+ sync?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
141
+ };
142
+ };
143
+
144
+ export interface IORouterLike<TEvents extends Record<string, ProcedureLike<any, any>> = {}> {
145
+ _events: TEvents;
146
+ }
147
+
148
+ export interface IOLike<
149
+ TAuthorize extends IOAuthorize<any, any, any> = IOAuthorize<any, any, any>,
150
+ TEvents extends Record<string, ProcedureLike<any, any>> = {},
151
+ > extends IORouterLike<TEvents> {
152
+ _authorize: TAuthorize | null;
153
+ }
154
+
155
+ export type InferIOInput<TRouter extends IORouterLike<any>> =
156
+ TRouter extends IORouterLike<infer IEvents>
157
+ ? { [P in keyof IEvents]: IEvents[P] extends ProcedureLike<infer IInput, any> ? IInput : never }
158
+ : never;
159
+
160
+ export type InferIOOutput<TRouter extends IORouterLike<any>> =
161
+ TRouter extends IORouterLike<infer IEvents>
162
+ ? UnionToIntersection<
163
+ {
164
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<any, infer IOutput> ? IOutput : never;
165
+ }[keyof IEvents]
166
+ >
167
+ : never;
168
+
169
+ export type InferEventMessage<
170
+ TEvents extends EventRecord<string, any> = EventRecord<string, any>,
171
+ TEvent extends keyof TEvents = keyof TEvents,
172
+ > = {
173
+ [P in TEvent]: P extends string ? Id<EventMessage<P, TEvents[P]>> : never;
174
+ }[TEvent];
175
+
174
176
  export type IOEventMessage<
175
- TIO extends IOLike,
177
+ TIO extends IOLike<any>,
176
178
  TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>,
177
179
  > = Id<
178
180
  { room: string } & InferEventMessage<InferIOOutput<TIO>, TEvent> &
@@ -180,38 +182,3 @@ export type IOEventMessage<
180
182
  ? IOAuthorizeOptionalEventMessage<TIO>
181
183
  : IOAuthorizeEventMessage<TIO>)
182
184
  >;
183
-
184
- export interface IOLike<
185
- TAuthorize extends IOAuthorize<any, any, any> = IOAuthorize<any, any, any>,
186
- TInput extends EventRecord<string, any> = {},
187
- TOutputBroadcast extends EventRecord<string, any> = {},
188
- TOutputSelf extends EventRecord<string, any> = {},
189
- TOutputSync extends EventRecord<string, any> = {},
190
- > {
191
- _authorize: TAuthorize | null;
192
- _events: {
193
- [P in keyof TInput]: P extends string
194
- ? {
195
- resolver:
196
- | ((
197
- data: TInput[P],
198
- ...args: any[]
199
- ) => MaybePromise<TOutputBroadcast | void>)
200
- | {
201
- broadcast?: (
202
- data: TInput[P],
203
- ...args: any[]
204
- ) => MaybePromise<TOutputBroadcast | void>;
205
- self?: (
206
- data: TInput[P],
207
- ...args: any[]
208
- ) => MaybePromise<TOutputSelf | void>;
209
- sync?: (
210
- data: TInput[P],
211
- ...args: any[]
212
- ) => MaybePromise<TOutputSync | void>;
213
- };
214
- }
215
- : never;
216
- };
217
- }