@league-of-foundry-developers/foundry-vtt-types 13.346.0-beta.20250708062241 → 13.346.0-beta.20250708122847

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.
Files changed (30) hide show
  1. package/package.json +1 -1
  2. package/src/foundry/client/applications/api/dialog.d.mts +1 -1
  3. package/src/foundry/client/canvas/placeables/token.d.mts +1 -1
  4. package/src/foundry/client/documents/active-effect.d.mts +8 -10
  5. package/src/foundry/client/documents/actor-delta.d.mts +8 -1
  6. package/src/foundry/client/documents/actor.d.mts +9 -9
  7. package/src/foundry/client/documents/adventure.d.mts +5 -11
  8. package/src/foundry/client/documents/card.d.mts +7 -8
  9. package/src/foundry/client/documents/cards.d.mts +6 -1
  10. package/src/foundry/client/documents/chat-message.d.mts +6 -1
  11. package/src/foundry/client/documents/combat.d.mts +6 -1
  12. package/src/foundry/client/documents/combatant-group.d.mts +6 -1
  13. package/src/foundry/client/documents/combatant.d.mts +6 -1
  14. package/src/foundry/client/documents/folder.d.mts +1 -7
  15. package/src/foundry/client/documents/item.d.mts +7 -8
  16. package/src/foundry/client/documents/journal-entry-page.d.mts +7 -8
  17. package/src/foundry/client/documents/journal-entry.d.mts +1 -7
  18. package/src/foundry/client/documents/macro.d.mts +1 -7
  19. package/src/foundry/client/documents/playlist-sound.d.mts +1 -7
  20. package/src/foundry/client/documents/playlist.d.mts +1 -7
  21. package/src/foundry/client/documents/region-behavior.d.mts +6 -1
  22. package/src/foundry/client/documents/region.d.mts +1 -7
  23. package/src/foundry/client/documents/roll-table.d.mts +1 -7
  24. package/src/foundry/client/documents/scene.d.mts +1 -7
  25. package/src/foundry/client/documents/user.d.mts +1 -7
  26. package/src/foundry/client/game.d.mts +21 -9
  27. package/src/foundry/common/abstract/document.d.mts +57 -20
  28. package/src/foundry/common/data/fields.d.mts +7 -4
  29. package/src/foundry/common/utils/color.d.mts +5 -1
  30. package/tsconfig.json +1 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@league-of-foundry-developers/foundry-vtt-types",
4
- "version": "13.346.0-beta.20250708062241",
4
+ "version": "13.346.0-beta.20250708122847",
5
5
  "description": "TypeScript type definitions for Foundry VTT",
6
6
  "type": "module",
7
7
  "types": "./src/index.d.mts",
@@ -559,7 +559,7 @@ declare namespace DialogV2 {
559
559
  ? never
560
560
  : "close" extends keyof Options
561
561
  ? Options["close"] extends (...args: never) => infer Return
562
- ? Return | null
562
+ ? NullishCoalesce<Return, null>
563
563
  : null
564
564
  : null;
565
565
 
@@ -1077,7 +1077,7 @@ declare namespace Token {
1077
1077
  | "disabled"
1078
1078
  >;
1079
1079
 
1080
- // TODO: (LukeAbby) possible candidate for `-=` key handling
1080
+ // TODO(LukeAbby) possible candidate for `-=` key handling
1081
1081
  interface BlindedStates extends Record<string, boolean> {
1082
1082
  blind: boolean;
1083
1083
  burrow: boolean;
@@ -114,7 +114,12 @@ declare namespace ActiveEffect {
114
114
  /**
115
115
  * @internal
116
116
  */
117
- interface _SystemMap extends Document.Internal.SystemMap<"ActiveEffect"> {}
117
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
118
+
119
+ /**
120
+ * @internal
121
+ */
122
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
118
123
 
119
124
  /**
120
125
  * A document's parent is something that can contain it.
@@ -236,13 +241,7 @@ declare namespace ActiveEffect {
236
241
  * The name of the ActiveEffect
237
242
  * @defaultValue `""`
238
243
  */
239
- name: fields.StringField<
240
- { required: true; blank: false; textSearch: true },
241
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
242
- string,
243
- string,
244
- string
245
- >;
244
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
246
245
 
247
246
  /**
248
247
  * An image path used to depict the ActiveEffect as an icon
@@ -340,8 +339,7 @@ declare namespace ActiveEffect {
340
339
  integer: true;
341
340
  initial: typeof CONST.ACTIVE_EFFECT_MODES.ADD;
342
341
  },
343
- // TODO: (LukeAbby): fix this when redoing DataField
344
- // FIXME: Overrides required to enforce the branded type
342
+ // Note(LukeAbby): This will always need an override since there's no validation.
345
343
  CONST.ACTIVE_EFFECT_MODES | null | undefined,
346
344
  CONST.ACTIVE_EFFECT_MODES,
347
345
  CONST.ACTIVE_EFFECT_MODES
@@ -109,7 +109,14 @@ declare namespace ActorDelta {
109
109
  /**
110
110
  * @internal
111
111
  */
112
- interface _SystemMap extends Document.Internal.SystemMap<"ActorDelta"> {}
112
+ // Actor and ActorDelta have the same subtype setup.
113
+ interface _ModelMap extends Actor._ModelMap {}
114
+
115
+ /**
116
+ * @internal
117
+ */
118
+ // Actor and ActorDelta have the same subtype setup.
119
+ interface _SystemMap extends Actor._SystemMap {}
113
120
 
114
121
  /**
115
122
  * A document's parent is something that can contain it.
@@ -120,7 +120,12 @@ declare namespace Actor {
120
120
  /**
121
121
  * @internal
122
122
  */
123
- interface _SystemMap extends Document.Internal.SystemMap<"Actor"> {}
123
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
124
+
125
+ /**
126
+ * @internal
127
+ */
128
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
124
129
 
125
130
  /**
126
131
  * A document's parent is something that can contain it.
@@ -294,13 +299,7 @@ declare namespace Actor {
294
299
  _id: fields.DocumentIdField;
295
300
 
296
301
  /** The name of this Actor */
297
- name: fields.StringField<
298
- { required: true; blank: false; textSearch: true },
299
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
300
- string,
301
- string,
302
- string
303
- >;
302
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
304
303
 
305
304
  /** An Actor subtype which configures the system data model applied */
306
305
  // eslint-disable-next-line @typescript-eslint/no-empty-object-type
@@ -543,7 +542,8 @@ declare namespace Actor {
543
542
  }
544
543
 
545
544
  type ItemTypes = {
546
- [SubType in Item.SubType]: Array<Item.OfType<SubType>>;
545
+ // Note(LukeAbby): `keyof Item._SystemMap` is used to preserve optional modifiers
546
+ [SubType in keyof Item._SystemMap]: Array<Item.OfType<SubType>>;
547
547
  };
548
548
 
549
549
  type GetActiveTokensReturn<Document extends boolean | undefined> = Document extends true
@@ -171,17 +171,11 @@ declare namespace Adventure {
171
171
  /**
172
172
  * The human-readable name of the Adventure
173
173
  */
174
- name: fields.StringField<
175
- {
176
- required: true;
177
- blank: false;
178
- textSearch: true;
179
- },
180
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
181
- string,
182
- string,
183
- string
184
- >;
174
+ name: fields.StringField<{
175
+ required: true;
176
+ blank: false;
177
+ textSearch: true;
178
+ }>;
185
179
 
186
180
  /**
187
181
  * The file path for the primary image of the adventure
@@ -110,7 +110,12 @@ declare namespace Card {
110
110
  /**
111
111
  * @internal
112
112
  */
113
- interface _SystemMap extends Document.Internal.SystemMap<"Card"> {}
113
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
114
+
115
+ /**
116
+ * @internal
117
+ */
118
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
114
119
 
115
120
  /**
116
121
  * A document's parent is something that can contain it.
@@ -229,13 +234,7 @@ declare namespace Card {
229
234
  _id: fields.DocumentIdField;
230
235
 
231
236
  /** The text name of this card */
232
- name: fields.StringField<
233
- { required: true; blank: false; textSearch: true },
234
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
235
- string,
236
- string,
237
- string
238
- >;
237
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
239
238
 
240
239
  /**
241
240
  * A text description of this card which applies to all faces
@@ -115,7 +115,12 @@ declare namespace Cards {
115
115
  /**
116
116
  * @internal
117
117
  */
118
- interface _SystemMap extends Document.Internal.SystemMap<"Cards"> {}
118
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
119
+
120
+ /**
121
+ * @internal
122
+ */
123
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
119
124
 
120
125
  /**
121
126
  * A document's parent is something that can contain it.
@@ -109,7 +109,12 @@ declare namespace ChatMessage {
109
109
  /**
110
110
  * @internal
111
111
  */
112
- interface _SystemMap extends Document.Internal.SystemMap<"ChatMessage"> {}
112
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
113
+
114
+ /**
115
+ * @internal
116
+ */
117
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
113
118
 
114
119
  /**
115
120
  * A document's parent is something that can contain it.
@@ -116,7 +116,12 @@ declare namespace Combat {
116
116
  /**
117
117
  * @internal
118
118
  */
119
- interface _SystemMap extends Document.Internal.SystemMap<"Combat"> {}
119
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
120
+
121
+ /**
122
+ * @internal
123
+ */
124
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
120
125
 
121
126
  /**
122
127
  * A document's parent is something that can contain it.
@@ -95,7 +95,12 @@ declare namespace CombatantGroup {
95
95
  /**
96
96
  * @internal
97
97
  */
98
- interface _SystemMap extends Document.Internal.SystemMap<"CombatantGroup"> {}
98
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
99
+
100
+ /**
101
+ * @internal
102
+ */
103
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
99
104
 
100
105
  /**
101
106
  * A document's parent is something that can contain it.
@@ -110,7 +110,12 @@ declare namespace Combatant {
110
110
  /**
111
111
  * @internal
112
112
  */
113
- interface _SystemMap extends Document.Internal.SystemMap<"Combatant"> {}
113
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
114
+
115
+ /**
116
+ * @internal
117
+ */
118
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
114
119
 
115
120
  /**
116
121
  * A document's parent is something that can contain it.
@@ -211,13 +211,7 @@ declare namespace Folder {
211
211
  _id: fields.DocumentIdField;
212
212
 
213
213
  /** The name of this Folder */
214
- name: fields.StringField<
215
- { required: true; blank: false; textSearch: true },
216
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
217
- string,
218
- string,
219
- string
220
- >;
214
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
221
215
 
222
216
  /** The document type which this Folder contains, from {@linkcode CONST.FOLDER_DOCUMENT_TYPES} */
223
217
  // eslint-disable-next-line @typescript-eslint/no-empty-object-type
@@ -117,7 +117,12 @@ declare namespace Item {
117
117
  /**
118
118
  * @internal
119
119
  */
120
- interface _SystemMap extends Document.Internal.SystemMap<"Item"> {}
120
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
121
+
122
+ /**
123
+ * @internal
124
+ */
125
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
121
126
 
122
127
  /**
123
128
  * A document's parent is something that can contain it.
@@ -291,13 +296,7 @@ declare namespace Item {
291
296
  _id: fields.DocumentIdField;
292
297
 
293
298
  /** The name of this Item */
294
- name: fields.StringField<
295
- { required: true; blank: false; textSearch: true },
296
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
297
- string,
298
- string,
299
- string
300
- >;
299
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
301
300
 
302
301
  /** An Item subtype which configures the system data model applied */
303
302
  // eslint-disable-next-line @typescript-eslint/no-empty-object-type
@@ -112,7 +112,12 @@ declare namespace JournalEntryPage {
112
112
  /**
113
113
  * @internal
114
114
  */
115
- interface _SystemMap extends Document.Internal.SystemMap<"JournalEntryPage"> {}
115
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
116
+
117
+ /**
118
+ * @internal
119
+ */
120
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
116
121
 
117
122
  /**
118
123
  * A document's parent is something that can contain it.
@@ -235,13 +240,7 @@ declare namespace JournalEntryPage {
235
240
  /**
236
241
  * The text name of this page.
237
242
  */
238
- name: fields.StringField<
239
- { required: true; blank: false; label: "JOURNALENTRYPAGE.PageTitle"; textSearch: true },
240
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
241
- string,
242
- string,
243
- string
244
- >;
243
+ name: fields.StringField<{ required: true; blank: false; label: "JOURNALENTRYPAGE.PageTitle"; textSearch: true }>;
245
244
 
246
245
  /**
247
246
  * The type of this page, in {@linkcode BaseJournalEntryPage.TYPES}.
@@ -248,13 +248,7 @@ declare namespace JournalEntry {
248
248
  /**
249
249
  * The name of this JournalEntry
250
250
  */
251
- name: fields.StringField<
252
- { required: true; blank: false; textSearch: true },
253
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
254
- string,
255
- string,
256
- string
257
- >;
251
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
258
252
 
259
253
  /**
260
254
  * The pages contained within this JournalEntry document
@@ -224,13 +224,7 @@ declare namespace Macro {
224
224
  * The name of this Macro
225
225
  * @defaultValue `""`
226
226
  */
227
- name: fields.StringField<
228
- { required: true; blank: false; textSearch: true },
229
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
230
- string,
231
- string,
232
- string
233
- >;
227
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
234
228
 
235
229
  /**
236
230
  * A Macro subtype from CONST.MACRO_TYPES
@@ -183,13 +183,7 @@ declare namespace PlaylistSound {
183
183
  /**
184
184
  * The name of this sound
185
185
  */
186
- name: fields.StringField<
187
- { required: true; blank: false; textSearch: true },
188
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
189
- string,
190
- string,
191
- string
192
- >;
186
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
193
187
 
194
188
  /**
195
189
  * The description of this sound
@@ -242,13 +242,7 @@ declare namespace Playlist {
242
242
  /**
243
243
  * The name of this playlist
244
244
  */
245
- name: fields.StringField<
246
- { required: true; blank: false; textSearch: true },
247
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
248
- string,
249
- string,
250
- string
251
- >;
245
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
252
246
 
253
247
  /**
254
248
  * The description of this playlist
@@ -121,7 +121,12 @@ declare namespace RegionBehavior {
121
121
  /**
122
122
  * @internal
123
123
  */
124
- interface _SystemMap extends Document.Internal.SystemMap<"RegionBehavior"> {}
124
+ interface _ModelMap extends Document.Internal.ModelMap<Name> {}
125
+
126
+ /**
127
+ * @internal
128
+ */
129
+ interface _SystemMap extends Document.Internal.SystemMap<Name> {}
125
130
 
126
131
  /**
127
132
  * A document's parent is something that can contain it.
@@ -517,13 +517,7 @@ declare namespace RegionDocument {
517
517
  /**
518
518
  * The name used to describe the Region
519
519
  */
520
- name: fields.StringField<
521
- { required: true; blank: false; textSearch: true },
522
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
523
- string,
524
- string,
525
- string
526
- >;
520
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
527
521
 
528
522
  /**
529
523
  * The color used to highlight the Region
@@ -238,13 +238,7 @@ declare namespace RollTable {
238
238
  * The name of this RollTable
239
239
  * @defaultValue `""`
240
240
  */
241
- name: fields.StringField<
242
- { required: true; blank: false; textSearch: true },
243
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
244
- string,
245
- string,
246
- string
247
- >;
241
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
248
242
 
249
243
  /**
250
244
  * An image file path which provides the thumbnail artwork for this RollTable
@@ -413,13 +413,7 @@ declare namespace Scene {
413
413
  * The name of this scene
414
414
  * @defaultValue `""`
415
415
  */
416
- name: fields.StringField<
417
- { required: true; blank: false; textSearch: true },
418
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
419
- string,
420
- string,
421
- string
422
- >;
416
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
423
417
 
424
418
  /**
425
419
  * Is this scene currently active? Only one scene may be active at a given time
@@ -184,13 +184,7 @@ declare namespace User {
184
184
  /**
185
185
  * The user's name.
186
186
  */
187
- name: fields.StringField<
188
- { required: true; blank: false; textSearch: true },
189
- // Note(LukeAbby): Field override because `blank: false` isn't fully accounted for or something.
190
- string,
191
- string,
192
- string
193
- >;
187
+ name: fields.StringField<{ required: true; blank: false; textSearch: true }>;
194
188
 
195
189
  /**
196
190
  * The user's role, see CONST.USER_ROLES.
@@ -1,12 +1,11 @@
1
1
  import type { Socket } from "socket.io-client";
2
2
  import type {
3
3
  ConfiguredModule,
4
- GetKey,
5
- EmptyObject,
6
4
  ValueOf,
7
5
  FixedInstanceType,
8
6
  InitializationHook,
9
7
  InitializedOn,
8
+ EmptyObject,
10
9
  } from "#utils";
11
10
  import type BasePackage from "#common/packages/base-package.d.mts";
12
11
  import type { Document } from "#common/abstract/_module.d.mts";
@@ -88,7 +87,7 @@ declare class InternalGame<RunEvents extends InitializationHook> {
88
87
  /**
89
88
  * A registry of document sub-types and their respective data models.
90
89
  */
91
- get model(): Game.Data["model"];
90
+ get model(): Game.Model;
92
91
 
93
92
  /**
94
93
  * @deprecated since v12, will be removed in v14
@@ -652,13 +651,26 @@ declare namespace Game {
652
651
 
653
652
  /** @internal */
654
653
  type _Model = {
655
- [DocumentType in Document.Type]: {
656
- // The `& string` is helpful even though there should never be any numeric/symbol keys.
657
- // This is because when `keyof Config<...>` is deferred then TypeScript does a bunch of proofs under the assumption that `SystemTypeNames` could be a `string | number` until proven otherwise.
658
- // This causes issues where there shouldn't be, for example it has been observed to obstruct the resolution of the `Actor` class.
659
- [SubType in Model.TypeNames<DocumentType>]: GetKey<GetKey<SourceConfig, DocumentType>, SubType, EmptyObject>;
660
- };
654
+ [DocumentType in Document.Type]: DocumentType extends Document.WithSystem
655
+ ? _ModelType<DocumentType>
656
+ : { base: EmptyObject };
661
657
  };
658
+
659
+ /** @internal */
660
+ type _ModelType<DocumentType extends Document.WithSystem> =
661
+ | (DocumentType extends "ActiveEffect" ? ActiveEffect._ModelMap : never)
662
+ | (DocumentType extends "ActorDelta" ? ActorDelta._ModelMap : never)
663
+ | (DocumentType extends "Actor" ? Actor._ModelMap : never)
664
+ | (DocumentType extends "Card" ? Card._ModelMap : never)
665
+ | (DocumentType extends "Cards" ? Cards._ModelMap : never)
666
+ | (DocumentType extends "ChatMessage" ? ChatMessage._ModelMap : never)
667
+ | (DocumentType extends "Combat" ? Combat._ModelMap : never)
668
+ | (DocumentType extends "Combatant" ? Combatant._ModelMap : never)
669
+ | (DocumentType extends "CombatantGroup" ? CombatantGroup._ModelMap : never)
670
+ | (DocumentType extends "Item" ? Item._ModelMap : never)
671
+ | (DocumentType extends "JournalEntryPage" ? JournalEntryPage._ModelMap : never)
672
+ | (DocumentType extends "RegionBehavior" ? RegionBehavior._ModelMap : never);
673
+
662
674
  interface Model extends _Model {}
663
675
 
664
676
  interface PackageWarning {
@@ -22,6 +22,8 @@ import type {
22
22
  AnyMutableObject,
23
23
  MaybePromise,
24
24
  Override,
25
+ SimpleMerge,
26
+ PrettifyType,
25
27
  } from "#utils";
26
28
  import type * as CONST from "../constants.mts";
27
29
  import type {
@@ -1132,30 +1134,65 @@ declare namespace Document {
1132
1134
  ? Configured["document"]
1133
1135
  : ReturnType<LazyDocument>;
1134
1136
 
1135
- type SystemMap<Name extends Document.WithSystem> = _SystemMap<
1137
+ type ModelMap<Name extends Document.WithSubTypes> = _ModelMap<
1136
1138
  Name,
1137
- GetKey<DataModelConfig, Name>,
1138
- GetKey<SourceConfig, Name>
1139
+ // `{}` is used to avoid `keyof never` issues.
1140
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
1141
+ GetKey<DataModelConfig, Name, {}>,
1142
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
1143
+ GetKey<SourceConfig, Name, {}>
1144
+ > &
1145
+ // `Document.ModuleSubType` has to be accounted for specially because of its perculiar nature.
1146
+ Record<Document.ModuleSubType, UnknownSystem>;
1147
+
1148
+ // Note(LukeAbby): This is written this way to preserve any optional modifiers.
1149
+ type _ModelMap<Name extends Document.WithSubTypes, DataModel, Config> = PrettifyType<
1150
+ SimpleMerge<
1151
+ {
1152
+ [SubType in keyof DataModel]: EmptyObject;
1153
+ } & {
1154
+ [SubType in Document.CoreTypesForName<Name>]: EmptyObject;
1155
+ },
1156
+ {
1157
+ [SubType in keyof Config]: EmptyObject;
1158
+ }
1159
+ >
1139
1160
  >;
1140
1161
 
1141
- type _SystemMap<Name extends Document.WithSystem, DataModel, SourceData> = {
1142
- [SubType in SubTypesOf<Name>]: DataModel extends {
1143
- [K in SubType]: abstract new (...args: infer _) => infer Model;
1144
- }
1145
- ? Model
1146
- : SourceData extends {
1147
- [K in SubType]: infer Source;
1148
- }
1149
- ? Source
1150
- : SubType extends Document.ModuleSubType
1151
- ? // eslint-disable-next-line @typescript-eslint/no-empty-object-type
1152
- {}
1153
- : UnknownSystem;
1154
- };
1162
+ type SystemMap<Name extends Document.WithSubTypes> = _SystemMap<
1163
+ Name,
1164
+ // `{}` is used to avoid `keyof never` issues.
1165
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
1166
+ GetKey<DataModelConfig, Name, {}>,
1167
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
1168
+ GetKey<DataConfig, Name, {}>
1169
+ > &
1170
+ // `Document.ModuleSubType` has to be accounted for specially because of its perculiar nature.
1171
+ Record<Document.ModuleSubType, UnknownSystem>;
1172
+
1173
+ // Note(LukeAbby): This is written this way to preserve any optional modifiers.
1174
+ type _SystemMap<Name extends Document.WithSubTypes, DataModel, Config> = PrettifyType<
1175
+ SimpleMerge<
1176
+ {
1177
+ [SubType in keyof DataModel]: DataModel[SubType] extends
1178
+ | (abstract new (...args: never) => infer Model extends DataModel.Any)
1179
+ | undefined
1180
+ ? Model
1181
+ : never;
1182
+ } & {
1183
+ [SubType in Document.CoreTypesForName<Name>]: EmptyObject;
1184
+ },
1185
+ {
1186
+ [SubType in keyof Config]: Config[SubType];
1187
+ }
1188
+ >
1189
+ >;
1155
1190
 
1156
- type SystemOfType<SystemMap extends Record<SubType, object>, SubType extends string> =
1157
- | DiscriminatedUnion<SystemMap[SubType]>
1158
- | (SubType extends ModuleSubType | "base" ? UnknownSystem : never);
1191
+ type SystemOfType<SystemMap extends Record<SubType, object | undefined>, SubType extends string> = SubType extends
1192
+ | ModuleSubType
1193
+ | "base"
1194
+ ? UnknownSystem
1195
+ : DiscriminatedUnion<NonNullable<SystemMap[SubType]>>;
1159
1196
 
1160
1197
  // TODO(LukeAbby): Improve the type display with a helper here.
1161
1198
  // TODO(LukeAbby): Add `StoredSource` for a better type display there.
@@ -5158,9 +5158,10 @@ declare namespace TypeDataField {
5158
5158
 
5159
5159
  /** @internal */
5160
5160
  type _Schemas<T> = {
5161
- [K in keyof T]: T[K] extends (abstract new (...args: never) => infer U extends DataModel.Any)
5161
+ // This `NonNullable` is necessary because a subtype can be optional.
5162
+ [K in keyof T]-?: T[K] extends (abstract new (...args: never) => infer U extends DataModel.Any) | undefined
5162
5163
  ? // eslint-disable-next-line @typescript-eslint/no-deprecated
5163
- U | SchemaField.AssignmentData<U["schema"]["fields"]>
5164
+ SchemaField.AssignmentData<U["schema"]["fields"]>
5164
5165
  : never;
5165
5166
  }[keyof T];
5166
5167
 
@@ -5179,7 +5180,9 @@ declare namespace TypeDataField {
5179
5180
 
5180
5181
  /** @internal */
5181
5182
  type _Instances<T> = {
5182
- [K in keyof T]: T[K] extends (abstract new (...args: never) => infer U extends DataModel.Any) ? U : never;
5183
+ [K in keyof T]-?: T[K] extends (abstract new (...args: never) => infer U extends DataModel.Any) | undefined
5184
+ ? U
5185
+ : never;
5183
5186
  }[keyof T];
5184
5187
 
5185
5188
  /**
@@ -5207,7 +5210,7 @@ declare namespace TypeDataField {
5207
5210
 
5208
5211
  /** @internal */
5209
5212
  type _Source<T> = {
5210
- [K in keyof T]: T[K] extends (abstract new (...args: never) => infer U extends DataModel.Any)
5213
+ [K in keyof T]-?: T[K] extends (abstract new (...args: never) => infer U extends DataModel.Any) | undefined
5211
5214
  ? U["_source"]
5212
5215
  : never;
5213
5216
  }[keyof T];
@@ -1,3 +1,5 @@
1
+ import type { Identity } from "#utils";
2
+
1
3
  export default Color;
2
4
 
3
5
  // `Color#fromString` breaks inheritance
@@ -306,7 +308,9 @@ declare class InternalColor extends PatchedNumber {
306
308
  static fromLinearRGB(linear: Color.RGBColorVector): Color;
307
309
  }
308
310
 
309
- declare const Color: typeof InternalColor & (new (...args: any) => number);
311
+ interface ColorConstructor extends Identity<typeof InternalColor & (new (...args: any) => number)> {}
312
+
313
+ declare const Color: ColorConstructor;
310
314
  type Color = InternalColor & number;
311
315
 
312
316
  declare namespace Color {
package/tsconfig.json CHANGED
@@ -5,5 +5,5 @@
5
5
  "include": ["**/*", ".*", ".**/**/*"],
6
6
  // `src/index-lenient.d.mts` is skipped because it sets `AssumeHookRan` which has some pretty global effects that would make it easy to write broken code.
7
7
  // `tests` are excluded to speed up typechecking.
8
- "exclude": ["src/index-lenient.d.mts", "tests", "test"]
8
+ "exclude": ["src/index-lenient.d.mts", "tests"]
9
9
  }