@pluv/types 0.17.3 → 0.19.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,18 +1,18 @@
1
1
 
2
- > @pluv/types@0.17.3 build /home/runner/work/pluv/pluv/packages/types
2
+ > @pluv/types@0.19.0 build /home/runner/work/pluv/pluv/packages/types
3
3
  > tsup src/index.ts --format esm,cjs --dts
4
4
 
5
- CLI Building entry: src/index.ts
6
- CLI Using tsconfig: tsconfig.json
7
- CLI tsup v8.0.2
8
- CLI Target: es6
9
- ESM Build start
10
- CJS Build start
11
- ESM dist/index.mjs 0 B
12
- ESM ⚡️ Build success in 27ms
13
- CJS dist/index.js 754.00 B
14
- CJS ⚡️ Build success in 27ms
15
- DTS Build start
16
- DTS ⚡️ Build success in 1012ms
17
- DTS dist/index.d.mts 7.36 KB
18
- DTS dist/index.d.ts 7.36 KB
5
+ CLI Building entry: src/index.ts
6
+ CLI Using tsconfig: tsconfig.json
7
+ CLI tsup v8.1.0
8
+ CLI Target: es6
9
+ ESM Build start
10
+ CJS Build start
11
+ CJS dist/index.js 754.00 B
12
+ CJS ⚡️ Build success in 30ms
13
+ ESM dist/index.mjs 0 B
14
+ ESM ⚡️ Build success in 30ms
15
+ DTS Build start
16
+ DTS ⚡️ Build success in 846ms
17
+ DTS dist/index.d.mts 7.35 KB
18
+ DTS dist/index.d.ts 7.35 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,103 @@
1
1
  # @pluv/types
2
2
 
3
+ ## 0.19.0
4
+
5
+ ## 0.18.0
6
+
7
+ ### Minor Changes
8
+
9
+ - 99b5ca9: ## Breaking Changes
10
+
11
+ - `@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.
12
+
13
+ ### Before:
14
+
15
+ ```ts
16
+ // backend/io.ts
17
+
18
+ import { createIO } from "@pluv/io";
19
+ import { createPluvHandler, platformNode } from "@pluv/platform-node";
20
+ import { z } from "zod";
21
+
22
+ export const io = createIO({
23
+ platform: platformNode(),
24
+ })
25
+ .event("SEND_MESSAGE", {
26
+ input: z.object({ message: z.string() }),
27
+ resolver: ({ message }) => ({ RECEIVE_MESSAGE: { message } }),
28
+ })
29
+ .event("DOUBLE_VALUE", {
30
+ input: z.object({ value: z.number() }),
31
+ resolver: ({ value }) => ({ VALUE_DOUBLED: { value: value * 2 } }),
32
+ });
33
+
34
+ const Pluv = createPluvHandler({
35
+ io,
36
+ /* ... */
37
+ });
38
+ ```
39
+
40
+ ```ts
41
+ // frontend/pluv.ts
42
+
43
+ import { createClient } from "@pluv/react";
44
+ import type { io } from "../backend/io";
45
+
46
+ const client = createClient<typeof io>({
47
+ /* ... */
48
+ });
49
+ ```
50
+
51
+ ### Now:
52
+
53
+ ```ts
54
+ import { createIO } from "@pluv/io";
55
+ import { createPluvHandler, platformNode } from "@pluv/platform-node";
56
+ import { z } from "zod";
57
+
58
+ const io = createIO({
59
+ platform: platformNode(),
60
+ });
61
+
62
+ const router = io.router({
63
+ SEND_MESSAGE: io.procedure
64
+ .input(z.object({ message: z.string() }))
65
+ .broadcast(({ message }) => ({
66
+ RECEIVE_MESSAGE: { message },
67
+ })),
68
+ DOUBLE_VALUE: io.procedure
69
+ .input(z.object({ value: z.number() }))
70
+ .broadcast(({ value }) => ({
71
+ VALUE_DOUBLED: { value: value * 2 },
72
+ })),
73
+ });
74
+
75
+ export const ioServer = io.server({ router });
76
+
77
+ const Pluv = createPluvHandler({
78
+ io: ioServer, // <- This uses the PluvServer now
79
+ /* ... */
80
+ });
81
+ ```
82
+
83
+ ```ts
84
+ // frontend/pluv.ts
85
+
86
+ import { createClient } from "@pluv/react";
87
+ import type { ioServer } from "../backend/io";
88
+
89
+ // This users the PluvServer type now
90
+ const client = createClient<typeof ioServer>({
91
+ /* ... */
92
+ });
93
+ ```
94
+
95
+ - `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:
96
+
97
+ ```ts
98
+ const router = io.mergeRouters(router1, router2);
99
+ ```
100
+
3
101
  ## 0.17.3
4
102
 
5
103
  ## 0.17.2
package/dist/index.d.mts CHANGED
@@ -1,9 +1,10 @@
1
1
  type Constructable = {
2
2
  new (...args: any[]): any;
3
3
  };
4
- type Maybe<T> = T | null | undefined;
4
+ type Maybe<T> = T | Nil;
5
5
  type MaybePromise<T> = Promise<T> | T;
6
6
  type MaybeReadonlyArray<T> = T[] | readonly T[];
7
+ type Nil = null | undefined;
7
8
  type OptionalPropertyNames<T> = {
8
9
  [K in keyof T]-?: {} extends {
9
10
  [P in K]: T[K];
@@ -12,14 +13,11 @@ type OptionalPropertyNames<T> = {
12
13
  type SpreadProperties<L, R, K extends keyof L & keyof R> = {
13
14
  [P in K]: L[P] | Exclude<R[P], undefined>;
14
15
  };
15
- type Id<T> = T extends infer U ? U extends Constructable ? U : {
16
+ type Id<T> = T extends Nil ? T : T extends infer U ? U extends Constructable ? U : {
16
17
  [K in keyof U]: U[K];
17
18
  } : never;
18
19
  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;
20
+ type Spread<A extends readonly [...any]> = A extends [infer L, ...infer R] ? SpreadTwo<L, Spread<R>> : unknown;
23
21
  type DeepPartial<T> = {
24
22
  [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
23
  };
@@ -35,6 +33,7 @@ type Json = JsonPrimitive | Json[] | readonly Json[] | {
35
33
  [key: string]: Json;
36
34
  };
37
35
  type JsonObject = Record<string, Json>;
36
+ type UnionToIntersection<U> = (U extends any ? (arg: U) => any : never) extends (arg: infer I) => void ? I : never;
38
37
 
39
38
  type BaseUser = {
40
39
  id: string;
@@ -67,13 +66,13 @@ interface BaseIOAuthorizeEventRecord<TAuthorize extends IOAuthorize<any, any, an
67
66
  connectionId: string;
68
67
  presence: JsonObject | null;
69
68
  room: string | null;
70
- user: InferIOAuthorizeUser<TAuthorize>;
69
+ user: Id<InferIOAuthorizeUser<TAuthorize>>;
71
70
  };
72
71
  };
73
72
  };
74
73
  $USER_JOINED: {
75
74
  connectionId: string;
76
- user: NonNullable<InferIOAuthorizeUser<TAuthorize>>;
75
+ user: NonNullable<Id<InferIOAuthorizeUser<TAuthorize>>>;
77
76
  presence: JsonObject;
78
77
  };
79
78
  }
@@ -107,17 +106,9 @@ type EventRecord<TEvent extends string, TData extends JsonObject> = {
107
106
  [key in `${TEvent}`]: TData;
108
107
  };
109
108
  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
109
  type InferIOAuthorize<TIO extends IOLike> = TIO extends IOLike<infer IAuthorize> ? IAuthorize : never;
114
110
  type InferIOAuthorizeRequired<TAuthorize extends IOAuthorize<any, any, any>> = TAuthorize extends IOAuthorize<any, infer IRequired> ? IRequired : never;
115
111
  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
112
  type InputZodLike<TData extends JsonObject> = {
122
113
  _input: TData;
123
114
  parse: (data: unknown) => TData;
@@ -137,20 +128,32 @@ interface IOAuthorizeOptionalEventMessage<TIO extends IOLike> {
137
128
  user: InferIOAuthorizeUser<InferIOAuthorize<TIO>> | null;
138
129
  }
139
130
  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;
131
+ type ProcedureLike<TInput extends JsonObject = {}, TOutput extends EventRecord<string, any> = {}> = {
132
+ config: {
133
+ broadcast?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
134
+ input?: InputZodLike<TInput> | null;
135
+ resolver: (data: TInput, ...args: any[]) => MaybePromise<TOutput>;
136
+ self?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
137
+ sync?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
153
138
  };
139
+ };
140
+ interface IORouterLike<TEvents extends Record<string, ProcedureLike<any, any>> = {}> {
141
+ _events: TEvents;
154
142
  }
143
+ interface IOLike<TAuthorize extends IOAuthorize<any, any, any> = IOAuthorize<any, any, any>, TEvents extends Record<string, ProcedureLike<any, any>> = {}> extends IORouterLike<TEvents> {
144
+ _authorize: TAuthorize | null;
145
+ }
146
+ type InferIOInput<TRouter extends IORouterLike<any>> = TRouter extends IORouterLike<infer IEvents> ? {
147
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<infer IInput, any> ? IInput : never;
148
+ } : never;
149
+ type InferIOOutput<TRouter extends IORouterLike<any>> = TRouter extends IORouterLike<infer IEvents> ? UnionToIntersection<{
150
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<any, infer IOutput> ? IOutput : never;
151
+ }[keyof IEvents]> : never;
152
+ type InferEventMessage<TEvents extends EventRecord<string, any> = EventRecord<string, any>, TEvent extends keyof TEvents = keyof TEvents> = {
153
+ [P in TEvent]: P extends string ? Id<EventMessage<P, TEvents[P]>> : never;
154
+ }[TEvent];
155
+ type IOEventMessage<TIO extends IOLike<any>, TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>> = Id<{
156
+ room: string;
157
+ } & InferEventMessage<InferIOOutput<TIO>, TEvent> & (InferEventMessage<InferIOOutput<TIO>, TEvent>["type"] extends "$ERROR" ? IOAuthorizeOptionalEventMessage<TIO> : IOAuthorizeEventMessage<TIO>)>;
155
158
 
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 };
159
+ 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
@@ -1,9 +1,10 @@
1
1
  type Constructable = {
2
2
  new (...args: any[]): any;
3
3
  };
4
- type Maybe<T> = T | null | undefined;
4
+ type Maybe<T> = T | Nil;
5
5
  type MaybePromise<T> = Promise<T> | T;
6
6
  type MaybeReadonlyArray<T> = T[] | readonly T[];
7
+ type Nil = null | undefined;
7
8
  type OptionalPropertyNames<T> = {
8
9
  [K in keyof T]-?: {} extends {
9
10
  [P in K]: T[K];
@@ -12,14 +13,11 @@ type OptionalPropertyNames<T> = {
12
13
  type SpreadProperties<L, R, K extends keyof L & keyof R> = {
13
14
  [P in K]: L[P] | Exclude<R[P], undefined>;
14
15
  };
15
- type Id<T> = T extends infer U ? U extends Constructable ? U : {
16
+ type Id<T> = T extends Nil ? T : T extends infer U ? U extends Constructable ? U : {
16
17
  [K in keyof U]: U[K];
17
18
  } : never;
18
19
  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;
20
+ type Spread<A extends readonly [...any]> = A extends [infer L, ...infer R] ? SpreadTwo<L, Spread<R>> : unknown;
23
21
  type DeepPartial<T> = {
24
22
  [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
23
  };
@@ -35,6 +33,7 @@ type Json = JsonPrimitive | Json[] | readonly Json[] | {
35
33
  [key: string]: Json;
36
34
  };
37
35
  type JsonObject = Record<string, Json>;
36
+ type UnionToIntersection<U> = (U extends any ? (arg: U) => any : never) extends (arg: infer I) => void ? I : never;
38
37
 
39
38
  type BaseUser = {
40
39
  id: string;
@@ -67,13 +66,13 @@ interface BaseIOAuthorizeEventRecord<TAuthorize extends IOAuthorize<any, any, an
67
66
  connectionId: string;
68
67
  presence: JsonObject | null;
69
68
  room: string | null;
70
- user: InferIOAuthorizeUser<TAuthorize>;
69
+ user: Id<InferIOAuthorizeUser<TAuthorize>>;
71
70
  };
72
71
  };
73
72
  };
74
73
  $USER_JOINED: {
75
74
  connectionId: string;
76
- user: NonNullable<InferIOAuthorizeUser<TAuthorize>>;
75
+ user: NonNullable<Id<InferIOAuthorizeUser<TAuthorize>>>;
77
76
  presence: JsonObject;
78
77
  };
79
78
  }
@@ -107,17 +106,9 @@ type EventRecord<TEvent extends string, TData extends JsonObject> = {
107
106
  [key in `${TEvent}`]: TData;
108
107
  };
109
108
  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
109
  type InferIOAuthorize<TIO extends IOLike> = TIO extends IOLike<infer IAuthorize> ? IAuthorize : never;
114
110
  type InferIOAuthorizeRequired<TAuthorize extends IOAuthorize<any, any, any>> = TAuthorize extends IOAuthorize<any, infer IRequired> ? IRequired : never;
115
111
  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
112
  type InputZodLike<TData extends JsonObject> = {
122
113
  _input: TData;
123
114
  parse: (data: unknown) => TData;
@@ -137,20 +128,32 @@ interface IOAuthorizeOptionalEventMessage<TIO extends IOLike> {
137
128
  user: InferIOAuthorizeUser<InferIOAuthorize<TIO>> | null;
138
129
  }
139
130
  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;
131
+ type ProcedureLike<TInput extends JsonObject = {}, TOutput extends EventRecord<string, any> = {}> = {
132
+ config: {
133
+ broadcast?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
134
+ input?: InputZodLike<TInput> | null;
135
+ resolver: (data: TInput, ...args: any[]) => MaybePromise<TOutput>;
136
+ self?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
137
+ sync?: ((data: TInput, ...args: any[]) => MaybePromise<Partial<TOutput> | void>) | null;
153
138
  };
139
+ };
140
+ interface IORouterLike<TEvents extends Record<string, ProcedureLike<any, any>> = {}> {
141
+ _events: TEvents;
154
142
  }
143
+ interface IOLike<TAuthorize extends IOAuthorize<any, any, any> = IOAuthorize<any, any, any>, TEvents extends Record<string, ProcedureLike<any, any>> = {}> extends IORouterLike<TEvents> {
144
+ _authorize: TAuthorize | null;
145
+ }
146
+ type InferIOInput<TRouter extends IORouterLike<any>> = TRouter extends IORouterLike<infer IEvents> ? {
147
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<infer IInput, any> ? IInput : never;
148
+ } : never;
149
+ type InferIOOutput<TRouter extends IORouterLike<any>> = TRouter extends IORouterLike<infer IEvents> ? UnionToIntersection<{
150
+ [P in keyof IEvents]: IEvents[P] extends ProcedureLike<any, infer IOutput> ? IOutput : never;
151
+ }[keyof IEvents]> : never;
152
+ type InferEventMessage<TEvents extends EventRecord<string, any> = EventRecord<string, any>, TEvent extends keyof TEvents = keyof TEvents> = {
153
+ [P in TEvent]: P extends string ? Id<EventMessage<P, TEvents[P]>> : never;
154
+ }[TEvent];
155
+ type IOEventMessage<TIO extends IOLike<any>, TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>> = Id<{
156
+ room: string;
157
+ } & InferEventMessage<InferIOOutput<TIO>, TEvent> & (InferEventMessage<InferIOOutput<TIO>, TEvent>["type"] extends "$ERROR" ? IOAuthorizeOptionalEventMessage<TIO> : IOAuthorizeEventMessage<TIO>)>;
155
158
 
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 };
159
+ 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.3",
3
+ "version": "0.19.0",
4
4
  "description": "@pluv/io shared types",
5
5
  "author": "leedavidcs",
6
6
  "license": "MIT",
@@ -16,10 +16,10 @@
16
16
  "access": "public"
17
17
  },
18
18
  "devDependencies": {
19
- "tsup": "^8.0.2",
19
+ "tsup": "^8.1.0",
20
20
  "typescript": "^5.4.5",
21
- "@pluv/tsconfig": "^0.17.3",
22
- "eslint-config-pluv": "^0.17.3"
21
+ "@pluv/tsconfig": "^0.19.0",
22
+ "eslint-config-pluv": "^0.19.0"
23
23
  },
24
24
  "scripts": {
25
25
  "build": "tsup src/index.ts --format esm,cjs --dts",
package/src/general.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export type Constructable = { new (...args: any[]): any };
2
2
 
3
- export type Maybe<T> = T | null | undefined;
3
+ export type Maybe<T> = T | Nil;
4
4
  export type MaybePromise<T> = Promise<T> | T;
5
5
  export type MaybeReadonlyArray<T> = T[] | readonly T[];
6
+ export type Nil = null | undefined;
6
7
 
7
8
  type OptionalPropertyNames<T> = {
8
9
  [K in keyof T]-?: {} extends { [P in K]: T[K] } ? K : never;
@@ -12,11 +13,15 @@ export type SpreadProperties<L, R, K extends keyof L & keyof R> = {
12
13
  [P in K]: L[P] | Exclude<R[P], undefined>;
13
14
  };
14
15
 
15
- export type Id<T> = T extends infer U
16
- ? U extends Constructable
17
- ? U
18
- : { [K in keyof U]: U[K] }
19
- : never;
16
+ export type Id<T> = T extends Nil
17
+ ? T
18
+ : T extends infer U
19
+ ? U extends Constructable
20
+ ? U
21
+ : { [K in keyof U]: U[K] }
22
+ : never;
23
+
24
+ export type Primitive = string | number | boolean | null | undefined;
20
25
 
21
26
  type SpreadTwo<L, R> = Id<
22
27
  Pick<L, Exclude<keyof L, keyof R>> &
@@ -25,12 +30,7 @@ type SpreadTwo<L, R> = Id<
25
30
  SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>
26
31
  >;
27
32
 
28
- export type Spread<A extends readonly [...any]> = A extends [
29
- infer L,
30
- ...infer R,
31
- ]
32
- ? SpreadTwo<L, Spread<R>>
33
- : unknown;
33
+ export type Spread<A extends readonly [...any]> = A extends [infer L, ...infer R] ? SpreadTwo<L, Spread<R>> : unknown;
34
34
 
35
35
  export type DeepPartial<T> = {
36
36
  [P in keyof T]?: T[P] extends Array<infer U>
@@ -44,28 +44,21 @@ export type DeepWriteable<T> = {
44
44
  -readonly [P in keyof T]: DeepWriteable<T[P]>;
45
45
  };
46
46
 
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>>;
47
+ export type OptionalProps<T extends Record<string, any>, K extends keyof T = keyof T> = Omit<T, K> &
48
+ Partial<Pick<T, K>>;
51
49
 
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]> };
50
+ export type NonNilProps<T extends Record<string, any>, K extends keyof T = keyof T> = Omit<T, K> & {
51
+ [P in K]-?: NonNullable<T[P]>;
52
+ };
56
53
 
57
54
  export type JsonPrimitive = string | number | boolean | null;
58
55
 
59
- export type Json =
60
- | JsonPrimitive
61
- | Json[]
62
- | readonly Json[]
63
- | { [key: string]: Json };
56
+ export type Json = JsonPrimitive | Json[] | readonly Json[] | { [key: string]: Json };
64
57
 
65
58
  export type JsonObject = Record<string, Json>;
66
59
 
67
- export type StringLiteral<T> = T extends string
68
- ? string extends T
69
- ? never
70
- : T
60
+ export type StringLiteral<T> = T extends string ? (string extends T ? never : T) : never;
61
+
62
+ export type UnionToIntersection<U> = (U extends any ? (arg: U) => any : never) extends (arg: infer I) => void
63
+ ? I
71
64
  : 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,22 +28,20 @@ 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]: {
37
35
  connectionId: string;
38
36
  presence: JsonObject | null;
39
37
  room: string | null;
40
- user: InferIOAuthorizeUser<TAuthorize>;
38
+ user: Id<InferIOAuthorizeUser<TAuthorize>>;
41
39
  };
42
40
  };
43
41
  };
44
42
  $USER_JOINED: {
45
43
  connectionId: string;
46
- user: NonNullable<InferIOAuthorizeUser<TAuthorize>>;
44
+ user: NonNullable<Id<InferIOAuthorizeUser<TAuthorize>>>;
47
45
  presence: JsonObject;
48
46
  };
49
47
  }
@@ -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
- }