@colyseus/schema 5.0.23 → 5.0.24

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.
@@ -89,16 +89,10 @@ export type CodecFor<T> = {
89
89
  [K in RawPrimitiveType]: [T] extends [InferValueType<K>] ? K : never;
90
90
  }[RawPrimitiveType];
91
91
  type IsOptionalBuilderKey<T, K extends keyof T> = T[K] extends FieldBuilder<unknown, boolean, infer O extends boolean> ? O : false;
92
- type OptionalBuilderKeys<T> = {
93
- [K in keyof T]-?: IsOptionalBuilderKey<T, K> extends true ? K : never;
94
- }[keyof T];
95
- type RequiredBuilderKeys<T> = {
96
- [K in keyof T]-?: IsOptionalBuilderKey<T, K> extends true ? never : K;
97
- }[keyof T];
98
92
  export type InferSchemaInstanceType<T> = {
99
- [K in RequiredBuilderKeys<T>]: T[K] extends FieldBuilder<any> ? InferValueType<T[K]> : T[K] extends (...args: any[]) => any ? (T[K] extends new (...args: any[]) => any ? InferValueType<T[K]> : T[K]) : InferValueType<T[K]>;
93
+ -readonly [K in keyof T as IsOptionalBuilderKey<T, K> extends true ? never : K]-?: T[K] extends FieldBuilder<any> ? InferValueType<T[K]> : T[K] extends (...args: any[]) => any ? (T[K] extends new (...args: any[]) => any ? InferValueType<T[K]> : T[K]) : InferValueType<T[K]>;
100
94
  } & {
101
- [K in OptionalBuilderKeys<T>]?: T[K] extends FieldBuilder<infer V> ? V : never;
95
+ -readonly [K in keyof T as IsOptionalBuilderKey<T, K> extends true ? K : never]?: T[K] extends FieldBuilder<infer V> ? V : never;
102
96
  } & Schema;
103
97
  type DataKey<T, K extends keyof T> = K extends keyof Schema ? never : T[K] extends Function ? never : K;
104
98
  export type NonFunctionPropNames<T> = {
@@ -110,16 +104,10 @@ export type NonFunctionNonPrimitivePropNames<T> = {
110
104
  type ToJSONValue<U> = U extends Schema ? ToJSON<U> : PrimitiveStringToType<U>;
111
105
  type ToJSONField<X> = X extends MapSchema<infer U> ? Record<string, ToJSONValue<U>> : X extends Map<string, infer U> ? Record<string, ToJSONValue<U>> : X extends ArraySchema<infer U> ? ToJSONValue<U>[] : X extends SetSchema<infer U> ? ToJSONValue<U>[] : X extends CollectionSchema<infer U> ? ToJSONValue<U>[] : X extends Schema ? ToJSON<X> : X;
112
106
  type IsOptionalKey<T, K extends keyof T> = undefined extends {} ? ({} extends Pick<T, K> ? true : false) : (undefined extends T[K] ? true : false);
113
- type ToJSONRequiredKeys<T> = {
114
- [K in keyof T]-?: [DataKey<T, K>] extends [never] ? never : IsOptionalKey<T, K> extends true ? never : K;
115
- }[keyof T];
116
- type ToJSONOptionalKeys<T> = {
117
- [K in keyof T]-?: [DataKey<T, K>] extends [never] ? never : IsOptionalKey<T, K> extends true ? K : never;
118
- }[keyof T];
119
107
  export type ToJSON<T> = {
120
- [K in ToJSONRequiredKeys<T>]: ToJSONField<T[K]>;
108
+ -readonly [K in keyof T as IsOptionalKey<T, K> extends true ? never : DataKey<T, K>]-?: ToJSONField<T[K]>;
121
109
  } & {
122
- [K in ToJSONOptionalKeys<T>]?: ToJSONField<Exclude<T[K], undefined>>;
110
+ -readonly [K in keyof T as IsOptionalKey<T, K> extends true ? DataKey<T, K> : never]?: ToJSONField<Exclude<T[K], undefined>>;
123
111
  };
124
112
  /**
125
113
  * The plain DATA shape of a Schema instance type `T`: its synchronized fields
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colyseus/schema",
3
- "version": "5.0.23",
3
+ "version": "5.0.24",
4
4
  "description": "Automatic state replication for multiplayer games. Mutate plain objects, and every client gets a live, typed mirror through delta encoding.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -117,19 +117,19 @@ export type CodecFor<T> = {
117
117
  type IsOptionalBuilderKey<T, K extends keyof T> =
118
118
  T[K] extends FieldBuilder<unknown, boolean, infer O extends boolean> ? O : false;
119
119
 
120
- // Per key, like `DataKey` below an `Exclude<keyof T, …>` split defers every
121
- // key once one field is typed by a bare type parameter.
122
- type OptionalBuilderKeys<T> = { [K in keyof T]-?: IsOptionalBuilderKey<T, K> extends true ? K : never }[keyof T];
123
- type RequiredBuilderKeys<T> = { [K in keyof T]-?: IsOptionalBuilderKey<T, K> extends true ? never : K }[keyof T];
124
-
120
+ // Split in the `as` clause, never over a precomputed key union: only a
121
+ // homomorphic mapping carries each key back to its declaration in the
122
+ // `schema({ })` literal, which is what go-to-definition and rename resolve
123
+ // through. `-readonly`, and `-?` on the required half, drop the modifiers a
124
+ // homomorphic mapping inherits from the fields map.
125
125
  export type InferSchemaInstanceType<T> = {
126
- [K in RequiredBuilderKeys<T>]: T[K] extends FieldBuilder<any>
126
+ -readonly [K in keyof T as IsOptionalBuilderKey<T, K> extends true ? never : K]-?: T[K] extends FieldBuilder<any>
127
127
  ? InferValueType<T[K]>
128
128
  : T[K] extends (...args: any[]) => any
129
129
  ? (T[K] extends new (...args: any[]) => any ? InferValueType<T[K]> : T[K])
130
130
  : InferValueType<T[K]>
131
131
  } & {
132
- [K in OptionalBuilderKeys<T>]?: T[K] extends FieldBuilder<infer V>
132
+ -readonly [K in keyof T as IsOptionalBuilderKey<T, K> extends true ? K : never]?: T[K] extends FieldBuilder<infer V>
133
133
  ? V
134
134
  : never
135
135
  } & Schema;
@@ -170,15 +170,15 @@ type IsOptionalKey<T, K extends keyof T> = undefined extends {}
170
170
  ? ({} extends Pick<T, K> ? true : false)
171
171
  : (undefined extends T[K] ? true : false);
172
172
 
173
- // `DataKey` first: machinery and method keys drop before the optionality probe.
174
- type ToJSONRequiredKeys<T> = { [K in keyof T]-?: [DataKey<T, K>] extends [never] ? never : IsOptionalKey<T, K> extends true ? never : K }[keyof T];
175
- type ToJSONOptionalKeys<T> = { [K in keyof T]-?: [DataKey<T, K>] extends [never] ? never : IsOptionalKey<T, K> extends true ? K : never }[keyof T];
176
-
177
- // Keys are filtered before mapping: `ToJSONField` over the `this`-typed methods
178
- // exceeds TypeScript 7's instantiation depth.
173
+ // Both filters live in the `as` clause, for two independent reasons:
174
+ // navigation, as above and depth, because the clause runs before the value
175
+ // type, so `ToJSONField` never reaches the machinery, where it would recurse
176
+ // through `restore(json: ToJSON<this>)` past TypeScript 7's instantiation limit.
177
+ // Probing `IsOptionalKey` first is deliberate: `DataKey` then runs in the taken
178
+ // branch only, once per key rather than once per half.
179
179
  export type ToJSON<T> =
180
- & { [K in ToJSONRequiredKeys<T>]: ToJSONField<T[K]> }
181
- & { [K in ToJSONOptionalKeys<T>]?: ToJSONField<Exclude<T[K], undefined>> };
180
+ & { -readonly [K in keyof T as IsOptionalKey<T, K> extends true ? never : DataKey<T, K>]-?: ToJSONField<T[K]> }
181
+ & { -readonly [K in keyof T as IsOptionalKey<T, K> extends true ? DataKey<T, K> : never]?: ToJSONField<Exclude<T[K], undefined>> };
182
182
 
183
183
  /**
184
184
  * The plain DATA shape of a Schema instance type `T`: its synchronized fields