Repository: League-of-Foundry-Developers/foundry-vtt-types
Pull request #2775 (2024-08-10 22:25:18)

Remove document modification context
* delete all the individual override event handlers if they don't change the parent signature
* remove DocumentModificationContext and DocumentModificationOptions except from deprecated functions
* for others, replace them with new DocumentXXOperation<type> and DocumentOnXXOptions<type>/DocumentPreXXOptions<type>
* Updated compendium-collection and document-collection.d.mts to match .js for v12 changes
* Addresses parts of #2675 - including some updates to types.d.mts and the DocumentModificationContext stuff

dovrosenberg: Everything done at this point except tests

Patch:
diff --git a/package-lock.json b/package-lock.json
index 2dc26b671..7dd650d96 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "@league-of-foundry-developers/foundry-vtt-types",
-  "version": "12.329.0",
+  "version": "12.330.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "@league-of-foundry-developers/foundry-vtt-types",
-      "version": "12.329.0",
+      "version": "12.330.0",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index be02447cb..f955498f5 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package.json",
   "name": "@league-of-foundry-developers/foundry-vtt-types",
-  "version": "12.330.0",
+  "version": "12.331.0",
   "description": "TypeScript type definitions for Foundry VTT",
   "type": "module",
   "exports": {
diff --git a/src/foundry/client-esm/applications/forms/fields.d.mts b/src/foundry/client-esm/applications/forms/fields.d.mts
index 2a855230d..a6270a4c5 100644
--- a/src/foundry/client-esm/applications/forms/fields.d.mts
+++ b/src/foundry/client-esm/applications/forms/fields.d.mts
@@ -142,6 +142,7 @@ export interface FormSelectOption {
   group?: string;
   disabled?: boolean;
   selected?: boolean;
+  rule?: boolean;
 }
 
 // Compatible with multiple different types of FormInputConfig so this does *not* extend that interface
diff --git a/src/foundry/client/apps/sidebar/tabs/chat-log.d.mts b/src/foundry/client/apps/sidebar/tabs/chat-log.d.mts
index b0eaa7db2..49acff5c3 100644
--- a/src/foundry/client/apps/sidebar/tabs/chat-log.d.mts
+++ b/src/foundry/client/apps/sidebar/tabs/chat-log.d.mts
@@ -1,3 +1,5 @@
+import type { DocumentOnCreateOptions } from "../../../../common/abstract/document.d.mts";
+
 export {};
 
 declare global {
@@ -196,7 +198,7 @@ declare global {
       command: string,
       match: RegExpMatchArray[],
       chatData: foundry.documents.BaseChatMessage.ConstructorData,
-      createOptions: DocumentModificationContext,
+      createOptions: DocumentOnCreateOptions<"ChatMessage">,
     ): Promise<void>;
 
     /**
@@ -212,7 +214,7 @@ declare global {
       command: string,
       match: RegExpMatchArray,
       chatData: foundry.documents.BaseChatMessage.ConstructorData,
-      createOptions: DocumentModificationContext,
+      createOptions: DocumentOnCreateOptions<"ChatMessage">,
     ): void;
 
     /**
@@ -227,7 +229,7 @@ declare global {
       command: string,
       match: RegExpMatchArray,
       chatData: foundry.documents.BaseChatMessage.ConstructorData,
-      createOptions: DocumentModificationContext,
+      createOptions: DocumentOnCreateOptions<"ChatMessage">,
     ): void;
 
     /**
diff --git a/src/foundry/client/core/settings.d.mts b/src/foundry/client/core/settings.d.mts
index f82808bb2..8144f0ee9 100644
--- a/src/foundry/client/core/settings.d.mts
+++ b/src/foundry/client/core/settings.d.mts
@@ -1,4 +1,5 @@
 import type { DocumentSubTypes, DocumentType } from "../../../types/helperTypes.d.mts";
+import type { DocumentOnUpsertOptions } from "../../common/abstract/document.d.mts";
 import type { DeepPartial, EmptyObject, InexactPartial } from "../../../types/utils.d.mts";
 
 declare global {
@@ -159,7 +160,7 @@ declare global {
       namespace: N,
       key: K,
       value: V,
-      options?: DocumentModificationContext,
+      options?: DocumentOnUpsertOptions<"Setting">,
     ): Promise<V>;
   }
 
diff --git a/src/foundry/client/core/time.d.mts b/src/foundry/client/core/time.d.mts
index 01fc6ab61..fbb0c2ff3 100644
--- a/src/foundry/client/core/time.d.mts
+++ b/src/foundry/client/core/time.d.mts
@@ -1,4 +1,4 @@
-import type { DocumentModificationOptions } from "../../common/abstract/document.d.mts";
+import type { DocumentOnUpsertOptions } from "../../common/abstract/document.d.mts";
 
 declare global {
   /**
@@ -48,7 +48,7 @@ declare global {
      * @param options - Additional options passed to game.settings.set
      * @returns The new game time
      */
-    advance(seconds: number, options?: DocumentModificationOptions): Promise<number>;
+    advance(seconds: number, options?: DocumentOnUpsertOptions<"Setting">): Promise<number>;
 
     /**
      * Synchronize the local client game time with the official time kept by the server
diff --git a/src/foundry/client/data/abstract/canvas-document.d.mts b/src/foundry/client/data/abstract/canvas-document.d.mts
index 21ff44d72..e8e4f547f 100644
--- a/src/foundry/client/data/abstract/canvas-document.d.mts
+++ b/src/foundry/client/data/abstract/canvas-document.d.mts
@@ -41,8 +41,10 @@ declare class CanvasDocument<
    */
   get rendered(): boolean;
 
-  // _preCreate, _onCreate, _onUpdate, _onDelete intentionally omitted for type compilation complexity
-  // None of these overrides modify the function signature and so can be safely ignored
+  /**
+   * @privateRemarks _preCreate, _onCreate, _onUpdate, and _onDelete are all overridden but with no signature changes.
+   * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+   */
 }
 
 declare global {
diff --git a/src/foundry/client/data/abstract/client-document.d.mts b/src/foundry/client/data/abstract/client-document.d.mts
index cdcccca5a..2e475f604 100644
--- a/src/foundry/client/data/abstract/client-document.d.mts
+++ b/src/foundry/client/data/abstract/client-document.d.mts
@@ -4,8 +4,17 @@ import type {
   DocumentConstructor,
 } from "../../../../types/helperTypes.d.mts";
 import type { ConstructorOf, DeepPartial, InexactPartial, Mixin, ValueOf } from "../../../../types/utils.d.mts";
+import type { DatabaseCreateOperation } from "../../../common/abstract/_types.d.mts";
 import type Document from "../../../common/abstract/document.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type {
+  DocumentModificationOptions,
+  DocumentOnCreateOptions,
+  DocumentOnDeleteOptions,
+  DocumentOnUpdateOptions,
+  DocumentPreCreateOptions,
+  DocumentPreDeleteOptions,
+  DocumentPreUpdateOptions,
+} from "../../../common/abstract/document.d.mts";
 
 declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any = foundry.abstract.Document.Any> {
   /** @privateRemarks All mixin classses should accept anything for its constructor. */
@@ -211,7 +220,7 @@ declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any
     parent: ClientDocument,
     collection: string,
     data: unknown[],
-    options: DocumentModificationOptions,
+    options: DocumentPreCreateOptions<any>,
     userId: string,
   ): void;
 
@@ -229,7 +238,7 @@ declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any
     collection: string,
     documents: ClientDocument[],
     data: unknown[],
-    options: DocumentModificationOptions,
+    options: DocumentOnCreateOptions<any> & InexactPartial<{ render: boolean }>,
     userId: string,
   ): void;
   /**
@@ -244,7 +253,7 @@ declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any
     parent: ClientDocument,
     collection: string,
     changes: unknown[],
-    options: DocumentModificationOptions,
+    options: DocumentPreUpdateOptions<any>,
     userId: string,
   ): void;
 
@@ -262,7 +271,7 @@ declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any
     collection: string,
     documents: ClientDocument[],
     changes: unknown[],
-    options: DocumentModificationOptions,
+    options: DocumentOnUpdateOptions<any> & InexactPartial<{ render: boolean }>,
     userId: string,
   ): void;
 
@@ -278,7 +287,7 @@ declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any
     parent: ClientDocument,
     collection: string,
     ids: string[],
-    options: DocumentModificationOptions,
+    options: DocumentPreDeleteOptions<any>,
     userId: string,
   ): void;
 
@@ -296,7 +305,7 @@ declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any
     collection: string,
     documents: ClientDocument[],
     ids: string,
-    options: DocumentModificationOptions,
+    options: DocumentOnDeleteOptions<any> & InexactPartial<{ render: boolean }>,
     userId: string,
   ): void;
 
@@ -342,7 +351,7 @@ declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any
   static createDialog<T extends DocumentConstructor>(
     this: T,
     data?: DeepPartial<ConstructorDataType<T> | (ConstructorDataType<T> & Record<string, unknown>)>,
-    context?: Pick<DocumentModificationContext, "parent" | "pack"> &
+    context?: Pick<DatabaseCreateOperation<any>, "parent" | "pack"> &
       InexactPartial<
         DialogOptions & {
           /** A restriction the selectable sub-types of the Dialog. */
@@ -564,7 +573,7 @@ declare class ClientDocument<BaseDocument extends foundry.abstract.Document.Any
     embeddedName: string,
     documents: foundry.abstract.Document.Any[],
     result: Record<string, unknown>[],
-    options: DocumentModificationContext,
+    options: DocumentModificationOptions,
     userId: string,
   ): void;
 
diff --git a/src/foundry/client/data/abstract/document-collection.d.mts b/src/foundry/client/data/abstract/document-collection.d.mts
index 9b3812a6c..10daaef30 100644
--- a/src/foundry/client/data/abstract/document-collection.d.mts
+++ b/src/foundry/client/data/abstract/document-collection.d.mts
@@ -1,6 +1,6 @@
 import type { ConfiguredDocumentClass, DocumentConstructor } from "../../../../types/helperTypes.d.mts";
 import type { DeepPartial, InexactPartial, ConfiguredStoredDocument } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentOnUpdateOptions } from "../../../common/abstract/document.d.mts";
 // import type _Collection from "../../../common/utils/collection.d.mts";
 
 // Fix for "Class 'Collection<ConfiguredStoredDocument<T>>' defines instance member property 'delete',
@@ -163,7 +163,7 @@ declare global {
      * @param transformation - An object of data or function to apply to all matched objects
      * @param condition      - A function which tests whether to target each object
      *                         (default: `null`)
-     * @param options        - Additional options passed to Document.update
+     * @param options        - Additional options passed to Document.updateDocuments
      *                         (default: `{}`)
      * @returns An array of updated data once the operation is complete
      */
@@ -172,114 +172,8 @@ declare global {
         | DeepPartial<InstanceType<ConfiguredDocumentClass<T>>["_source"]>
         | ((doc: ConfiguredStoredDocument<T>) => DeepPartial<InstanceType<ConfiguredDocumentClass<T>>["_source"]>),
       condition?: ((obj: ConfiguredStoredDocument<T>) => boolean) | null,
-      options?: DocumentModificationContext,
+      options?: DocumentOnUpdateOptions<T["metadata"]["name"]>,
     ): ReturnType<this["documentClass"]["updateDocuments"]>;
-
-    /**
-     * Preliminary actions taken before a set of Documents in this Collection are created.
-     * @param result  - An Array of created data objects
-     * @param options - Options which modified the creation operation
-     * @param userId  - The ID of the User who triggered the operation
-     */
-    protected _preCreateDocuments(
-      result: (InstanceType<T>["_source"] & { _id: string })[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    /**
-     * Follow-up actions taken after a set of Documents in this Collection are created.
-     * @param documents - An Array of created Documents
-     * @param result    - An Array of created data objects
-     * @param options   - Options which modified the creation operation
-     * @param userId    - The ID of the User who triggered the operation
-     */
-    protected _onCreateDocuments(
-      documents: ConfiguredStoredDocument<T>[],
-      result: (InstanceType<T>["_source"] & { _id: string })[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    /**
-     * Preliminary actions taken before a set of Documents in this Collection are updated.
-     * @param result  - An Array of incremental data objects
-     * @param options - Options which modified the update operation
-     * @param userId  - The ID of the User who triggered the operation
-     */
-    protected _preUpdateDocuments(
-      result: (DeepPartial<InstanceType<T>["_source"]> & { _id: string })[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    /**
-     * Follow-up actions taken after a set of Documents in this Collection are updated.
-     * @param documents - An Array of updated Documents
-     * @param result    - An Array of incremental data objects
-     * @param options   - Options which modified the update operation
-     * @param userId    - The ID of the User who triggered the operation
-     */
-    protected _onUpdateDocuments(
-      documents: ConfiguredStoredDocument<T>[],
-      result: (DeepPartial<InstanceType<T>["_source"]> & { _id: string })[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    /**
-     * Preliminary actions taken before a set of Documents in this Collection are deleted.
-     * @param result  - An Array of document IDs being deleted
-     * @param options - Options which modified the deletion operation
-     * @param userId  - The ID of the User who triggered the operation
-     */
-    protected _preDeleteDocuments(result: string[], options: DocumentModificationOptions, userId: string): void;
-
-    /**
-     * Follow-up actions taken after a set of Documents in this Collection are deleted.
-     * @param documents - An Array of deleted Documents
-     * @param result    - An Array of document IDs being deleted
-     * @param options   - Options which modified the deletion operation
-     * @param userId    - The ID of the User who triggered the operation
-     */
-    protected _onDeleteDocuments(
-      documents: ConfiguredStoredDocument<T>[],
-      result: string[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    /**
-     * Handle shifting documents in a deleted folder to a new parent folder.
-     * @param parentFolder   - The parent folder to which documents should be shifted
-     * @param deleteFolderId - The ID of the folder being deleted
-     * @param deleteContents - Whether to delete the contents of the folder
-     */
-    protected _onDeleteFolder(parentFolder: Folder, deleteFolderId: string, deleteContents?: boolean): string[];
-
-    /**
-     * Generate the render context information provided for CRUD operations.
-     * @param action    - The CRUD operation.
-     * @param documents - The documents being operated on.
-     * @param data      - An array of creation or update objects, or an array of document IDs, depending on
-     *                    the operation.
-     * @internal
-     */
-    protected _getRenderContext(
-      action: DocumentCollection.RenderContext.Create<T>["action"],
-      documents: ConfiguredStoredDocument<T>[],
-      data: (InstanceType<T>["_source"] & { _id: string })[],
-    ): DocumentCollection.RenderContext.Create<T>;
-    protected _getRenderContext(
-      action: DocumentCollection.RenderContext.Update<T>["action"],
-      documents: ConfiguredStoredDocument<T>[],
-      data: (DeepPartial<InstanceType<T>["_source"]> & { _id: string })[],
-    ): DocumentCollection.RenderContext.Update<T>;
-    protected _getRenderContext(
-      action: DocumentCollection.RenderContext.Delete<T>["action"],
-      documents: ConfiguredStoredDocument<T>[],
-      data: string[],
-    ): DocumentCollection.RenderContext.Delete<T>;
   }
 
   namespace DocumentCollection {
diff --git a/src/foundry/client/data/abstract/world-collection.d.mts b/src/foundry/client/data/abstract/world-collection.d.mts
index 58c930b4c..de23cd9c8 100644
--- a/src/foundry/client/data/abstract/world-collection.d.mts
+++ b/src/foundry/client/data/abstract/world-collection.d.mts
@@ -4,6 +4,7 @@ import type {
   DocumentConstructor,
 } from "../../../../types/helperTypes.d.mts";
 import type { ConfiguredStoredDocument, DeepPartial, InexactPartial } from "../../../../types/utils.d.mts";
+import type { DocumentOnCreateOptions } from "../../../common/abstract/document.d.mts";
 import type { DirectoryCollectionMixin_DocumentCollection_Interface } from "./directory-collection-mixin.d.mts";
 
 declare const DirectoryCollectionMixin_DocumentCollection: DirectoryCollectionMixin_DocumentCollection_Interface;
@@ -56,13 +57,21 @@ declare global {
      *                     (default: `{}`)
      * @returns The imported Document instance
      */
+
+    /**
+     * @privateRemarks We've added everything in WorldCollection.FromCompendiumOptions to DatabaseCreateOperation
+     * because they get passed through to Document.create() by this function.  So the
+     * union type isn't really needed.  Leaving it because it feels like foundry will pull
+     * those back out in the future (and we could miss it because we added them to
+     * DatabaseCreateOperation but the foundry typedef doesn't have them).
+     */
     importFromCompendium(
       pack: CompendiumCollection<
         CompendiumCollection.Metadata & { type: ConfiguredDocumentClass<T>["metadata"]["name"] }
       >,
       id: string,
       updateData?: DeepPartial<InstanceType<ConfiguredDocumentClass<T>>["_source"]>,
-      options?: InexactPartial<DocumentModificationContext & WorldCollection.FromCompendiumOptions>,
+      options?: InexactPartial<DocumentOnCreateOptions<T["metadata"]["name"]> & WorldCollection.FromCompendiumOptions>,
     ): Promise<ConfiguredStoredDocument<T>>;
 
     /**
diff --git a/src/foundry/client/data/collections/compendium-collection.d.mts b/src/foundry/client/data/collections/compendium-collection.d.mts
index 3bf709b87..99f7d9d62 100644
--- a/src/foundry/client/data/collections/compendium-collection.d.mts
+++ b/src/foundry/client/data/collections/compendium-collection.d.mts
@@ -1,6 +1,11 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type {
+  DatabaseCreateOperation,
+  DatabaseDeleteOperation,
+  DatabaseUpdateOperation,
+} from "../../../common/abstract/_types.d.mts";
+import type { DocumentOnCreateOptions, DocumentOnUpdateOptions } from "../../../common/abstract/document.d.mts";
 import type { DeepPartial, EmptyObject, InexactPartial, StoredDocument } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { DirectoryCollectionMixin_DocumentCollection_Interface } from "../abstract/directory-collection-mixin.d.mts";
 
 declare const DirectoryCollectionMixin_DocumentCollection: DirectoryCollectionMixin_DocumentCollection_Interface;
@@ -76,7 +81,7 @@ declare global {
     get collection(): this["metadata"]["id"];
 
     /** The banner image for this Compendium pack, or the default image for the pack type if no image is set. */
-    get banner(): string;
+    get banner(): string | null | void;
 
     /**
      * A reference to the Application class which provides an interface to interact with this compendium content.
@@ -173,6 +178,8 @@ declare global {
 
     delete: (id: string) => boolean;
 
+    clear: () => void;
+
     /**
      * Load the Compendium index and cache it as the keys and values of the Collection.
      * @param options - Options which customize how the index is created
@@ -300,7 +307,7 @@ declare global {
            * @defaultValue `""`
            * */
           folderName: string;
-        } & DocumentModificationContext &
+        } & DocumentOnCreateOptions<this["metadata"]["type"]> &
           WorldCollection.FromCompendiumOptions
       >,
     ): Promise<StoredDocument<DocumentInstanceForCompendiumMetadata<T>>[]>;
@@ -344,7 +351,7 @@ declare global {
      */
     static createCompendium<T extends CompendiumCollection.Metadata>(
       metadata: T,
-      options?: Partial<DocumentModificationOptions>,
+      options?: DocumentOnCreateOptions<T["type"]>,
     ): Promise<CompendiumCollection<T>>;
 
     /**
@@ -390,40 +397,33 @@ declare global {
             doc: StoredDocument<DocumentInstanceForCompendiumMetadata<T>>,
           ) => DeepPartial<DocumentInstanceForCompendiumMetadata<T>["_source"]>),
       condition?: ((obj: StoredDocument<DocumentInstanceForCompendiumMetadata<T>>) => boolean) | null,
-      options?: DocumentModificationContext,
+      options?: DocumentOnUpdateOptions<this["metadata"]["type"]>,
     ): ReturnType<this["documentClass"]["updateDocuments"]>;
 
-    protected _onCreateDocuments(
-      documents: StoredDocument<DocumentInstanceForCompendiumMetadata<T>>[],
-      result: (DocumentInstanceForCompendiumMetadata<T>["_source"] & { _id: string })[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected _onUpdateDocuments(
-      documents: StoredDocument<DocumentInstanceForCompendiumMetadata<T>>[],
-      result: (DeepPartial<DocumentInstanceForCompendiumMetadata<T>["_source"]> & { _id: string })[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected _onDeleteDocuments(
-      documents: StoredDocument<DocumentInstanceForCompendiumMetadata<T>>[],
-      result: string[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected _onDeleteFolder(parentFolder: Folder, deleteFolderId: string, deleteContents?: boolean): string[];
-
     /**
      * Follow-up actions taken when Documents within this Compendium pack are modified
      * @internal
      */
-    protected _onModifyContents(
-      documents: StoredDocument<DocumentInstanceForCompendiumMetadata<T>>[],
-      options: DocumentModificationOptions,
-      userId: string,
+    _onModifyContents(
+      action: "create",
+      documents: ClientDocument[],
+      result: Record<string, unknown>[],
+      operation: DatabaseCreateOperation<DocumentClassForCompendiumMetadata<T>>,
+      user: User,
+    ): void;
+    _onModifyContents(
+      action: "update",
+      documents: ClientDocument[],
+      result: Record<string, unknown>[],
+      operation: DatabaseUpdateOperation<DocumentClassForCompendiumMetadata<T>>,
+      user: User,
+    ): void;
+    _onModifyContents(
+      action: "delete",
+      documents: ClientDocument[],
+      result: string[],
+      operation: DatabaseDeleteOperation<DocumentClassForCompendiumMetadata<T>>,
+      user: User,
     ): void;
 
     /**
@@ -473,24 +473,6 @@ declare global {
   }
 }
 
-interface ImportAllOptions {
-  /**
-   * An existing Folder _id to use.
-   * @defaultValue `null`
-   * */
-  folderId?: string | null | undefined;
-  /**
-   * A new Folder name to create.
-   * @defaultValue `""`
-   * */
-  folderName?: string | undefined;
-  /**
-   * Additional options forwarded to {@link WorldCollection#fromCompendium} and {@link Document.createDocuments}
-   * @defaultValue `{}`
-   */
-  options?: (DocumentModificationContext & WorldCollection.FromCompendiumOptions) | undefined;
-}
-
 type DocumentClassForCompendiumMetadata<T extends CompendiumCollection.Metadata> = ConfiguredDocumentClassForName<
   T["type"]
 >;
diff --git a/src/foundry/client/data/documents/active-effect.d.mts b/src/foundry/client/data/documents/active-effect.d.mts
index ff4886369..30730a4db 100644
--- a/src/foundry/client/data/documents/active-effect.d.mts
+++ b/src/foundry/client/data/documents/active-effect.d.mts
@@ -1,14 +1,23 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 
 import type { DataField } from "../../../common/data/fields.d.mts";
 import type { DataModel } from "../../../common/abstract/data.d.mts";
-import type BaseUser from "../../../common/documents/user.d.mts";
+import type Document from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace ActiveEffect {
     type ConfiguredClass = ConfiguredDocumentClassForName<"ActiveEffect">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations
+      extends DocumentDatabaseOperations<
+        ActiveEffect,
+        { animate: boolean },
+        { animate: boolean },
+        { animate: boolean }
+      > {}
   }
 
   /**
@@ -51,9 +60,6 @@ declare global {
       options?: DocumentConstructionContext,
     ): Promise<ActiveEffect.ConfiguredInstance>;
 
-    /* -------------------------------------------- */
-    /*  Properties                                  */
-    /* -------------------------------------------- */
     /**
      * Is there some system logic that makes this active effect ineligible for application?
      * @defaultValue `false`
@@ -63,7 +69,7 @@ declare global {
     /**
      * Retrieve the Document that this ActiveEffect targets for modification.
      */
-    get target(): Document | null;
+    get target(): Document.Any | null;
 
     /**
      * Whether the Active Effect currently applying its changes to the target.
@@ -123,10 +129,6 @@ declare global {
      */
     get sourceName(): string;
 
-    /* -------------------------------------------- */
-    /*  Methods                                     */
-    /* -------------------------------------------- */
-
     /**
      * Apply EffectChangeData to a field within a DataModel.
      * @param model  - The model instance.
@@ -288,43 +290,13 @@ declare global {
       };
     };
 
-    /* -------------------------------------------- */
-    /*  Flag Operations                             */
-    /* -------------------------------------------- */
     // TODO: This is a minor override and doing the extension is complicated
     // getFlag(scope: string, key: string): unknown;
 
-    protected _preCreate(
-      data: foundry.documents.BaseActiveEffect.ConstructorData,
-      options: DocumentModificationOptions,
-      user: foundry.documents.BaseUser,
-    ): Promise<void>;
-
-    /* -------------------------------------------- */
-    /*  Event Handlers                              */
-    /* -------------------------------------------- */
-
-    protected override _preCreate(
-      data: foundry.documents.BaseActiveEffect.ConstructorData,
-      options: DocumentModificationOptions,
-      user: BaseUser,
-    ): Promise<boolean | void>;
-
-    protected override _onCreate(data: this["_source"], options: DocumentModificationOptions, userId: string): void;
-
-    protected override _onUpdate(
-      data: foundry.documents.BaseActiveEffect.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _preUpdate(
-      changed: foundry.documents.BaseActiveEffect.UpdateData,
-      options: DocumentModificationOptions,
-      user: BaseUser,
-    ): Promise<boolean | void>;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _preCreate, _onCreate, _onUpdate, _preUpdate, and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Display changes to active effects as scrolling Token status text.
diff --git a/src/foundry/client/data/documents/actor-delta.d.mts b/src/foundry/client/data/documents/actor-delta.d.mts
index 43d780898..11de3718e 100644
--- a/src/foundry/client/data/documents/actor-delta.d.mts
+++ b/src/foundry/client/data/documents/actor-delta.d.mts
@@ -1,12 +1,15 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { SchemaField } from "../../../common/data/fields.d.mts";
 import type { BaseActor } from "../../../common/documents/_module.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace ActorDelta {
     type ConfiguredClass = ConfiguredDocumentClassForName<"ActorDelta">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<ActorDelta> {}
   }
 
   /**
@@ -64,13 +67,10 @@ declare global {
      */
     _handleDeltaCollectionUpdates(doc: Document): void;
 
-    protected override _onUpdate(
-      changed: foundry.documents.BaseActor.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onUpdate and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     protected override _dispatchDescendantDocumentEvents(
       event: ClientDocument.lifeCycleEventName,
diff --git a/src/foundry/client/data/documents/actor.d.mts b/src/foundry/client/data/documents/actor.d.mts
index e869fb578..5f85bc621 100644
--- a/src/foundry/client/data/documents/actor.d.mts
+++ b/src/foundry/client/data/documents/actor.d.mts
@@ -1,12 +1,15 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
 import type { DeepPartial, InexactPartial } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations, DocumentOnUpdateOptions } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Actor {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Actor">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Actor> {}
+
     interface RollInitiativeOptions {
       /**
        * Create new Combatant entries for Tokens associated with this actor.
@@ -243,12 +246,6 @@ declare global {
      */
     protected _unregisterDependentScene(scene: Scene): void;
 
-    protected override _preCreate(
-      data: foundry.documents.BaseActor.ConstructorData,
-      options: DocumentModificationOptions,
-      user: foundry.documents.BaseUser,
-    ): Promise<void>;
-
     /**
      * When an Actor is being created, apply default token configuration settings to its prototype token.
      * @param data    - Data explicitly provided to the creation workflow
@@ -265,38 +262,10 @@ declare global {
       }>,
     ): ReturnType<this["updateSource"]>;
 
-    protected override _onUpdate(
-      changed: foundry.documents.BaseActor.UpdateData,
-      options: DocumentModificationOptions,
-      user: string,
-    ): void;
-
-    protected override _onCreateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      documents: ClientDocument[],
-      data: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onUpdateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      documents: ClientDocument[],
-      changes: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDeleteDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      documents: ClientDocument[],
-      ids: string,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    /**
+     * @privateRemarks _preCreate, _onUpdate, onCreateDescendantDocuments, onUpdateDescendantDocuments, and _onDeleteDescendentDocuments are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Additional workflows to perform when any descendant document within this Actor changes.
@@ -309,6 +278,9 @@ declare global {
      * @param update  - The update delta.
      * @param options - The update context.
      */
-    _updateDependentTokens(update: DeepPartial<TokenDocument["_source"]>, options: DocumentModificationContext): void;
+    _updateDependentTokens(
+      update: DeepPartial<TokenDocument["_source"]>,
+      options: DocumentOnUpdateOptions<"Token">,
+    ): void;
   }
 }
diff --git a/src/foundry/client/data/documents/adventure.d.mts b/src/foundry/client/data/documents/adventure.d.mts
index 660979035..d9d6e0132 100644
--- a/src/foundry/client/data/documents/adventure.d.mts
+++ b/src/foundry/client/data/documents/adventure.d.mts
@@ -3,12 +3,16 @@ import type { InexactPartial } from "../../../../types/utils.d.mts";
 // eslint-disable-next-line import/no-named-as-default
 import type DataModel from "../../../common/abstract/data.d.mts";
 import type { fields } from "../../../common/data/module.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Adventure {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Adventure">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Adventure> {}
+
     interface PrepareImportOptions {
       /**
        * A subset of adventure fields to import.
diff --git a/src/foundry/client/data/documents/ambient-light.d.mts b/src/foundry/client/data/documents/ambient-light.d.mts
index 1d4caaae8..5f93abbe1 100644
--- a/src/foundry/client/data/documents/ambient-light.d.mts
+++ b/src/foundry/client/data/documents/ambient-light.d.mts
@@ -1,10 +1,15 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace AmbientLightDocument {
     type ConfiguredClass = ConfiguredDocumentClassForName<"AmbientLight">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations
+      extends DocumentDatabaseOperations<AmbientLightDocument, {}, { animate: boolean }, {}> {}
+    /* eslint-enable @typescript-eslint/no-empty-object-type */
   }
 
   /**
@@ -14,11 +19,10 @@ declare global {
    * @see {@link AmbientLightConfig}        The AmbientLight configuration application
    */
   class AmbientLightDocument extends CanvasDocumentMixin(foundry.documents.BaseAmbientLight) {
-    protected override _onUpdate(
-      changed: foundry.documents.BaseAmbientLight.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    /**
+     * @privateRemarks _onUpdate is overridden but with no signature changes.
+     * For type simplicity it is left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Is this ambient light source global in nature?
diff --git a/src/foundry/client/data/documents/ambient-sound.d.mts b/src/foundry/client/data/documents/ambient-sound.d.mts
index 44c28ba0c..19ed1420e 100644
--- a/src/foundry/client/data/documents/ambient-sound.d.mts
+++ b/src/foundry/client/data/documents/ambient-sound.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace AmbientSoundDocument {
     type ConfiguredClass = ConfiguredDocumentClassForName<"AmbientSound">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<AmbientSoundDocument> {}
   }
 
   /**
diff --git a/src/foundry/client/data/documents/card.d.mts b/src/foundry/client/data/documents/card.d.mts
index cf7c84cda..9910432f1 100644
--- a/src/foundry/client/data/documents/card.d.mts
+++ b/src/foundry/client/data/documents/card.d.mts
@@ -1,10 +1,14 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
-import type { DeepPartial } from "../../../../types/utils.d.mts";
+import type { DeepPartial, InexactPartial } from "../../../../types/utils.d.mts";
+import type { DocumentDatabaseOperations, DocumentOnCreateOptions } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Card {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Card">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Card> {}
   }
 
   /**
@@ -89,9 +93,9 @@ declare global {
 
     /**
      * Recall this Card to its original Cards parent.
-     * @param options - Options which modify the reset operation
+     * @param options - Options which modify the recall operation
      *                  (default: `{}`)
-     * @returns A reference to the reset card belonging to its original parent
+     * @returns A reference to the recallled card belonging to its original parent
      */
     recall(options?: Cards.ResetOptions): Promise<Card.ConfiguredInstance>;
 
@@ -105,7 +109,7 @@ declare global {
      */
     toMessage(
       messageData?: DeepPartial<foundry.documents.BaseChatMessage.ConstructorData>,
-      options?: DocumentModificationContext,
+      options?: InexactPartial<DocumentOnCreateOptions<"ChatMessage">>,
     ): Promise<ChatMessage.ConfiguredInstance | undefined>;
   }
 }
diff --git a/src/foundry/client/data/documents/cards.d.mts b/src/foundry/client/data/documents/cards.d.mts
index e4396fc62..d7d316cc1 100644
--- a/src/foundry/client/data/documents/cards.d.mts
+++ b/src/foundry/client/data/documents/cards.d.mts
@@ -3,18 +3,20 @@ import type {
   ConfiguredDocumentClass,
   ConstructorDataType,
   DocumentConstructor,
+  DatabaseOperationsFor,
 } from "../../../../types/helperTypes.d.mts";
 import type { DeepPartial, InexactPartial, StoredDocument } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { fields } from "../../../common/data/module.d.mts";
-import type BaseCards from "../../../common/documents/cards.d.mts";
-import type BaseUser from "../../../common/documents/user.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Cards {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Cards">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Cards> {}
+
     type CardsAction = "deal" | "pass";
 
     interface BaseOperationOptions {
@@ -22,7 +24,7 @@ declare global {
        * Create a ChatMessage which notifies that this action has occurred
        * @defaultValue `true`
        */
-      chatNotification: boolean;
+      chatNotification: boolean | undefined;
     }
 
     interface DealOptions extends BaseOperationOptions {
@@ -74,6 +76,12 @@ declare global {
        * @defaultValue `"pass"`
        */
       action: string | undefined;
+
+      /**
+       * Create a ChatMessage which notifies that this action has occurred
+       * @defaultValue `true`
+       */
+      chatNotification: boolean | undefined;
     }
 
     interface DrawOptions extends PassOptions {
@@ -96,9 +104,13 @@ declare global {
        * Modifications to make to each Card as part of the shuffle operation,
        * for example the displayed face
        * @defaultValue `{}`
-       * @remarks This is not actually used by {@link Cards.shuffle}.
        */
       updateData: DeepPartial<Card["_source"]>;
+
+      /** Create a ChatMessage which notifies that this action has occurred
+       *  @defaultValue `true`
+       */
+      chatNotification: boolean | undefined;
     }
 
     /** Options which modify the reset operation */
@@ -160,19 +172,21 @@ declare global {
      */
     get canClone(): boolean;
 
-    // TODO: Figure out the typing here
     static override createDocuments(
-      data: Array<ConstructorDataType<typeof Cards> | (ConstructorDataType<typeof Cards> & Record<string, unknown>)>,
-      context: DocumentModificationContext & { temporary: false },
+      data: Array<foundry.documents.BaseCards.UpdateData & Record<string, unknown>>,
+      context: DatabaseOperationsFor<Cards["documentName"], "create"> & {
+        temporary?: false | undefined;
+      },
     ): Promise<StoredDocument<Cards.ConfiguredInstance>[]>;
-    static createDocuments(
-      data: Array<ConstructorDataType<typeof Cards> | (ConstructorDataType<typeof Cards> & Record<string, unknown>)>,
-      context: DocumentModificationContext & { temporary: boolean },
+    static override createDocuments(
+      data: Array<
+        | fields.SchemaField.AssignmentType<Cards["schema"]["fields"]>
+        | (fields.SchemaField.AssignmentType<Cards["schema"]["fields"]> & Record<string, unknown>)
+      >,
+      context: DatabaseOperationsFor<Cards["documentName"], "create"> & {
+        temporary: true;
+      },
     ): Promise<Cards.ConfiguredInstance[]>;
-    static createDocuments(
-      data: Array<ConstructorDataType<typeof Cards> | (ConstructorDataType<typeof Cards> & Record<string, unknown>)>,
-      context?: DocumentModificationContext,
-    ): Promise<StoredDocument<Cards.ConfiguredInstance>[]>;
 
     /**
      * Deal one or more cards from this Cards document to each of a provided array of Cards destinations.
@@ -289,31 +303,10 @@ declare global {
       context: Record<string, unknown>,
     ): Promise<ChatMessage.ConfiguredInstance | undefined>;
 
-    protected override _preCreate(
-      // can't use UpdateData because it creates circular reference
-      data: fields.SchemaField.InnerAssignmentType<BaseCards.Schema>,
-      options: DocumentModificationOptions,
-      user: BaseUser,
-    ): Promise<boolean | void>;
-
-    protected override _onUpdate(
-      // can't use UpdateData because it creates circular reference
-      changed: fields.SchemaField.InnerAssignmentType<BaseCards.Schema>,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _preDelete(
-      options: DocumentModificationOptions,
-      user: foundry.documents.BaseUser,
-    ): Promise<void>;
-
-    // TODO: It's a bit weird that we have to do it in this generic way but otherwise there is an error overriding this. Investigate later.
-    static override deleteDocuments<T extends DocumentConstructor>(
-      this: T,
-      ids?: string[],
-      context?: DocumentModificationContext,
-    ): Promise<InstanceType<ConfiguredDocumentClass<T>>[]>;
+    /**
+     * @privateRemarks _preCreate, _onUpdate, and _preDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Display a dialog which prompts the user to deal cards to some number of hand-type Cards documents.
@@ -351,7 +344,7 @@ declare global {
     static override createDialog<T extends DocumentConstructor>(
       this: T,
       data?: DeepPartial<ConstructorDataType<T> | (ConstructorDataType<T> & Record<string, unknown>)>,
-      context?: Pick<DocumentModificationContext, "parent" | "pack"> &
+      context?: Pick<DatabaseOperationsFor<Cards["documentName"], "create">, "parent" | "pack"> &
         InexactPartial<
           DialogOptions & {
             /** A restriction the selectable sub-types of the Dialog. */
diff --git a/src/foundry/client/data/documents/chat-message.d.mts b/src/foundry/client/data/documents/chat-message.d.mts
index 91270b38f..2c1992f8e 100644
--- a/src/foundry/client/data/documents/chat-message.d.mts
+++ b/src/foundry/client/data/documents/chat-message.d.mts
@@ -1,12 +1,22 @@
 import type { ConfiguredDocumentClassForName, ToObjectFalseType } from "../../../../types/helperTypes.d.mts";
 import type { InexactPartial, StoredDocument } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace ChatMessage {
     type ConfiguredClass = ConfiguredDocumentClassForName<"ChatMessage">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations
+      extends DocumentDatabaseOperations<
+        ChatMessage,
+        { rollMode: foundry.CONST.DICE_ROLL_MODES; chatBubble: boolean },
+        {},
+        {}
+      > {}
+    /* eslint-enable @typescript-eslint/no-empty-object-type */
+
     interface GetSpeakerOptions {
       /** The Scene in which the speaker resides */
       scene: Scene | null;
@@ -54,10 +64,6 @@ declare global {
      */
     logged: boolean;
 
-    /* -------------------------------------------- */
-    /*  Properties                                  */
-    /* -------------------------------------------- */
-
     /**
      * Return the recommended String alias for this message.
      * The alias could be a Token name in the case of in-character messages or dice rolls.
@@ -87,10 +93,6 @@ declare global {
      */
     get visible(): boolean;
 
-    /* -------------------------------------------- */
-    /*  Methods                                     */
-    /* -------------------------------------------- */
-
     override prepareDerivedData(): void;
 
     /**
@@ -203,28 +205,10 @@ declare global {
      */
     protected _renderRollHTML(isPrivate: boolean): Promise<string>;
 
-    /* -------------------------------------------- */
-    /*  Event Handlers                              */
-    /* -------------------------------------------- */
-    protected override _preCreate(
-      data: foundry.documents.BaseChatMessage.ConstructorData,
-      options: DocumentModificationOptions,
-      user: foundry.documents.BaseUser,
-    ): Promise<void>;
-
-    protected override _onCreate(data: this["_source"], options: DocumentModificationOptions, userId: string): void;
-
-    protected override _onUpdate(
-      data: foundry.documents.BaseChatMessage.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
-
-    /* -------------------------------------------- */
-    /*  Importing and Exporting                     */
-    /* -------------------------------------------- */
+    /**
+     * @privateRemarks _preCreate, _onCreate, _onUpdate, and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Export the content of the chat message into a standardized log format
diff --git a/src/foundry/client/data/documents/combat.d.mts b/src/foundry/client/data/documents/combat.d.mts
index 19c1eacdc..29d7b52db 100644
--- a/src/foundry/client/data/documents/combat.d.mts
+++ b/src/foundry/client/data/documents/combat.d.mts
@@ -1,12 +1,27 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
-import type { ConstructorOf } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { ConstructorOf, InexactPartial } from "../../../../types/utils.d.mts";
+import type {
+  DocumentDatabaseOperations,
+  DocumentOnCreateOptions,
+  DocumentOnDeleteOptions,
+  DocumentOnUpdateOptions,
+} from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Combat {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Combat">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations
+      extends DocumentDatabaseOperations<
+        Combat,
+        {},
+        { direction: -1 | 1; worldTime: { delta: number }; turnEvents: boolean },
+        {}
+      > {}
+    /* eslint-enable @typescript-eslint/no-empty-object-type */
+
     interface InitiativeOptions {
       /**
        * A non-default initiative formula to roll. Otherwise the system default is used.
@@ -88,9 +103,7 @@ declare global {
      * Deactivate all other Combat encounters within the viewed Scene and set this one as active
      * @param options - Additional context to customize the update workflow
      */
-    activate(
-      options?: DocumentModificationContext & foundry.utils.MergeObjectOptions,
-    ): Promise<Combat.ConfiguredInstance[]>;
+    activate(options?: DocumentOnUpdateOptions<"Combat">): Promise<Combat.ConfiguredInstance[]>;
 
     override prepareDerivedData(): void;
 
@@ -197,23 +210,17 @@ declare global {
      */
     protected _refreshTokenHUD(documents: Array<Combatant>): void;
 
-    protected override _onCreate(data: this["_source"], options: DocumentModificationOptions, userId: string): void;
-
-    protected override _onUpdate(
-      changed: foundry.documents.BaseCombatant.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onCreate, _onUpdate, and _onDelete  are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
-    // TODO: Consider hardening the types based on the known properties of the schema
     protected override _onCreateDescendantDocuments(
       parent: ClientDocument,
       collection: string,
       documents: ClientDocument[],
       result: unknown[],
-      options: DocumentModificationOptions,
+      options: DocumentOnCreateOptions<"Combatant"> & InexactPartial<{ combatTurn: number; turnEvents: boolean }>,
       userId: string,
     ): void;
 
@@ -222,7 +229,7 @@ declare global {
       collection: string,
       documents: ClientDocument[],
       changes: unknown[],
-      options: DocumentModificationOptions,
+      options: DocumentOnUpdateOptions<"Combatant"> & InexactPartial<{ combatTurn: number; turnEvents: boolean }>,
       userId: string,
     ): void;
 
@@ -231,10 +238,9 @@ declare global {
       collection: string,
       documents: ClientDocument[],
       ids: string,
-      options: DocumentModificationOptions,
+      options: DocumentOnDeleteOptions<"Combatant"> & InexactPartial<{ combatTurn: number; turnEvents: boolean }>,
       userId: string,
     ): void;
-
     /**
      * Manage the execution of Combat lifecycle events.
      * This method orchestrates the execution of four events in the following order, as applicable:
diff --git a/src/foundry/client/data/documents/combatant.d.mts b/src/foundry/client/data/documents/combatant.d.mts
index 1c01b8c26..ab3c270cf 100644
--- a/src/foundry/client/data/documents/combatant.d.mts
+++ b/src/foundry/client/data/documents/combatant.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Combatant {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Combatant">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Combatant> {}
   }
 
   /**
diff --git a/src/foundry/client/data/documents/drawing.d.mts b/src/foundry/client/data/documents/drawing.d.mts
index 4b5d68235..395619911 100644
--- a/src/foundry/client/data/documents/drawing.d.mts
+++ b/src/foundry/client/data/documents/drawing.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace DrawingDocument {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Drawing">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<DrawingDocument> {}
   }
 
   /**
diff --git a/src/foundry/client/data/documents/fog-exploration.d.mts b/src/foundry/client/data/documents/fog-exploration.d.mts
index a92e5eec8..aadd63d0c 100644
--- a/src/foundry/client/data/documents/fog-exploration.d.mts
+++ b/src/foundry/client/data/documents/fog-exploration.d.mts
@@ -1,12 +1,20 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
 import type { InexactPartial } from "../../../../types/utils.d.mts";
-import type { DatabaseGetOperation } from "../../../common/abstract/_types.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace FogExploration {
     type ConfiguredClass = ConfiguredDocumentClassForName<"FogExploration">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations
+      extends DocumentDatabaseOperations<
+        FogExploration,
+        { loadFog: boolean },
+        { loadFog: boolean },
+        { loadFog: boolean }
+      > {}
   }
 
   /**
@@ -35,14 +43,9 @@ declare global {
      */
     getTexture(): PIXI.Texture | null;
 
-    protected override _onCreate(data: this["_source"], options: DocumentModificationOptions, userId: string): void;
-
-    protected override _onUpdate(
-      changed: foundry.documents.BaseFogExploration.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onCreate, _onUpdate, and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
   }
 }
diff --git a/src/foundry/client/data/documents/folder.d.mts b/src/foundry/client/data/documents/folder.d.mts
index 6e150eaa0..97db79a38 100644
--- a/src/foundry/client/data/documents/folder.d.mts
+++ b/src/foundry/client/data/documents/folder.d.mts
@@ -6,15 +6,16 @@ import type {
   DocumentType,
 } from "../../../../types/helperTypes.d.mts";
 import type { DeepPartial } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
-import type BaseFolder from "../../../common/documents/folder.d.mts";
-import type { BaseUser } from "../../../common/documents/_module.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Folder {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Folder">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Folder> {}
+
     interface ExportToCompendiumOptions {
       /** Update existing entries in the Compendium pack, matching by name */
       updateByName?: boolean | undefined;
@@ -81,11 +82,10 @@ declare global {
      */
     get ancestors(): Folder.ConfiguredInstance[];
 
-    protected _preCreate(
-      data: BaseFolder.ConstructorData,
-      options: DocumentModificationOptions,
-      user: BaseUser,
-    ): Promise<boolean | void>;
+    /**
+     * @privateRemarks _preCreate overridden but with no signature changes.
+     * For type simplicity it is left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     static createDialog<T extends DocumentConstructor>(
       this: T,
diff --git a/src/foundry/client/data/documents/item.d.mts b/src/foundry/client/data/documents/item.d.mts
index 7995a98e1..6b4ab1487 100644
--- a/src/foundry/client/data/documents/item.d.mts
+++ b/src/foundry/client/data/documents/item.d.mts
@@ -1,11 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
-import type { BaseUser } from "../../../common/documents/_module.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Item {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Item">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Item> {}
   }
 
   /**
@@ -46,14 +48,9 @@ declare global {
      */
     getRollData(): object;
 
-    protected override _preCreate(
-      data: foundry.documents.BaseItem.ConstructorData,
-      options: DocumentModificationOptions,
-      user: BaseUser,
-    ): Promise<boolean | void>;
-
     /**
-     * @privateRemarks _onCreateDocuments and _onDeleteDocuments are overridden but left off because the signature doesn't change and unnecessarily adds to the type complexity.
+     * @privateRemarks _preCreate, _onCreateDocuments and _onDeleteDocuments are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
      */
   }
 }
diff --git a/src/foundry/client/data/documents/journal-entry-page.d.mts b/src/foundry/client/data/documents/journal-entry-page.d.mts
index 330e40c46..0b37b197b 100644
--- a/src/foundry/client/data/documents/journal-entry-page.d.mts
+++ b/src/foundry/client/data/documents/journal-entry-page.d.mts
@@ -1,13 +1,15 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
 import type { InexactPartial } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
-import type BaseJournalEntryPage from "../../../common/documents/journal-entry-page.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace JournalEntryPage {
     type ConfiguredClass = ConfiguredDocumentClassForName<"JournalEntryPage">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<JournalEntryPage> {}
+
     interface JournalEntryPageHeading {
       /** The heading level, 1-6. */
       level: number;
@@ -115,11 +117,10 @@ declare global {
 
     override _onClickDocumentLink(event: MouseEvent): this;
 
-    protected override _onUpdate(
-      changed: BaseJournalEntryPage.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    /**
+     * @privateRemarks _onUpdate is overridden but with no signature changes.
+     * For type simplicity it is left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     protected override _buildEmbedHTML(
       config: TextEditor.DocumentHTMLEmbedConfig,
diff --git a/src/foundry/client/data/documents/journal-entry.d.mts b/src/foundry/client/data/documents/journal-entry.d.mts
index f3195c888..9c2f474bd 100644
--- a/src/foundry/client/data/documents/journal-entry.d.mts
+++ b/src/foundry/client/data/documents/journal-entry.d.mts
@@ -1,11 +1,14 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
-import type { BaseJournalEntry, BaseUser } from "../../../common/documents/_module.d.mts";
+import type { BaseUser } from "../../../common/documents/_module.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace JournalEntry {
     type ConfiguredClass = ConfiguredDocumentClassForName<"JournalEntry">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<JournalEntry> {}
   }
 
   /**
@@ -47,13 +50,10 @@ declare global {
      */
     panToNote(options?: PanToNoteOptions): Promise<void>;
 
-    protected override _onUpdate(
-      changed: BaseJournalEntry.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onUpdate and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
   }
 }
 
diff --git a/src/foundry/client/data/documents/macro.d.mts b/src/foundry/client/data/documents/macro.d.mts
index d797e6c61..d848b4bff 100644
--- a/src/foundry/client/data/documents/macro.d.mts
+++ b/src/foundry/client/data/documents/macro.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Macro {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Macro">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Macro> {}
   }
 
   /**
@@ -33,10 +37,11 @@ declare global {
     /**
      * Execute the Macro command.
      * @param scope - Macro execution scope which is passed to script macros
-     * @remarks `type === "chat"` returns void, `type === "script"` returns the promise
-     * @privateRemarks Foundry's stated return value is incorrect, #executeChat only returns `void`
+     * @returns A promising containing a created {@link ChatMessage} (or `undefined`) if a chat
+     *          macro or the return value if a script macro. A void return is possible if the user
+     *          is not permitted to execute macros or a script macro execution fails.
      */
-    execute(scope?: Scope): void | Promise<unknown>;
+    execute(scope?: Scope): Promise<ChatMessage | undefined> | Promise<unknown> | void;
 
     _onClickDocumentLink(event: MouseEvent): ReturnType<this["execute"]>;
   }
diff --git a/src/foundry/client/data/documents/measured-template.d.mts b/src/foundry/client/data/documents/measured-template.d.mts
index 0ccebe118..487b8f8f3 100644
--- a/src/foundry/client/data/documents/measured-template.d.mts
+++ b/src/foundry/client/data/documents/measured-template.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace MeasuredTemplateDocument {
     type ConfiguredClass = ConfiguredDocumentClassForName<"MeasuredTemplate">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<MeasuredTemplateDocument> {}
   }
 
   /**
diff --git a/src/foundry/client/data/documents/note.d.mts b/src/foundry/client/data/documents/note.d.mts
index c61bf8ceb..22585b5ee 100644
--- a/src/foundry/client/data/documents/note.d.mts
+++ b/src/foundry/client/data/documents/note.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace NoteDocument {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Note">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<NoteDocument> {}
   }
 
   /**
diff --git a/src/foundry/client/data/documents/playlist-sound.d.mts b/src/foundry/client/data/documents/playlist-sound.d.mts
index f03c3376b..b877076b8 100644
--- a/src/foundry/client/data/documents/playlist-sound.d.mts
+++ b/src/foundry/client/data/documents/playlist-sound.d.mts
@@ -1,11 +1,14 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
 import type { InexactPartial } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace PlaylistSound {
     type ConfiguredClass = ConfiguredDocumentClassForName<"PlaylistSound">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<PlaylistSound> {}
   }
 
   /**
@@ -79,15 +82,10 @@ declare global {
 
     _onClickDocumentLink(event: MouseEvent): ReturnType<Playlist.ConfiguredInstance["stopSound" | "playSound"]>;
 
-    protected override _onCreate(data: this["_source"], options: DocumentModificationOptions, userId: string): void;
-
-    protected override _onUpdate(
-      changed: foundry.documents.BaseAmbientSound.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onCreate, _onUpdate, and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Special handling that occurs when playback of a PlaylistSound is started.
diff --git a/src/foundry/client/data/documents/playlist.d.mts b/src/foundry/client/data/documents/playlist.d.mts
index cde8c34ec..f8216e6be 100644
--- a/src/foundry/client/data/documents/playlist.d.mts
+++ b/src/foundry/client/data/documents/playlist.d.mts
@@ -1,7 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
 import type { InexactPartial } from "../../../../types/utils.d.mts";
-import type Document from "../../../common/abstract/document.d.mts";
-import type { AnyMetadata, DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type {
+  AnyMetadata,
+  DocumentDatabaseOperations,
+  DocumentOnCreateOptions,
+  DocumentOnDeleteOptions,
+  DocumentOnUpdateOptions,
+} from "../../../common/abstract/document.d.mts";
+import type { Document } from "../../../common/abstract/module.d.mts";
 import type { ClientDocument } from "../abstract/client-document.d.mts";
 
 declare global {
@@ -9,6 +15,9 @@ declare global {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Playlist">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Playlist> {}
+
     interface PlayNextOptions {
       /**
        * Whether to advance forward (if 1) or backwards (if -1)
@@ -124,26 +133,17 @@ declare global {
 
     override _onClickDocumentLink(event: MouseEvent): ReturnType<this["playAll" | "stopAll"]>;
 
-    protected override _preUpdate(
-      changed: Playlist["_source"],
-      options: DocumentModificationOptions,
-      user: foundry.documents.BaseUser,
-    ): Promise<void>;
-
-    protected override _onUpdate(
-      changed: foundry.documents.BasePlaylist.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _preUpdate, _onUpdate, _onDelete, _onCreateDescendantDocuments, _onUpdateDescendantDocuments, and _onDeleteDescendantDocuments are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     protected override _onCreateDescendantDocuments(
       parent: ClientDocument<Document<any, AnyMetadata, null>>,
       collection: string,
       documents: ClientDocument<Document<any, AnyMetadata, null>>[],
       data: unknown[],
-      options: DocumentModificationOptions,
+      options: DocumentOnCreateOptions<"PlaylistSound">,
       userId: string,
     ): void;
 
@@ -152,7 +152,7 @@ declare global {
       collection: string,
       documents: ClientDocument<Document<any, AnyMetadata, null>>[],
       changes: unknown[],
-      options: DocumentModificationOptions,
+      options: DocumentOnUpdateOptions<"PlaylistSound">,
       userId: string,
     ): void;
 
@@ -161,7 +161,7 @@ declare global {
       collection: string,
       documents: ClientDocument<Document<any, AnyMetadata, null>>[],
       ids: string,
-      options: DocumentModificationOptions,
+      options: DocumentOnDeleteOptions<"PlaylistSound">,
       userId: string,
     ): void;
 
diff --git a/src/foundry/client/data/documents/scene.d.mts b/src/foundry/client/data/documents/scene.d.mts
index 56fb9943b..40803ab37 100644
--- a/src/foundry/client/data/documents/scene.d.mts
+++ b/src/foundry/client/data/documents/scene.d.mts
@@ -1,11 +1,21 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
 import type { InexactPartial } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Scene {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Scene">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations
+      extends DocumentDatabaseOperations<
+        Scene,
+        {},
+        { thumb: (string | null)[]; autoReposition: boolean; animateDarkness: number },
+        {}
+      > {}
+    /* eslint-enable @typescript-eslint/no-empty-object-type */
   }
 
   /**
@@ -92,23 +102,10 @@ declare global {
 
     override _onClickDocumentLink(event: MouseEvent): unknown;
 
-    protected override _preCreate(
-      data: foundry.documents.BaseScene.ConstructorData,
-      options: DocumentModificationOptions,
-      user: foundry.documents.BaseUser,
-    ): Promise<void>;
-
-    protected override _onCreate(
-      data: foundry.documents.BaseScene.ConstructorData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _preUpdate(
-      changed: foundry.documents.BaseScene.UpdateData,
-      options: DocumentModificationOptions,
-      user: foundry.documents.BaseUser,
-    ): Promise<void>;
+    /**
+     * @privateRemarks _onCreate, _preUpdate, _onUpdate, _preDelete, and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Handle repositioning of placed objects when the Scene dimensions change
@@ -117,57 +114,16 @@ declare global {
       sceneUpdateData: foundry.documents.BaseScene.ConstructorData,
     ): foundry.documents.BaseScene.ConstructorData;
 
-    protected override _onUpdate(
-      changed: foundry.documents.BaseScene.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _preDelete(
-      options: DocumentModificationOptions,
-      user: foundry.documents.BaseUser,
-    ): Promise<void>;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
-
     /**
      * Handle Scene activation workflow if the active state is changed to true
      * @param active - Is the scene now active?
      */
     protected _onActivate(active: boolean): ReturnType<this["view"]> | ReturnType<Canvas["draw"]>;
 
-    protected override _preCreateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      data: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _preUpdateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      changes: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _preDeleteDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      ids: string[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onUpdateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      documents: ClientDocument[],
-      changes: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    /**
+     * @privateRemarks _preCreateDescendantDocuments, _preUpdateDescendantDocuments, _preDeleteDescendantDocuments, and_onUpdateDescendantDocuments are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     override toCompendium<
       FlagsOpt extends boolean = false,
diff --git a/src/foundry/client/data/documents/setting.d.mts b/src/foundry/client/data/documents/setting.d.mts
index 8a909e210..6179818cd 100644
--- a/src/foundry/client/data/documents/setting.d.mts
+++ b/src/foundry/client/data/documents/setting.d.mts
@@ -1,10 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace Setting {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Setting">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<Setting> {}
   }
 
   /**
@@ -26,17 +29,10 @@ declare global {
     // TODO: This is the same as `DataModel._initialize`
     protected _initialize(options?: any): void;
 
-    protected override _onCreate(
-      data: foundry.documents.BaseSetting.ConstructorData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected _onUpdate(
-      changed: foundry.documents.BaseSetting.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    /**
+     * @privateRemarks _onCreate and _preUpdate are overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Cast the value of the Setting into its defined type.
diff --git a/src/foundry/client/data/documents/table-result.d.mts b/src/foundry/client/data/documents/table-result.d.mts
index ac33ce132..ecb1b1ca2 100644
--- a/src/foundry/client/data/documents/table-result.d.mts
+++ b/src/foundry/client/data/documents/table-result.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace TableResult {
     type ConfiguredClass = ConfiguredDocumentClassForName<"TableResult">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<TableResult> {}
   }
 
   /**
diff --git a/src/foundry/client/data/documents/table.d.mts b/src/foundry/client/data/documents/table.d.mts
index 75d2b0d1c..cef7787fc 100644
--- a/src/foundry/client/data/documents/table.d.mts
+++ b/src/foundry/client/data/documents/table.d.mts
@@ -1,13 +1,19 @@
 import type { ConfiguredDocumentClassForName, ConfiguredDocumentClass } from "../../../../types/helperTypes.d.mts";
 import type { InexactPartial } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
-import type { ClientDocument } from "../abstract/client-document.d.mts";
+import type {
+  DocumentDatabaseOperations,
+  DocumentOnCreateOptions,
+  DocumentOnDeleteOptions,
+} from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace RollTable {
     type ConfiguredClass = ConfiguredDocumentClassForName<"RollTable">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<RollTable> {}
+
     /**
      * Optional arguments which customize the draw
      */
@@ -60,7 +66,7 @@ declare global {
        * Additional options which customize the created messages
        * @defaultValue `{}`
        */
-      messageOptions: DocumentModificationContext & { rollMode: keyof CONFIG.Dice.RollModes | "roll" };
+      messageOptions: DocumentOnCreateOptions<"ChatMessage">;
     }
 
     interface RollOptions {
@@ -231,7 +237,7 @@ declare global {
      */
     protected _buildEmbedHTML(
       config: TextEditor.DocumentHTMLEmbedConfig & { rollable: boolean },
-      options?: RollTable.RollTableHTMLEmbedConfig,
+      options?: TextEditor.EnrichmentOptions,
     ): Promise<HTMLElement | null>;
 
     protected override _createFigureEmbed(
@@ -245,7 +251,7 @@ declare global {
       collection: string,
       documents: ClientDocument[],
       data: unknown[],
-      options: DocumentModificationOptions,
+      options: DocumentOnCreateOptions<"TableResult">,
       userId: string,
     ): void;
 
@@ -254,7 +260,7 @@ declare global {
       collection: string,
       documents: ClientDocument[],
       ids: string,
-      options: DocumentModificationOptions,
+      options: DocumentOnDeleteOptions<"TableResult">,
       userId: string,
     ): void;
 
@@ -288,7 +294,7 @@ declare global {
      */
     static fromFolder(
       folder: Folder,
-      options?: DocumentModificationOptions,
+      options?: DocumentOnCreateOptions<"Folder">,
     ): Promise<RollTable.ConfiguredInstance | undefined>;
   }
 
diff --git a/src/foundry/client/data/documents/tile.d.mts b/src/foundry/client/data/documents/tile.d.mts
index 76f727c2a..f5334e2c7 100644
--- a/src/foundry/client/data/documents/tile.d.mts
+++ b/src/foundry/client/data/documents/tile.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace TileDocument {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Tile">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<TileDocument> {}
   }
 
   /**
diff --git a/src/foundry/client/data/documents/token.d.mts b/src/foundry/client/data/documents/token.d.mts
index 12b598faa..8b887e2f7 100644
--- a/src/foundry/client/data/documents/token.d.mts
+++ b/src/foundry/client/data/documents/token.d.mts
@@ -1,16 +1,29 @@
 import type { ConfiguredDocumentClassForName, DocumentType } from "../../../../types/helperTypes.d.mts";
 import type { DeepPartial, InexactPartial } from "../../../../types/utils.d.mts";
-import type {
-  DatabaseCreateOperation,
-  DatabaseDeleteOperation,
-  DatabaseUpdateOperation,
-} from "../../../common/abstract/_types.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations, DocumentOnUpdateOptions } from "../../../common/abstract/document.d.mts";
+import type { SchemaField } from "../../../common/data/fields.d.mts";
 
 declare global {
   namespace TokenDocument {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Token">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations
+      extends DocumentDatabaseOperations<
+        TokenDocument,
+        {},
+        {
+          previousActorId: string | null;
+          animate: boolean;
+          _priorRegions: Record<string, string[]>;
+          _priorPosition: Record<string, { x: number; y: number; elevation: number }>;
+          teleport: boolean;
+          forced: boolean;
+        },
+        {}
+      > {}
+    /* eslint-enable @typescript-eslint/no-empty-object-type */
   }
 
   /**
@@ -69,9 +82,6 @@ declare global {
      */
     regions: Set<any> | null;
 
-    /* -------------------------------------------- */
-    /*  Methods                                     */
-    /* -------------------------------------------- */
     // TODO: Same as `DataModel._initialize`
     protected override _initialize(options?: any): void;
 
@@ -114,10 +124,6 @@ declare global {
      */
     hasStatusEffect(statusId: string): boolean;
 
-    /* -------------------------------------------- */
-    /*  Combat Operations                           */
-    /* -------------------------------------------- */
-
     /**
      * Add or remove this Token from a Combat encounter.
      * @param options - Additional options passed to TokenDocument.createCombatants or
@@ -156,10 +162,6 @@ declare global {
      */
     static deleteCombatants(tokens: TokenDocument[], options?: CreateCombatantOptions): Promise<Combatant[]>;
 
-    /* -------------------------------------------- */
-    /*  Actor Data Operations                       */
-    /* -------------------------------------------- */
-
     /**
      * Convenience method to change a token vision mode.
      * @param visionMode - The vision mode to apply to this token.
@@ -175,172 +177,30 @@ declare global {
       embeddedName: DocType,
     ): Collection<InstanceType<ConfiguredDocumentClassForName<DocType>>>;
 
-    /* -------------------------------------------- */
-    /*  Event Handlers                              */
-    /* -------------------------------------------- */
-
     /**
-     * @privateRemarks _onCreate, is overridden but with no signature changes.
+     * @privateRemarks _onCreate, _preUpdate, _onUpdate, _onDelete, preCreateOperation, _preUpdateOperation, _onCreateOperation,
+     * _onUpdateOperation, _onDeleteOperation, _preCreateDescendantDocuments, _preUpdateDescendantDocuments, _preDeleteDescendantDocuments,
+     * _onUpdateDescendantDocuments, and _onDeleteDescendantDocuments are all overridden but with no signature changes.
      * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
      */
 
-    protected override _preUpdate(
-      data: foundry.documents.BaseToken.UpdateData,
-      options: DocumentModificationOptions,
-      user: User.ConfiguredInstance,
-    ): Promise<void>;
-
-    protected override _onUpdate(
-      data: foundry.documents.BaseToken.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    /**
-     * Handle changes to the regions this token is in.
-     * @param priorRegionIds - The IDs of the prior regions
-     */
-    #onUpdateRegions(priorRegionIds: string[]): void;
-
-    /**
-     * Trigger TOKEN_MOVE, TOKEN_MOVE_IN, and TOKEN_MOVE_OUT events.
-     * @param origin   - he origin of movement
-     * @param teleport - Teleportation?
-     * @param forced   - Forced movement?
-     */
-    #triggerMoveRegionEvents(
-      origin: { x: number; y: number; elevation: number },
-      teleport: boolean,
-      forced: boolean,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
-
-    /**
-     * Identify the Regions the Token currently is or is going to be in after the changes are applied.
-     * @param changes - The changes.
-     * @returns The Region IDs the token is (sorted), if it could be determined.
-     */
-    #identifyRegions(changes?: Record<string, unknown>): string[] | void;
-
-    static _preCreateOperation(
-      documents: TokenDocument[],
-      operation: DatabaseCreateOperation,
-      user: User,
-    ): Promise<boolean | void>;
-
-    static _preUpdateOperation(
-      documents: TokenDocument[],
-      operation: DatabaseUpdateOperation,
-      user: User,
-    ): Promise<boolean | void>;
-
-    /**
-     * Handle Regions potentially stopping movement.
-     * @param documents - Document instances to be updated
-     * @param operation - Parameters of the database update operation
-     * @param user      - The User requesting the update operation
-     */
-    static #preUpdateMovement(
-      documents: TokenDocument[],
-      operation: DatabaseUpdateOperation,
-      user: User,
-    ): Promise<void>;
-
-    /**
-     * Identify and update the regions this Token is going to be in if necessary.
-     * @param documents - Document instances to be updated
-     * @param operation - Parameters of the database update operation
-     */
-    static #preUpdateRegions(documents: TokenDocument[], operation: DatabaseUpdateOperation): Promise<void>;
-
-    static _onCreateOperation(
-      documents: TokenDocument[],
-      operation: DatabaseCreateOperation,
-      user: User,
-    ): Promise<void>;
-
-    static _onUpdateOperation(
-      documents: TokenDocument[],
-      operation: DatabaseUpdateOperation,
-      user: User,
-    ): Promise<void>;
-
-    static _onDeleteOperation(
-      documents: TokenDocument[],
-      operation: DatabaseDeleteOperation,
-      user: User,
-    ): Promise<void>;
-
     /**
      * Is to Token document updated such that the Regions the Token is contained in may change?
      * Called as part of the preUpdate workflow.
      * @param changes - The changes.
      * @returns Could this Token update change Region containment?
      */
-    protected _couldRegionsChange(changes: DatabaseUpdateOperation<TokenDocument>["updates"]): boolean;
-
-    /* -------------------------------------------- */
-    /*  Actor Delta Operations                      */
-    /* -------------------------------------------- */
-
-    protected override _preCreateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      data: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
 
-    protected override _preUpdateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      changes: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _preDeleteDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      ids: string[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onCreateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      documents: ClientDocument[],
-      data: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onUpdateDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      documents: ClientDocument[],
-      changes: unknown[],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDeleteDescendantDocuments(
-      parent: ClientDocument,
-      collection: string,
-      documents: ClientDocument[],
-      ids: string,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    protected _couldRegionsChange(
+      changes: SchemaField.InnerAssignmentType<foundry.documents.BaseToken.Schema>,
+    ): boolean;
 
     /**
      * When the base Actor for a TokenDocument changes, we may need to update its Actor instance
      */
     protected _onUpdateBaseActor(
       update?: DeepPartial<Actor.ConfiguredInstance["_source"]>,
-      options?: DocumentModificationContext,
+      options?: DocumentOnUpdateOptions<"Actor">,
     ): void;
 
     /**
@@ -350,7 +210,10 @@ declare global {
      */
     protected _onRelatedUpdate(
       update?: DeepPartial<Actor.ConfiguredInstance["_source"]>,
-      options?: DocumentModificationContext,
+      /** @privateRemarks foundry calls this field operation
+       * but it's being passed options (and then ignores them)
+       */
+      operation?: DocumentOnUpdateOptions<"Actor">,
     ): void;
 
     /**
@@ -391,10 +254,6 @@ declare global {
      */
     static getTrackedAttributeChoices(attributes?: TrackedAttributesDescription): Record<string, string[]>;
 
-    /* -------------------------------------------- */
-    /*  Deprecations                                */
-    /* -------------------------------------------- */
-
     /**
      * @deprecated since v11
      * @remarks `"TokenDocument#getActor has been deprecated. Please use the`
@@ -411,7 +270,7 @@ declare global {
     /**
      * @deprecated since v11
      */
-    set actorData(actorData);
+    set actorData(actorData: this["delta"]["_source"]);
 
     /**
      * A helper function to toggle a status effect which includes an Active Effect template
diff --git a/src/foundry/client/data/documents/user.d.mts b/src/foundry/client/data/documents/user.d.mts
index 92ff92e51..2ea88b047 100644
--- a/src/foundry/client/data/documents/user.d.mts
+++ b/src/foundry/client/data/documents/user.d.mts
@@ -1,12 +1,15 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
 import type { InexactPartial } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace User {
     type ConfiguredClass = ConfiguredDocumentClassForName<"User">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
 
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<User> {}
+
     interface PingData {
       /**
        * Pulls all connected clients' views to the pinged co-ordinates.
@@ -143,16 +146,9 @@ declare global {
      */
     updateTokenTargets(targetIds?: string[]): void;
 
-    /* -------------------------------------------- */
-    /*  Event Handlers                              */
-    /* -------------------------------------------- */
-
-    protected override _onUpdate(
-      data: foundry.documents.BaseUser.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onUpdate and _onDelete are overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
   }
 }
diff --git a/src/foundry/client/data/documents/wall.d.mts b/src/foundry/client/data/documents/wall.d.mts
index e5d7f5319..f4589ab9e 100644
--- a/src/foundry/client/data/documents/wall.d.mts
+++ b/src/foundry/client/data/documents/wall.d.mts
@@ -1,9 +1,13 @@
 import type { ConfiguredDocumentClassForName } from "../../../../types/helperTypes.d.mts";
+import type { DocumentDatabaseOperations } from "../../../common/abstract/document.d.mts";
 
 declare global {
   namespace WallDocument {
     type ConfiguredClass = ConfiguredDocumentClassForName<"Wall">;
     type ConfiguredInstance = InstanceType<ConfiguredClass>;
+
+    /* eslint-disable-next-line @typescript-eslint/no-empty-object-type */
+    export interface DatabaseOperations extends DocumentDatabaseOperations<WallDocument> {}
   }
 
   /**
diff --git a/src/foundry/client/hooks.d.mts b/src/foundry/client/hooks.d.mts
index aa7f02a25..0f7feed6e 100644
--- a/src/foundry/client/hooks.d.mts
+++ b/src/foundry/client/hooks.d.mts
@@ -8,7 +8,15 @@ import type {
 } from "../../types/helperTypes.d.mts";
 import type { DeepPartial, ValueOf } from "../../types/utils.d.mts";
 import type { DropData } from "./data/abstract/client-document.d.mts";
-import type { DocumentModificationOptions } from "../common/abstract/document.d.mts";
+import type {
+  DocumentOnCreateOptions,
+  DocumentOnDeleteOptions,
+  DocumentOnUpdateOptions,
+  DocumentPreCreateOptions,
+  DocumentPreDeleteOptions,
+  DocumentPreUpdateOptions,
+} from "../common/abstract/document.d.mts";
+
 // eslint-disable-next-line import/no-named-as-default
 import type ProseMirrorMenu from "../common/prosemirror/menu.d.mts";
 import type { ProseMirrorDropDown } from "../common/prosemirror/menu.d.mts";
@@ -294,7 +302,7 @@ declare global {
       updateCompendium: (
         pack: CompendiumCollection<any>,
         documents: foundry.abstract.Document.Any[],
-        options: DocumentModificationOptions,
+        options: DocumentOnUpdateOptions<foundry.abstract.Document.Any["documentName"]>,
         userId: string,
       ) => void;
 
@@ -942,7 +950,7 @@ declare global {
     type PreCreateDocument<D extends DocumentConstructor = DocumentConstructor> = (
       document: InstanceType<ConfiguredDocumentClass<D>>,
       data: ConstructorParameters<D>[0],
-      options: DocumentModificationOptions,
+      options: DocumentPreCreateOptions<InstanceType<D>["documentName"]>,
       userId: string,
     ) => boolean | void;
 
@@ -968,7 +976,7 @@ declare global {
     type PreUpdateDocument<D extends DocumentConstructor = DocumentConstructor> = (
       document: InstanceType<ConfiguredDocumentClass<D>>,
       change: DeepPartial<ConstructorParameters<D>[0]>,
-      options: DocumentModificationOptions,
+      options: DocumentPreUpdateOptions<InstanceType<D>["documentName"]>,
       userId: string,
     ) => boolean | void;
 
@@ -992,7 +1000,7 @@ declare global {
      */
     type PreDeleteDocument<D extends DocumentConstructor = DocumentConstructor> = (
       document: InstanceType<ConfiguredDocumentClass<D>>,
-      options: DocumentModificationOptions,
+      options: DocumentPreDeleteOptions<InstanceType<D>["documentName"]>,
       userId: string,
     ) => boolean | void;
 
@@ -1012,7 +1020,7 @@ declare global {
      */
     type CreateDocument<D extends DocumentConstructor = DocumentConstructor> = (
       document: InstanceType<ConfiguredDocumentClass<D>>,
-      options: DocumentModificationOptions,
+      options: DocumentOnCreateOptions<InstanceType<D>["documentName"]>,
       userId: string,
     ) => void;
 
@@ -1034,7 +1042,7 @@ declare global {
     type UpdateDocument<D extends DocumentConstructor = DocumentConstructor> = (
       document: InstanceType<ConfiguredDocumentClass<D>>,
       change: DeepPartial<ConstructorParameters<D>[0]>,
-      options: DocumentModificationOptions,
+      options: DocumentOnUpdateOptions<InstanceType<D>["documentName"]>,
       userId: string,
     ) => void;
 
@@ -1054,7 +1062,7 @@ declare global {
      */
     type DeleteDocument<D extends DocumentConstructor = DocumentConstructor> = (
       document: InstanceType<ConfiguredDocumentClass<D>>,
-      options: DocumentModificationOptions,
+      options: DocumentOnDeleteOptions<InstanceType<D>["documentName"]>,
       userId: string,
     ) => void;
 
diff --git a/src/foundry/client/pixi/layers/base/placeables-layer.d.mts b/src/foundry/client/pixi/layers/base/placeables-layer.d.mts
index 528c9f381..a1ec49a4e 100644
--- a/src/foundry/client/pixi/layers/base/placeables-layer.d.mts
+++ b/src/foundry/client/pixi/layers/base/placeables-layer.d.mts
@@ -4,6 +4,7 @@ import type {
   PlaceableDocumentType,
 } from "../../../../../types/helperTypes.d.mts";
 import type { ConstructorOf, InexactPartial, ValueOf } from "../../../../../types/utils.d.mts";
+import type { DocumentOnUpdateOptions } from "../../../../common/abstract/document.d.mts";
 import type EmbeddedCollection from "../../../../common/abstract/embedded-collection.d.mts";
 
 type ConcretePlaceableOrPlaceableObject<T> = T extends PlaceableObject ? T : PlaceableObject;
@@ -324,7 +325,7 @@ declare global {
           ) => Partial<InstanceType<ConfiguredDocumentClassForName<DocumentName>>["_source"]>)
         | Partial<InstanceType<ConfiguredDocumentClassForName<DocumentName>>["_source"]>,
       condition?: ((placeable: InstanceType<ConfiguredObjectClassForName<DocumentName>>) => boolean) | null,
-      options?: DocumentModificationContext,
+      options?: DocumentOnUpdateOptions<DocumentName>,
     ): Promise<Array<InstanceType<ConfiguredDocumentClassForName<DocumentName>>>>;
 
     /**
diff --git a/src/foundry/client/pixi/placeable.d.mts b/src/foundry/client/pixi/placeable.d.mts
index 6e4d242f4..69c557ffc 100644
--- a/src/foundry/client/pixi/placeable.d.mts
+++ b/src/foundry/client/pixi/placeable.d.mts
@@ -1,5 +1,9 @@
 import type { ValueOf } from "../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../common/abstract/document.d.mts";
+import type {
+  DocumentOnCreateOptions,
+  DocumentOnDeleteOptions,
+  DocumentOnUpdateOptions,
+} from "../../common/abstract/document.d.mts";
 import type { Document } from "../../common/abstract/module.d.mts";
 
 declare global {
@@ -228,7 +232,7 @@ declare global {
      */
     protected _onCreate(
       data: foundry.data.fields.SchemaField.InnerAssignmentType<D["schema"]["fields"]>,
-      options: DocumentModificationOptions,
+      options: DocumentOnCreateOptions<D["documentName"]>,
       userId: string,
     ): void;
 
@@ -238,14 +242,14 @@ declare global {
      */
     protected _onUpdate(
       changed: foundry.data.fields.SchemaField.InnerAssignmentType<D["schema"]["fields"]>,
-      options?: DocumentModificationOptions,
+      options?: DocumentOnUpdateOptions<D["documentName"]>,
       userId?: string,
     ): void;
 
     /**
      * Define additional steps taken when an existing placeable object of this type is deleted
      */
-    protected _onDelete(options: DocumentModificationOptions, userId: string): void;
+    protected _onDelete(options: DocumentOnDeleteOptions<D["documentName"]>, userId: string): void;
 
     /**
      * Assume control over a PlaceableObject, flagging it as controlled and enabling downstream behaviors
diff --git a/src/foundry/client/pixi/placeables/drawing.d.mts b/src/foundry/client/pixi/placeables/drawing.d.mts
index 0ed19cd1e..bd829543e 100644
--- a/src/foundry/client/pixi/placeables/drawing.d.mts
+++ b/src/foundry/client/pixi/placeables/drawing.d.mts
@@ -1,5 +1,4 @@
 import type { ValueOf } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { ConfiguredObjectClassOrDefault } from "../../config.d.mts";
 
 declare global {
@@ -187,13 +186,10 @@ declare global {
 
     protected override _onRelease(options: PlaceableObject.ReleaseOptions): void;
 
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
-
-    protected override _onUpdate(
-      data: foundry.documents.BaseDrawing.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    /**
+     * @privateRemarks _onDelete and _onUpdate are overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     override activateListeners(): void;
 
diff --git a/src/foundry/client/pixi/placeables/light.d.mts b/src/foundry/client/pixi/placeables/light.d.mts
index 93b94fecb..78a8d2ad4 100644
--- a/src/foundry/client/pixi/placeables/light.d.mts
+++ b/src/foundry/client/pixi/placeables/light.d.mts
@@ -1,4 +1,3 @@
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { ConfiguredObjectClassOrDefault } from "../../config.d.mts";
 
 declare global {
@@ -118,19 +117,10 @@ declare global {
       deleted?: boolean;
     }): void;
 
-    protected override _onCreate(
-      data: foundry.documents.BaseAmbientLight["_source"],
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onUpdate(
-      data: foundry.documents.BaseAmbientLight.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onCreate, _onUpdate, and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     protected override _canHUD(user: User.ConfiguredInstance, event?: any): boolean;
 
diff --git a/src/foundry/client/pixi/placeables/note.d.mts b/src/foundry/client/pixi/placeables/note.d.mts
index 05da32b21..f1c0fb788 100644
--- a/src/foundry/client/pixi/placeables/note.d.mts
+++ b/src/foundry/client/pixi/placeables/note.d.mts
@@ -1,4 +1,3 @@
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { ConfiguredObjectClassOrDefault } from "../../config.d.mts";
 
 declare global {
@@ -99,11 +98,10 @@ declare global {
      */
     protected _refreshVisibility(): void;
 
-    protected override _onUpdate(
-      data: foundry.documents.BaseNote.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    /**
+     * @privateRemarks _onUpdate is overridden but with no signature changes.
+     * For type simplicity it is left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     protected override _canHover(user: User.ConfiguredInstance): true;
 
diff --git a/src/foundry/client/pixi/placeables/sound.d.mts b/src/foundry/client/pixi/placeables/sound.d.mts
index 2427d6fde..a3d05af32 100644
--- a/src/foundry/client/pixi/placeables/sound.d.mts
+++ b/src/foundry/client/pixi/placeables/sound.d.mts
@@ -1,4 +1,3 @@
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { ConfiguredObjectClassOrDefault } from "../../config.d.mts";
 
 declare global {
@@ -116,19 +115,10 @@ declare global {
      */
     updateSource(options?: AmbientSound.UpdateSourceOptions): void;
 
-    protected override _onCreate(
-      data: foundry.documents.BaseAmbientSound.ConstructorData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onUpdate(
-      data: foundry.documents.BaseAmbientSound.UpdateData,
-      options?: DocumentModificationOptions,
-      userId?: string,
-    ): void;
-
-    protected override _onDelete(...args: Parameters<PlaceableObject["_onDelete"]>): void;
+    /**
+     * @privateRemarks _onCreate, _onUpdate, and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     protected override _canHUD(user: User.ConfiguredInstance, event?: any): boolean;
 
diff --git a/src/foundry/client/pixi/placeables/template.d.mts b/src/foundry/client/pixi/placeables/template.d.mts
index 533c25da1..20914d6b5 100644
--- a/src/foundry/client/pixi/placeables/template.d.mts
+++ b/src/foundry/client/pixi/placeables/template.d.mts
@@ -1,5 +1,4 @@
 import type { RequiredProps } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { ConfiguredObjectClassOrDefault } from "../../config.d.mts";
 
 declare global {
@@ -200,11 +199,10 @@ declare global {
 
     protected override _canView(user: User.ConfiguredInstance, event?: PIXI.FederatedEvent): boolean;
 
-    protected override _onUpdate(
-      data: foundry.documents.BaseMeasuredTemplate.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
+    /**
+     * @privateRemarks _onUpdate is overridden but with no signature changes.
+     * For type simplicity it is left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     protected override _canHUD(user: User.ConfiguredInstance, event?: PIXI.FederatedEvent): boolean;
 
diff --git a/src/foundry/client/pixi/placeables/tile.d.mts b/src/foundry/client/pixi/placeables/tile.d.mts
index 2fce85eba..b85d3a295 100644
--- a/src/foundry/client/pixi/placeables/tile.d.mts
+++ b/src/foundry/client/pixi/placeables/tile.d.mts
@@ -1,4 +1,3 @@
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { ConfiguredObjectClassOrDefault } from "../../config.d.mts";
 
 declare global {
@@ -191,13 +190,10 @@ declare global {
      */
     protected _refreshHandle(b: Rectangle): void;
 
-    protected override _onUpdate(
-      changed: foundry.documents.BaseTile.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): Promise<this> | void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onUpdate and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     override activateListeners(): void;
 
diff --git a/src/foundry/client/pixi/placeables/token.d.mts b/src/foundry/client/pixi/placeables/token.d.mts
index a4aee8827..78cd591b0 100644
--- a/src/foundry/client/pixi/placeables/token.d.mts
+++ b/src/foundry/client/pixi/placeables/token.d.mts
@@ -1,5 +1,4 @@
 import type { RequiredProps } from "../../../../types/utils.d.mts";
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { ConfiguredObjectClassOrDefault } from "../../config.d.mts";
 
 declare global {
@@ -723,19 +722,10 @@ declare global {
 
     protected override _getShiftedPosition(dx: number, dy: number): { x: number; y: number };
 
-    protected override _onCreate(
-      data: foundry.documents.BaseToken.ConstructorData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onUpdate(
-      data: foundry.documents.BaseToken.UpdateData,
-      options: DocumentModificationOptions & { animate?: boolean },
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options?: DocumentModificationOptions, userId?: string): void;
+    /**
+     * @privateRemarks _onDelete and _onUpdate are overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Handle changes to Token behavior when a significant status effect is applied
diff --git a/src/foundry/client/pixi/placeables/wall.d.mts b/src/foundry/client/pixi/placeables/wall.d.mts
index ca7fcad33..bc5b0e70a 100644
--- a/src/foundry/client/pixi/placeables/wall.d.mts
+++ b/src/foundry/client/pixi/placeables/wall.d.mts
@@ -1,4 +1,3 @@
-import type { DocumentModificationOptions } from "../../../common/abstract/document.d.mts";
 import type { LineIntersection } from "../../../common/utils/geometry.d.mts";
 import type { ConfiguredObjectClassOrDefault } from "../../config.d.mts";
 
@@ -227,19 +226,10 @@ declare global {
      */
     protected _getWallColor(): number;
 
-    protected override _onCreate(
-      data: foundry.documents.BaseWall.ConstructorData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onUpdate(
-      changed: foundry.documents.BaseWall.UpdateData,
-      options: DocumentModificationOptions,
-      userId: string,
-    ): void;
-
-    protected override _onDelete(options: DocumentModificationOptions, userId: string): void;
+    /**
+     * @privateRemarks _onCreate, _onUpdate, and _onDelete are all overridden but with no signature changes.
+     * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+     */
 
     /**
      * Play a door interaction sound.
diff --git a/src/foundry/client/pixi/webgl/shaders/filters/fxaa.d.mts b/src/foundry/client/pixi/webgl/shaders/filters/fxaa.d.mts
index 2ab9e1826..e25221e2f 100644
--- a/src/foundry/client/pixi/webgl/shaders/filters/fxaa.d.mts
+++ b/src/foundry/client/pixi/webgl/shaders/filters/fxaa.d.mts
@@ -69,6 +69,6 @@ declare global {
   }
 
   // TODO: This needs to be filled in.
-  // eslint-disable-next-line @typescript-eslint/no-empty-interface
+  // eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-empty-object-type
   interface AdaptiveFXAAFilterOptions {}
 }
diff --git a/src/foundry/client/ui/context.d.mts b/src/foundry/client/ui/context.d.mts
index ee438581f..dfdb9c57d 100644
--- a/src/foundry/client/ui/context.d.mts
+++ b/src/foundry/client/ui/context.d.mts
@@ -1,3 +1,6 @@
+import type { InexactPartial } from "../../../types/utils.d.mts";
+import type ApplicationV2 from "../../client-esm/applications/api/application.d.mts";
+
 export {};
 
 declare global {
@@ -16,17 +19,32 @@ declare global {
      * An identifier for a group this entry belongs to.
      * @defaultValue `_none`
      */
-    group?: string;
+    group?: string | undefined;
 
     /**
-     * The function to call when the menu item is clicked. Receives the HTML element of the SidebarTab entry that this context menu is for.
+     * The function to call when the menu item is clicked. Receives the HTML element
+     * of the entry that this context menu is for.
      */
     callback: (target: JQuery) => void;
 
     /**
-     * A function to call to determine if this item appears in the menu. Receives the HTML element of the SidebarTab entry that this context menu is for.
+     * A function to call or boolean value to determine if this entry
+     * appears in the menu.
      */
-    condition?: boolean | ((target: JQuery) => boolean);
+    condition?: boolean | ((target: JQuery) => boolean) | undefined;
+  }
+
+  /**
+   * @param html      - The HTML element of the context menu entry.
+   * @returns         whether the entry should be rendered in the context menu.
+   */
+  type ContextMenuCondition = (html: JQuery) => boolean;
+
+  namespace ContextMenu {
+    interface RenderOptions {
+      /** The event that triggered the context menu opening. */
+      event: PointerEvent;
+    }
   }
 
   /**
@@ -103,8 +121,8 @@ declare global {
      *                    (default: `"EntryContext"`)
      */
     static create(
-      app: Application,
-      html: JQuery,
+      app: Application | ApplicationV2,
+      html: JQuery | HTMLElement,
       selector: string,
       menuItems: ContextMenuEntry[],
       options?: ContextMenu.ConstructorOptions,
@@ -134,14 +152,18 @@ declare global {
      * Render the Context Menu by iterating over the menuItems it contains
      * Check the visibility of each menu item, and only render ones which are allowed by the item's logical condition
      * Attach a click handler to each item which is rendered
-     * @param target - The target element to which the context menu is attached
+     * @param target        - The target element to which the context menu is attached
+     * @param options       - (default: `{}`)
      */
-    render(target: JQuery): void | Promise<void>;
+    render(target: JQuery, options?: InexactPartial<ContextMenu.RenderOptions>): void | Promise<JQuery | void>;
 
     /**
      * Set the position of the context menu, taking into consideration whether the menu should expand upward or downward
+     * @param html            - The context menu element.
+     * @param target          - The element that the context menu was spawned on.
+     * @param options         - (default: `{}`)
      */
-    protected _setPosition(html: JQuery, target: JQuery): void;
+    protected _setPosition(html: JQuery, target: JQuery, options?: InexactPartial<ContextMenu.RenderOptions>): void;
 
     /**
      * Local listeners which apply to each ContextMenu instance which is created.
diff --git a/src/foundry/client/ui/editor.d.mts b/src/foundry/client/ui/editor.d.mts
index e3147cd2e..14ce9ed8a 100644
--- a/src/foundry/client/ui/editor.d.mts
+++ b/src/foundry/client/ui/editor.d.mts
@@ -288,7 +288,7 @@ declare global {
      * @remarks `TokensLayer#_onDropActorData` returns a number - a notification ID - the  if the user lacks permissions
      * @remarks `User#assignHotbarMacro` returns a promise to a user document
      */
-    protected static getDragEventData(
+    static getDragEventData(
       event: DragEvent,
     ): PlaceableObject | number | Promise<ConfiguredDocumentClassForName<"User">>;
 
diff --git a/src/foundry/client/ui/filepicker.d.mts b/src/foundry/client/ui/filepicker.d.mts
index 0080262b4..ce0368773 100644
--- a/src/foundry/client/ui/filepicker.d.mts
+++ b/src/foundry/client/ui/filepicker.d.mts
@@ -2,7 +2,7 @@ import type { EmptyObject, MaybePromise, ValueOf } from "../../../types/utils.d.
 
 declare global {
   interface FilePickerOptions extends ApplicationOptions {
-    /** A type of file to target, in "audio", "image", "video", "imagevideo", "folder", "font", "graphics", "text", or "any" */
+    /** A type of file to target */
     type?: FilePicker.Type | undefined;
 
     /** The current file path being modified, if any */
@@ -47,6 +47,9 @@ declare global {
      */
     constructor(options?: Partial<Options>);
 
+    // placeholder private member
+    #filePicker: true;
+
     /**
      * The full requested path given by the user
      */
@@ -102,6 +105,11 @@ declare global {
 
     protected _loaded: boolean;
 
+    /**
+     * The allowed values for the type of this FilePicker instance.
+     */
+    static FILE_TYPES: string[];
+
     /**
      * Record the last-browsed directory path so that re-opening a different FilePicker instance uses the same target
      * @defaultValue `""`
@@ -179,12 +187,6 @@ declare global {
      */
     protected _inferCurrentDirectory(target: string): [string, string];
 
-    /**
-     * Get the valid file extensions for a given named file picker type
-     * @internal
-     */
-    protected _getExtensions(type: FilePicker.Type): string[] | undefined;
-
     /**
      * Test a URL to see if it matches a well known s3 key pattern
      * @param url - An input URL to test
@@ -192,13 +194,6 @@ declare global {
      */
     static matchS3URL(url: string): RegExpMatchArray | null;
 
-    /**
-     * Parse a s3 key to learn the bucket and the key prefix used for the request
-     * @deprecated since v10, use `foundry.utils.parseS3URL` instead.
-     * @param key - A fully qualified key name or prefix path
-     */
-    static parseS3URL(key: string): { bucket: string | null; keyPrefix: string };
-
     override get title(): string;
 
     /**
@@ -232,7 +227,7 @@ declare global {
      * @param target - The target within the currently active source location.
      * @param options - Browsing options (default: `{}`)
      */
-    browse(target: string, options?: FilePicker.BrowseOptions): Promise<FilePicker.BrowseResult>;
+    browse(target?: string, options?: FilePicker.BrowseOptions): Promise<FilePicker.BrowseResult>;
 
     /**
      * Browse files for a certain directory location
@@ -272,26 +267,6 @@ declare global {
       options?: FilePicker.CreateDirectoryOptions,
     ): Promise<string>;
 
-    /**
-     * General dispatcher method to submit file management commands to the server
-     * @internal
-     * @param data    - Request data dispatched to the server
-     * @param options - Options dispatched to the server
-     * @returns The server response
-     */
-    protected static _manageFiles(
-      data: FilePicker.BrowseFilesData,
-      options?: FilePicker.BrowseOptions,
-    ): Promise<FilePicker.BrowseResult>;
-    protected static _manageFiles(
-      data: FilePicker.ConfigurePathData,
-      options?: FilePicker.ConfigurePathOptions,
-    ): Promise<FilePicker.ConfigurePathResult>;
-    protected static _manageFiles(
-      data: FilePicker.CreateDirectoryData,
-      options?: FilePicker.CreateDirectoryOptions,
-    ): Promise<string>;
-
     /**
      * Dispatch a POST request to the server containing a directory path and a file to upload
      * @param source  - The data source to which the file should be uploaded
@@ -313,8 +288,9 @@ declare global {
 
     /**
      * A convenience function that uploads a file to a given package's persistent /storage/ directory
-     * @param packageId  - The id of the package to which the file should be uploaded. Only supports Systems and Modules.
-     * @param path       - The relative path in the package's storage directory the file should be uploaded to
+     * @param packageId  - The id of the package to which the file should be uploaded.
+     *                     Only supports Systems and Modules.
+     * @param path       - The relative destination path in the package's storage directory
      * @param file       - The File object to upload
      * @param body       - Additional file upload options sent in the POST body
      *                     (default: `{}`)
@@ -337,13 +313,6 @@ declare global {
 
     override activateListeners(html: JQuery): void;
 
-    /**
-     * Handle a click event to change the display mode of the File Picker
-     * @param event - The triggering click event
-     * @internal
-     */
-    protected _onChangeDisplayMode(event: JQuery.ClickEvent): void;
-
     protected override _onChangeTab(event: MouseEvent | null, tabs: Tabs, active: this["activeSource"]): void;
 
     protected override _canDragStart(selector: string | null): boolean;
@@ -357,53 +326,6 @@ declare global {
      */
     protected override _onDrop(event: DragEvent): void;
 
-    /**
-     * Handle user submission of the address bar to request an explicit target
-     * @param event - The originating keydown event
-     * @internal
-     */
-    protected _onRequestTarget(event: KeyboardEvent): void;
-
-    /**
-     * Handle user interaction with the favorites
-     * @param event - The originating click event
-     */
-    protected _onClickFavorites(event: MouseEvent): Promise<void>;
-
-    /**
-     * Handle requests from the IntersectionObserver to lazily load an image file
-     * @internal
-     */
-    protected _onLazyLoadImages(...args: Parameters<SidebarTab["_onLazyLoadImage"]>): void;
-
-    /**
-     * Handle file or folder selection within the file picker
-     * @param event - The originating click event
-     * @internal
-     */
-    protected _onPick(event: JQuery.ClickEvent): void;
-
-    /**
-     * Handle backwards navigation of the fol6der structure.
-     * @param event - The triggering click event
-     * @internal
-     */
-    protected _onClickDirectoryControl(event: PointerEvent): void;
-
-    /**
-     * Present the user with a dialog to create a subdirectory within their currently browsed file storage location.
-     * @param source - The data source being browsed
-     * @internal
-     */
-    protected _createDirectoryDialog(source: FilePicker.Source): void;
-
-    /**
-     * Handle changes to the bucket selector
-     * @param event - The S3 bucket select change event
-     * @internal
-     */
-    protected _onChangeBucket(event: Event): void;
-
     /**
      * Handle changes to the tile size.
      * @param event - The triggering event.
@@ -414,13 +336,6 @@ declare global {
 
     protected _onSubmit(ev: Event): void;
 
-    /**
-     * Handle file upload
-     * @param ev - The file upload event
-     * @internal
-     */
-    protected _onUpload(ev: Event): void;
-
     /**
      * Bind the file picker to a new target field.
      * Assumes the user will provide a <button> HTMLElement which has the data-target and data-type attributes
@@ -447,19 +362,19 @@ declare global {
       /**
        * A bucket within which to search, if using the S3 source
        */
-      bucket?: string;
+      bucket?: string | undefined;
 
       /**
        * An Array of file extensions to filter on
        * @defaultValue `[]` (do not filter on extension)
        */
-      extensions?: string[];
+      extensions?: string[] | undefined;
 
       /**
        * The requested dir represents a wildcard path
        * @defaultValue false
        */
-      wildcard?: boolean;
+      wildcard?: boolean | undefined;
     }
 
     type Callback = (path: string) => void;
@@ -490,7 +405,7 @@ declare global {
       /**
        * @defaultValue `""`
        */
-      bucket?: string | null;
+      bucket?: string | null | undefined;
     }
 
     type SourceType = "data" | "public" | "s3";
@@ -535,7 +450,7 @@ declare global {
       };
     }
 
-    type Type = "any" | "audio" | "image" | "video" | "imagevideo" | "folder" | "font" | "graphics" | "text";
+    type Type = "image" | "audio" | "video" | "text" | "imagevideo" | "font" | "folder" | "any";
 
     interface UploadBody {
       /**
diff --git a/src/foundry/common/abstract/_types.d.mts b/src/foundry/common/abstract/_types.d.mts
index 564051a22..1235440fd 100644
--- a/src/foundry/common/abstract/_types.d.mts
+++ b/src/foundry/common/abstract/_types.d.mts
@@ -96,6 +96,30 @@ export interface DatabaseCreateOperation<T extends foundry.abstract.Document.Any
    * An alias for 'data' used internally by the server-side backend
    */
   _result?: (string | Record<string, unknown>)[] | undefined;
+
+  /** @privateRemarks these are added from WorldCollection.importFromCompendium() **/
+  fromCompendium?: boolean | undefined;
+
+  /**
+   * Clear the currently assigned folder
+   */
+  clearFolder?: boolean | undefined;
+
+  /**
+   * Clear the current sort order
+   */
+  clearSort?: boolean | undefined;
+
+  /**
+   * Clear Document ownership
+   */
+  clearOwnership?: boolean | undefined;
+
+  /**
+   * @deprecated `"It is no longer supported to create temporary documents using the Document.createDocuments API. Use the new Document() constructor instead."`
+   * @remarks No explicit undefined because deprecation message checks `"temporary" in operation`
+   */
+  temporary?: boolean | undefined;
 }
 
 export interface DatabaseUpdateOperation<T extends foundry.abstract.Document.Any = foundry.abstract.Document.Any> {
diff --git a/src/foundry/common/abstract/data.d.mts b/src/foundry/common/abstract/data.d.mts
index 209a6ac98..a95f16ea1 100644
--- a/src/foundry/common/abstract/data.d.mts
+++ b/src/foundry/common/abstract/data.d.mts
@@ -1,3 +1,4 @@
+import type { EmptyObject } from "../../../types/utils.d.mts";
 import type { DataField, SchemaField } from "../data/fields.d.mts";
 import type { fields } from "../data/module.d.mts";
 import type { DataModelValidationFailure } from "../data/validation-failure.d.mts";
@@ -98,7 +99,7 @@ declare abstract class DataModel<
   /**
    * Define the data schema for this document instance.
    */
-  get schema(): SchemaField<Schema, {}>;
+  get schema(): SchemaField<Schema, EmptyObject>;
 
   /**
    * Is the current state of this DataModel invalid?
diff --git a/src/foundry/common/abstract/document.d.mts b/src/foundry/common/abstract/document.d.mts
index 6b1e6917d..75b22cece 100644
--- a/src/foundry/common/abstract/document.d.mts
+++ b/src/foundry/common/abstract/document.d.mts
@@ -2,6 +2,7 @@ import type {
   ConfiguredDocumentClass,
   ConfiguredDocumentClassForName,
   ConstructorDataType,
+  DatabaseOperationsFor,
   DocumentConstructor,
   DocumentType,
   DocumentTypeWithTypeData,
@@ -10,6 +11,7 @@ import type {
 import type {
   ConfiguredStoredDocument,
   DeepPartial,
+  EmptyObject,
   InexactPartial,
   RemoveIndexSignatures,
   StoredDocument,
@@ -227,7 +229,7 @@ declare abstract class Document<
    * @returns The cloned Document instance
    */
   override clone<Save extends boolean = false>(
-    data?: fields.SchemaField.AssignmentType<Schema, {}>,
+    data?: fields.SchemaField.AssignmentType<Schema, EmptyObject>,
     context?: InexactPartial<
       {
         /**
@@ -296,22 +298,20 @@ declare abstract class Document<
    * const created = await Actor.createDocuments(data, {pack: "mymodule.mypack"});
    * ```
    */
-  static createDocuments<T extends Document.AnyConstructor, Temporary extends boolean = false>(
+  static createDocuments<T extends Document.AnyConstructor>(
     this: T,
-    data: Array<
-      | fields.SchemaField.AssignmentType<InstanceType<T>["schema"]["fields"]>
-      | (fields.SchemaField.AssignmentType<InstanceType<T>["schema"]["fields"]> & Record<string, unknown>)
-    >,
-    operation?: InexactPartial<Omit<DatabaseCreateOperation<InstanceType<T>>, "data">> & {
-      /**
-       * @deprecated `"It is no longer supported to create temporary documents using the Document.createDocuments API. Use the new Document() constructor instead."`
-       * @remarks No explicit undefined because deprecation message checks `"temporary" in operation`
-       */
-      temporary?: Temporary;
+    data: Array<fields.SchemaField.AssignmentType<InstanceType<T>["schema"]["fields"]> & Record<string, unknown>>,
+    operation?: InexactPartial<Omit<DatabaseOperationsFor<T["metadata"]["name"], "create">, "data">> & {
+      temporary?: false | undefined;
+    },
+  ): Promise<ConfiguredStoredDocument<T>[] | undefined>;
+  static createDocuments<T extends Document.AnyConstructor>(
+    this: T,
+    data: Array<fields.SchemaField.AssignmentType<InstanceType<T>["schema"]["fields"]> & Record<string, unknown>>,
+    operation?: InexactPartial<Omit<DatabaseOperationsFor<T["metadata"]["name"], "create">, "data">> & {
+      temporary: true;
     },
-  ): true extends Temporary
-    ? Promise<InstanceType<Document.ConfiguredClass<T>>[]>
-    : Promise<StoredDocument<InstanceType<Document.ConfiguredClass<T>>>[]>;
+  ): Promise<InstanceType<ConfiguredDocumentClass<T>>[] | undefined>;
 
   /**
    * Update multiple Document instances using provided differential data.
@@ -350,9 +350,8 @@ declare abstract class Document<
    */
   static updateDocuments<T extends Document.AnyConstructor>(
     this: T,
-    updates?: Array<DeepPartial<ConstructorDataType<T> | (ConstructorDataType<T> & Record<string, unknown>)>>,
-    operation?: InexactPartial<Omit<DatabaseUpdateOperation<InstanceType<T>>, "updates">> &
-      foundry.utils.MergeObjectOptions,
+    updates?: Array<DeepPartial<ConstructorDataType<T> & Record<string, unknown>>>,
+    operation?: InexactPartial<Omit<DatabaseOperationsFor<InstanceType<T>["documentName"], "update">, "updates">>,
   ): Promise<InstanceType<ConfiguredDocumentClass<T>>[]>;
 
   /**
@@ -395,15 +394,15 @@ declare abstract class Document<
   static deleteDocuments<T extends Document.AnyConstructor>(
     this: T,
     ids?: string[],
-    operation?: InexactPartial<Omit<DatabaseDeleteOperation, "ids">>,
+    operation?: InexactPartial<Omit<DatabaseOperationsFor<InstanceType<T>["documentName"], "delete">, "ids">>,
   ): Promise<InstanceType<ConfiguredDocumentClass<T>>[]>;
 
   /**
    * Create a new Document using provided input data, saving it to the database.
    * @see {@link Document.createDocuments}
-   * @param data    - Initial data used to create this Document
+   * @param data      - Initial data used to create this Document, or a Document instance to persist.
    * @param operation - Parameters of the creation operation
-   *                  (default: `{}`)
+   *                    (default: `{}`)
    * @returns The created Document instance
    *
    * @example Create a World-level Item
@@ -427,19 +426,20 @@ declare abstract class Document<
    *
    * @remarks If no document has actually been created, the returned {@link Promise} resolves to `undefined`.
    */
-  static create<T extends Document.AnyConstructor, Temporary extends boolean = false>(
+  static create<T extends Document.AnyConstructor>(
     this: T,
     data: ConstructorDataType<T> | (ConstructorDataType<T> & Record<string, unknown>),
-    operation?: InexactPartial<Omit<DatabaseCreateOperation<InstanceType<T>>, "data">> & {
-      /**
-       * @deprecated `"It is no longer supported to create temporary documents using the Document.createDocuments API. Use the new Document() constructor instead."`
-       * @remarks No explicit undefined because deprecation message checks `"temporary" in operation`
-       */
-      temporary?: Temporary;
+    operation?: InexactPartial<Omit<DatabaseOperationsFor<T["metadata"]["name"], "create">, "data">> & {
+      temporary?: false | undefined;
+    },
+  ): Promise<ConfiguredStoredDocument<T> | undefined>;
+  static create<T extends Document.AnyConstructor>(
+    this: T,
+    data: ConstructorDataType<T> | (ConstructorDataType<T> & Record<string, unknown>),
+    operation?: InexactPartial<Omit<DatabaseOperationsFor<T["metadata"]["name"], "create">, "data">> & {
+      temporary: true;
     },
-  ): true extends Temporary
-    ? Promise<InstanceType<ConfiguredDocumentClass<T>> | undefined>
-    : Promise<ConfiguredStoredDocument<T> | undefined>;
+  ): Promise<InstanceType<ConfiguredDocumentClass<T>> | undefined>;
 
   /**
    * Update this Document using incremental data, saving it to the database.
@@ -453,10 +453,8 @@ declare abstract class Document<
    * @remarks If no document has actually been updated, the returned {@link Promise} resolves to `undefined`.
    */
   override update(
-    data?:
-      | fields.SchemaField.AssignmentType<Schema, {}>
-      | (fields.SchemaField.AssignmentType<Schema, {}> & Record<string, unknown>),
-    operation?: InexactPartial<Omit<DatabaseUpdateOperation<this>, "updates">> & foundry.utils.MergeObjectOptions,
+    data?: fields.SchemaField.AssignmentType<Schema, EmptyObject> & Record<string, unknown>,
+    operation?: InexactPartial<Omit<DatabaseOperationsFor<ConcreteMetadata["name"], "update">, "updates">>,
   ): Promise<this | undefined>;
 
   /**
@@ -468,7 +466,9 @@ declare abstract class Document<
    *
    * @remarks If no document has actually been deleted, the returned {@link Promise} resolves to `undefined`.
    */
-  delete(operation?: InexactPartial<Omit<DatabaseDeleteOperation, "ids">>): Promise<this | undefined>;
+  delete(
+    operation?: InexactPartial<Omit<DatabaseOperationsFor<ConcreteMetadata["name"], "delete">, "ids">>,
+  ): Promise<this | undefined>;
 
   /**
    * Get a World-level Document of this type by its id.
@@ -503,9 +503,10 @@ declare abstract class Document<
    * @returns The Collection instance of embedded Documents of the requested type
    * @remarks Usually returns some form of DocumentCollection, but not always (e.g. Token["actors"])
    */
-  getEmbeddedCollection<DocType extends Document.TypeName>(
-    embeddedName: DocType,
-  ): Collection<InstanceType<Document.ConfiguredClassForName<DocType>>>;
+  // TODO: After regions are defined, change first parameter to `extends foundry.CONST.EMBEDDED_DOCUMENT_TYPES`
+  getEmbeddedCollection<
+    EmbeddedName extends Exclude<foundry.CONST.EMBEDDED_DOCUMENT_TYPES, "Region" | "RegionBehavior">,
+  >(embeddedName: EmbeddedName): Collection<InstanceType<Document.ConfiguredClassForName<EmbeddedName>>>;
 
   /**
    * Get an embedded document by its id from a named collection in the parent document.
@@ -543,23 +544,27 @@ declare abstract class Document<
    * @returns An array of created Document instances
    */
   // TODO: After regions are defined, change first parameter to `extends foundry.CONST.EMBEDDED_DOCUMENT_TYPES`
-  createEmbeddedDocuments<EmbeddedName extends DocumentType, Temporary extends boolean = false>(
+  // TODO: I think we could do a better job on all the embedded methods of limiting the types here based on the
+  //   allowed embedded types of the parent (vs. allowing any document to create embedded
+  //   documents of any type)
+  createEmbeddedDocuments<
+    EmbeddedName extends Exclude<foundry.CONST.EMBEDDED_DOCUMENT_TYPES, "Region" | "RegionBehavior">,
+  >(
     embeddedName: EmbeddedName,
     data?: Array<ConstructorDataType<ConfiguredDocumentClassForName<EmbeddedName>>>,
-    operation?: InexactPartial<Omit<DatabaseCreateOperation, "data">> & {
-      /**
-       * @deprecated `"It is no longer supported to create temporary documents using the Document.createDocuments API. Use the new Document() constructor instead."`
-       * @remarks No explicit undefined because deprecation message checks `"temporary" in operation`
-       */
-      temporary?: Temporary;
+    operation?: InexactPartial<DatabaseOperationsFor<EmbeddedName, "create">> & {
+      temporary?: false | undefined;
     },
-  ): Promise<
-    Array<
-      true extends Temporary
-        ? InstanceType<ConfiguredDocumentClassForName<EmbeddedName>>
-        : StoredDocument<InstanceType<ConfiguredDocumentClassForName<EmbeddedName>>>
-    >
-  >;
+  ): Promise<ConfiguredStoredDocument<ConfiguredDocumentClassForName<EmbeddedName>>[] | undefined>;
+  createEmbeddedDocuments<
+    EmbeddedName extends Exclude<foundry.CONST.EMBEDDED_DOCUMENT_TYPES, "Region" | "RegionBehavior">,
+  >(
+    embeddedName: EmbeddedName,
+    data?: Array<ConstructorDataType<ConfiguredDocumentClassForName<EmbeddedName>>>,
+    operation?: InexactPartial<DatabaseOperationsFor<EmbeddedName, "create">> & {
+      temporary: true;
+    },
+  ): Promise<InstanceType<ConfiguredDocumentClassForName<EmbeddedName>>[] | undefined>;
 
   /**
    * Update multiple embedded Document instances within a parent Document using provided differential data.
@@ -572,10 +577,12 @@ declare abstract class Document<
    * @returns An array of updated Document instances
    */
   // TODO: After regions are defined, change first parameter to `extends foundry.CONST.EMBEDDED_DOCUMENT_TYPES`
-  updateEmbeddedDocuments<EmbeddedName extends DocumentType>(
+  updateEmbeddedDocuments<
+    EmbeddedName extends Exclude<foundry.CONST.EMBEDDED_DOCUMENT_TYPES, "Region" | "RegionBehavior">,
+  >(
     embeddedName: EmbeddedName,
     updates?: Array<Record<string, unknown>>,
-    operation?: InexactPartial<Omit<DatabaseUpdateOperation, "updates">>,
+    operation?: DatabaseOperationsFor<ConcreteMetadata["name"], "update">,
   ): Promise<Array<StoredDocument<InstanceType<ConfiguredDocumentClassForName<EmbeddedName>>>>>;
 
   /**
@@ -587,10 +594,13 @@ declare abstract class Document<
    *                       (default: `{}`)
    * @returns An array of deleted Document instances
    */
-  deleteEmbeddedDocuments<EmbeddedName extends DocumentType>(
+  // TODO: After regions are defined, change first parameter to `extends foundry.CONST.EMBEDDED_DOCUMENT_TYPES`
+  deleteEmbeddedDocuments<
+    EmbeddedName extends Exclude<foundry.CONST.EMBEDDED_DOCUMENT_TYPES, "Region" | "RegionBehavior">,
+  >(
     embeddedName: EmbeddedName,
     ids: Array<string>,
-    operation?: InexactPartial<Omit<DatabaseDeleteOperation, "ids">>,
+    operation?: DatabaseOperationsFor<ConcreteMetadata["name"], "delete">,
   ): Promise<Array<StoredDocument<InstanceType<ConfiguredDocumentClassForName<EmbeddedName>>>>>;
 
   /**
@@ -661,7 +671,7 @@ declare abstract class Document<
    */
   protected _preCreate(
     data: fields.SchemaField.AssignmentType<Schema>,
-    options: DocumentModificationOptions,
+    options: DocumentPreCreateOptions<ConcreteMetadata["name"]>,
     user: foundry.documents.BaseUser,
   ): Promise<boolean | void>;
 
@@ -674,7 +684,7 @@ declare abstract class Document<
    */
   protected _onCreate(
     data: fields.SchemaField.InnerAssignmentType<Schema>,
-    options: DocumentModificationOptions,
+    options: DocumentOnCreateOptions<ConcreteMetadata["name"]>,
     userId: string,
   ): void;
 
@@ -695,7 +705,7 @@ declare abstract class Document<
   protected static _preCreateOperation<T extends Document.AnyConstructor>(
     this: T,
     documents: InstanceType<Document.ConfiguredClass<T>>[],
-    operation: DatabaseCreateOperation,
+    operation: DatabaseOperationsFor<T["metadata"]["name"], "create">,
     user: foundry.documents.BaseUser,
   ): Promise<boolean | void>;
 
@@ -712,7 +722,7 @@ declare abstract class Document<
   protected static _onCreateOperation<T extends Document.AnyConstructor>(
     this: T,
     documents: InstanceType<Document.ConfiguredClass<T>>[],
-    operation: DatabaseCreateOperation,
+    operation: DatabaseOperationsFor<T["metadata"]["name"], "create">,
     user: foundry.documents.BaseUser,
   ): Promise<void>;
 
@@ -726,7 +736,7 @@ declare abstract class Document<
    */
   protected _preUpdate(
     changed: fields.SchemaField.AssignmentType<Schema>,
-    options: DocumentModificationOptions,
+    options: DocumentPreUpdateOptions<ConcreteMetadata["name"]>,
     user: foundry.documents.BaseUser,
   ): Promise<boolean | void>;
 
@@ -739,7 +749,7 @@ declare abstract class Document<
    */
   protected _onUpdate(
     changed: fields.SchemaField.InnerAssignmentType<Schema>,
-    options: DocumentModificationOptions,
+    options: DocumentOnUpdateOptions<ConcreteMetadata["name"]>,
     userId: string,
   ): void;
 
@@ -761,7 +771,7 @@ declare abstract class Document<
   protected static _preUpdateOperation<T extends Document.AnyConstructor>(
     this: T,
     documents: InstanceType<Document.ConfiguredClass<T>>[],
-    operation: DatabaseUpdateOperation,
+    operation: DatabaseOperationsFor<InstanceType<T>["documentName"], "update">,
     user: foundry.documents.BaseUser,
   ): Promise<boolean | void>;
 
@@ -778,7 +788,7 @@ declare abstract class Document<
   protected static _onUpdateOperation<T extends Document.AnyConstructor>(
     this: T,
     documents: InstanceType<Document.ConfiguredClass<T>>[],
-    operation: DatabaseUpdateOperation,
+    operation: DatabaseOperationsFor<InstanceType<T>["documentName"], "update">,
     user: foundry.documents.BaseUser,
   ): Promise<void>;
 
@@ -789,7 +799,10 @@ declare abstract class Document<
    * @param user    - The User requesting the document deletion
    * @returns A return value of false indicates the delete operation should be cancelled
    */
-  protected _preDelete(options: DocumentModificationOptions, user: foundry.documents.BaseUser): Promise<boolean | void>;
+  protected _preDelete(
+    options: DocumentPreDeleteOptions<ConcreteMetadata["name"]>,
+    user: foundry.documents.BaseUser,
+  ): Promise<boolean | void>;
 
   /**
    * Perform follow-up operations after a Document of this type is deleted.
@@ -797,7 +810,7 @@ declare abstract class Document<
    * @param options - Additional options which modify the deletion request
    * @param userId  - The id of the User requesting the document update
    */
-  protected _onDelete(options: DocumentModificationOptions, userId: string): void;
+  protected _onDelete(options: DocumentOnDeleteOptions<ConcreteMetadata["name"]>, userId: string): void;
 
   /**
    * Pre-process a deletion operation, potentially altering its instructions or input data. Pre-operation events only
@@ -818,7 +831,7 @@ declare abstract class Document<
   protected static _preDeleteOperation<T extends Document.AnyConstructor>(
     this: T,
     documents: InstanceType<Document.ConfiguredClass<T>>[],
-    operation: DatabaseDeleteOperation,
+    operation: DatabaseOperationsFor<InstanceType<T>["documentName"], "delete">,
     user: foundry.documents.BaseUser,
   ): Promise<boolean | void>;
 
@@ -835,7 +848,7 @@ declare abstract class Document<
   protected static _onDeleteOperation<T extends Document.AnyConstructor>(
     this: T,
     documents: InstanceType<Document.ConfiguredClass<T>>[],
-    operation: DatabaseDeleteOperation,
+    operation: DatabaseOperationsFor<InstanceType<T>["documentName"], "delete">,
     user: foundry.documents.BaseUser,
   ): Promise<void>;
 
@@ -981,6 +994,7 @@ declare namespace Document {
     OptionsForSchema<Schema> extends FlagInSchema<S, K, infer Options> ? DataField.InitializedType<Options> : undefined;
 }
 
+/** @deprecated - since v12 */
 export type DocumentModificationOptions = Omit<DocumentModificationContext, "parent" | "pack">;
 
 export interface Context<Parent extends Document.Any | null> {
@@ -1020,7 +1034,7 @@ export interface Metadata<ConcreteDocument extends Document.Any> {
           doc: ConcreteDocument,
           data: fields.SchemaField.InnerAssignmentType<ConcreteDocument["schema"]["fields"]>,
         ) => boolean);
-    delete: string | ((user: foundry.documents.BaseUser, doc: ConcreteDocument, data: {}) => boolean);
+    delete: string | ((user: foundry.documents.BaseUser, doc: ConcreteDocument, data: EmptyObject) => boolean);
   };
   preserveOnImport?: string[];
   schemaVersion: string | undefined;
@@ -1035,7 +1049,7 @@ export interface DocumentMetadata {
   collection: "documents";
   label: "DOCUMENT.Document";
   types: [];
-  embedded: {};
+  embedded: EmptyObject;
   hasSystemData: false;
   permissions: {
     create: "ASSISTANT";
@@ -1044,3 +1058,89 @@ export interface DocumentMetadata {
   };
   pack: null;
 }
+
+export type Operation = "create" | "update" | "delete";
+
+/* eslint-disable @typescript-eslint/no-empty-object-type */
+export interface DocumentDatabaseOperations<
+  T extends foundry.abstract.Document.Any = foundry.abstract.Document.Any,
+  ExtraCreateOptions extends Record<string, unknown> = {},
+  ExtraUpdateOptions extends Record<string, unknown> = {},
+  ExtraDeleteOptions extends Record<string, unknown> = {},
+> {
+  create: DatabaseCreateOperation<T> & InexactPartial<ExtraCreateOptions>;
+  update: DatabaseUpdateOperation<T> & InexactPartial<ExtraUpdateOptions>;
+  delete: DatabaseDeleteOperation & InexactPartial<ExtraDeleteOptions>;
+}
+/* eslint-enable @typescript-eslint/no-empty-object-type */
+
+export interface DatabaseOperationMap {
+  ActiveEffect: ActiveEffect.DatabaseOperations;
+  Actor: Actor.DatabaseOperations;
+  ActorDelta: ActorDelta.DatabaseOperations;
+  Adventure: Adventure.DatabaseOperations;
+  AmbientLight: AmbientLightDocument.DatabaseOperations;
+  AmbientSound: AmbientSoundDocument.DatabaseOperations;
+  Card: Card.DatabaseOperations;
+  Cards: Cards.DatabaseOperations;
+  ChatMessage: ChatMessage.DatabaseOperations;
+  Combat: Combat.DatabaseOperations;
+  Combatant: Combatant.DatabaseOperations;
+  Drawing: DrawingDocument.DatabaseOperations;
+  FogExploration: FogExploration.DatabaseOperations;
+  Folder: Folder.DatabaseOperations;
+  Item: Item.DatabaseOperations;
+  JournalEntry: JournalEntry.DatabaseOperations;
+  JournalEntryPage: JournalEntryPage.DatabaseOperations;
+  Macro: Macro.DatabaseOperations;
+  MeasuredTemplate: MeasuredTemplateDocument.DatabaseOperations;
+  Note: NoteDocument.DatabaseOperations;
+  Playlist: Playlist.DatabaseOperations;
+  PlaylistSound: PlaylistSound.DatabaseOperations;
+  // TODO: Add these once documents are done
+  // Region: ActiveEffect.DatabaseOperations;
+  // RegionBehavior: ActiveEffect.DatabaseOperations;
+  RollTable: RollTable.DatabaseOperations;
+  Scene: Scene.DatabaseOperations;
+  Setting: Setting.DatabaseOperations;
+  TableResult: TableResult.DatabaseOperations;
+  Tile: TileDocument.DatabaseOperations;
+  Token: TokenDocument.DatabaseOperations;
+  User: User.DatabaseOperations;
+  Wall: WallDocument.DatabaseOperations;
+}
+
+// options
+export type DocumentPreCreateOptions<Name extends DocumentType> = Omit<
+  DatabaseOperationsFor<Name, "create">,
+  "data" | "noHook" | "pack" | "parent"
+>;
+export type DocumentOnCreateOptions<Name extends DocumentType> = Omit<
+  DatabaseOperationsFor<Name, "create">,
+  "pack" | "parentUuid" | "syntheticActorUpdate"
+>;
+
+export type DocumentPreUpdateOptions<Name extends DocumentType> = Omit<
+  DatabaseOperationsFor<Name, "update">,
+  "updates" | "restoreDelta" | "noHook" | "parent" | "pack"
+>;
+export type DocumentOnUpdateOptions<Name extends DocumentType> = Omit<
+  DatabaseOperationsFor<Name, "update">,
+  "pack" | "parentUuid" | "syntheticActorUpdate"
+>;
+
+export type DocumentPreDeleteOptions<Name extends DocumentType> = Omit<
+  DatabaseOperationsFor<Name, "delete">,
+  "ids" | "deleteAll" | "noHook" | "pack" | "parent"
+>;
+export type DocumentOnDeleteOptions<Name extends DocumentType> = Omit<
+  DatabaseOperationsFor<Name, "delete">,
+  "deleteAll" | "pack" | "parentUuid" | "syntheticActorUpdate"
+>;
+
+export type DocumentPreUpsertOptions<Name extends DocumentType> =
+  | DocumentPreCreateOptions<Name>
+  | DocumentPreUpdateOptions<Name>;
+export type DocumentOnUpsertOptions<Name extends DocumentType> =
+  | DocumentOnCreateOptions<Name>
+  | DocumentOnUpdateOptions<Name>;
diff --git a/src/foundry/common/abstract/type-data.d.mts b/src/foundry/common/abstract/type-data.d.mts
index 32f8410fa..59bd0ee3f 100644
--- a/src/foundry/common/abstract/type-data.d.mts
+++ b/src/foundry/common/abstract/type-data.d.mts
@@ -10,8 +10,15 @@ import type {
 import type { SchemaField } from "../data/fields.d.mts";
 import type BaseUser from "../documents/user.d.mts";
 import type { DataModel } from "./data.d.mts";
+import type {
+  DocumentOnCreateOptions,
+  DocumentOnDeleteOptions,
+  DocumentOnUpdateOptions,
+  DocumentPreCreateOptions,
+  DocumentPreDeleteOptions,
+  DocumentPreUpdateOptions,
+} from "./document.d.mts";
 import type Document from "./document.d.mts";
-import type { DocumentModificationOptions } from "./document.d.mts";
 
 type StaticDataModel = typeof DataModel<DataSchema, Document<DataSchema, any, any>>;
 
@@ -247,7 +254,7 @@ export default abstract class TypeDataModel<
    */
   protected _preCreate(
     data: TypeDataModel.ParentAssignmentType<this>,
-    options: DocumentModificationOptions,
+    options: DocumentPreCreateOptions<any>,
     user: BaseUser,
   ): Promise<boolean | void>;
 
@@ -260,7 +267,7 @@ export default abstract class TypeDataModel<
    */
   protected _onCreate(
     data: TypeDataModel.ParentAssignmentType<this>,
-    options: DocumentModificationOptions,
+    options: DocumentOnCreateOptions<any>,
     userId: string,
   ): void;
 
@@ -274,7 +281,7 @@ export default abstract class TypeDataModel<
    */
   protected _preUpdate(
     changes: DeepPartial<TypeDataModel.ParentAssignmentType<this>>,
-    options: DocumentModificationOptions,
+    options: DocumentPreUpdateOptions<any>,
     userId: string,
   ): Promise<boolean | void>;
 
@@ -287,7 +294,7 @@ export default abstract class TypeDataModel<
    */
   protected _onUpdate(
     changed: DeepPartial<TypeDataModel.ParentAssignmentType<this>>,
-    options: DocumentModificationOptions,
+    options: DocumentOnUpdateOptions<any>,
     userId: string,
   ): void;
 
@@ -298,7 +305,7 @@ export default abstract class TypeDataModel<
    * @param user    - The User requesting the document deletion
    * @returns A return value of false indicates the deletion operation should be cancelled.
    */
-  protected _preDelete(options: DocumentModificationOptions, user: BaseUser): Promise<boolean | void>;
+  protected _preDelete(options: DocumentPreDeleteOptions<any>, user: BaseUser): Promise<boolean | void>;
 
   /**
    * Called by {@link ClientDocument#_onDelete}.
@@ -306,5 +313,5 @@ export default abstract class TypeDataModel<
    * @param options - Additional options which modify the deletion request
    * @param userId  - The id of the User requesting the document update
    */
-  protected _onDelete(options: DocumentModificationOptions, userId: string): void;
+  protected _onDelete(options: DocumentOnDeleteOptions<any>, userId: string): void;
 }
diff --git a/src/foundry/common/documents/active-effect.d.mts b/src/foundry/common/documents/active-effect.d.mts
index da21a95fa..dd427d15e 100644
--- a/src/foundry/common/documents/active-effect.d.mts
+++ b/src/foundry/common/documents/active-effect.d.mts
@@ -1,6 +1,6 @@
-import type { AnyObject, EmptyObject, InexactPartial, Merge } from "../../../types/utils.mts";
+import type { AnyObject, InexactPartial, Merge } from "../../../types/utils.mts";
 import type Document from "../abstract/document.mts";
-import type { DocumentMetadata, DocumentModificationOptions } from "../abstract/document.mts";
+import type { DocumentMetadata } from "../abstract/document.mts";
 import type * as CONST from "../constants.mts";
 import type * as fields from "../data/fields.d.mts";
 import type * as documents from "./_module.mts";
@@ -46,11 +46,10 @@ declare class BaseActiveEffect extends Document<
     }>,
   ): boolean;
 
-  protected override _preCreate(
-    data: fields.SchemaField.AssignmentType<BaseActiveEffect.Schema, EmptyObject>,
-    options: DocumentModificationOptions,
-    user: documents.BaseUser,
-  ): Promise<void>;
+  /**
+   * @privateRemarks _preCreate overridden but with no signature changes.
+   * For type simplicity it is left off. These methods historically have been the source of a large amount of computation from tsc.
+   */
 
   protected override _initialize(options?: any): void;
 
diff --git a/src/foundry/common/documents/actor.d.mts b/src/foundry/common/documents/actor.d.mts
index 1a267746d..e7e123d63 100644
--- a/src/foundry/common/documents/actor.d.mts
+++ b/src/foundry/common/documents/actor.d.mts
@@ -1,6 +1,6 @@
-import type { AnyObject, EmptyObject, Merge } from "../../../types/utils.mts";
+import type { AnyObject, Merge } from "../../../types/utils.mts";
 import type Document from "../abstract/document.mts";
-import type { DocumentMetadata, DocumentModificationOptions } from "../abstract/document.mts";
+import type { DocumentMetadata } from "../abstract/document.mts";
 import type { PrototypeToken } from "../data/data.mts";
 import type * as fields from "../data/fields.d.mts";
 import type * as documents from "./_module.d.mts";
@@ -184,17 +184,10 @@ declare class BaseActor extends Document<BaseActor.Schema, BaseActor.Metadata> {
    */
   static #canUpdate(user: documents.BaseUser, doc: BaseActor, data: BaseActor.UpdateData): boolean;
 
-  protected override _preCreate(
-    data: fields.SchemaField.AssignmentType<documents.BaseActor.Schema, EmptyObject>,
-    options: DocumentModificationOptions,
-    user: documents.BaseUser,
-  ): Promise<void>;
-
-  protected override _preUpdate(
-    changed: fields.SchemaField.AssignmentType<documents.BaseActor.Schema, EmptyObject>,
-    options: DocumentModificationOptions,
-    user: documents.BaseUser,
-  ): Promise<void>;
+  /**
+   * @privateRemarks _preCreate and _preUpdate are overridden but with no signature changes.
+   * For type simplicity they are left off. These methods historically have been the source of a large amount of computation from tsc.
+   */
 
   static override migrateData(source: AnyObject): AnyObject;
 
diff --git a/src/foundry/common/documents/fog-exploration.d.mts b/src/foundry/common/documents/fog-exploration.d.mts
index 165f253fa..60763ddc9 100644
--- a/src/foundry/common/documents/fog-exploration.d.mts
+++ b/src/foundry/common/documents/fog-exploration.d.mts
@@ -1,6 +1,6 @@
-import type { EmptyObject, Merge } from "../../../types/utils.mts";
+import type { Merge } from "../../../types/utils.mts";
 import type Document from "../abstract/document.mts";
-import type { DocumentMetadata, DocumentModificationOptions } from "../abstract/document.mts";
+import type { DocumentMetadata } from "../abstract/document.mts";
 import type * as fields from "../data/fields.d.mts";
 import type * as documents from "./_module.mts";
 
@@ -25,12 +25,12 @@ declare class BaseFogExploration extends Document<BaseFogExploration.Schema, Bas
 
   static #canModify(user: documents.BaseUser, doc: BaseFogExploration);
 
-  protected override _preUpdate(
-    changed: fields.SchemaField.AssignmentType<documents.BaseFogExploration.Schema, EmptyObject>,
-    options: DocumentModificationOptions,
-    user: documents.BaseUser,
-  ): Promise<void>;
+  /**
+   * @privateRemarks _preUpdate is overridden but with no signature changes.
+   * For type simplicity it is left off. These methods historically have been the source of a large amount of computation from tsc.
+   */
 }
+
 export default BaseFogExploration;
 
 declare namespace BaseFogExploration {
diff --git a/src/foundry/common/documents/macro.d.mts b/src/foundry/common/documents/macro.d.mts
index 63e77d0cb..8aeb4dac2 100644
--- a/src/foundry/common/documents/macro.d.mts
+++ b/src/foundry/common/documents/macro.d.mts
@@ -1,6 +1,6 @@
-import type { AnyObject, EmptyObject, InexactPartial, Merge } from "../../../types/utils.d.mts";
+import type { AnyObject, InexactPartial, Merge } from "../../../types/utils.d.mts";
 import type Document from "../abstract/document.d.mts";
-import type { DocumentMetadata, DocumentModificationOptions } from "../abstract/document.d.mts";
+import type { DocumentMetadata } from "../abstract/document.d.mts";
 import type * as CONST from "../constants.mts";
 import type * as fields from "../data/fields.d.mts";
 import type * as documents from "./_module.mts";
@@ -41,11 +41,10 @@ declare class BaseMacro extends Document<BaseMacro.Schema, BaseMacro.Metadata> {
     }>,
   ): boolean;
 
-  protected override _preCreate(
-    data: fields.SchemaField.AssignmentType<documents.BaseMacro.Schema, EmptyObject>,
-    options: DocumentModificationOptions,
-    user: foundry.documents.BaseUser,
-  ): Promise<void>;
+  /**
+   * @privateRemarks _preCreate all overridden but with no signature changes.
+   * For type simplicity it is left off. These methods historically have been the source of a large amount of computation from tsc.
+   */
 
   static override migrateData(source: AnyObject): AnyObject;
 
diff --git a/src/foundry/common/prosemirror/keymaps.d.mts b/src/foundry/common/prosemirror/keymaps.d.mts
index e1e6fe8f0..5029600f9 100644
--- a/src/foundry/common/prosemirror/keymaps.d.mts
+++ b/src/foundry/common/prosemirror/keymaps.d.mts
@@ -17,7 +17,7 @@ export type ProseMirrorCommand = (
 export declare namespace ProseMirrorKeyMaps {
   export interface Options {
     /** A function to call when Ctrl+S is pressed. */
-    onSave?: Function;
+    onSave?: () => void;
   }
 }
 
@@ -35,7 +35,7 @@ declare class ProseMirrorKeyMaps extends ProseMirrorPlugin {
   /**
    * A function to call when Ctrl+S is pressed.
    */
-  readonly onSave: Function;
+  readonly onSave: () => void;
 
   static override build(schema: Schema, options?: ProseMirrorKeyMaps.Options): Plugin;
 
diff --git a/src/foundry/common/prosemirror/util.d.mts b/src/foundry/common/prosemirror/util.d.mts
index d0f49d081..b5fc304be 100644
--- a/src/foundry/common/prosemirror/util.d.mts
+++ b/src/foundry/common/prosemirror/util.d.mts
@@ -28,10 +28,16 @@ export declare function serializeHTMLString(
   },
 ): string;
 
+/**
+ * @param node    - The candidate node.
+ * @returns A new node to replace the candidate node, or nothing if a replacement should not be made.
+ */
+export declare type ProseMirrorSliceTransformer = (node: Node) => Node | void;
+
 /**
  * Apply a transformation to some nodes in a slice, and return the new slice.
  * @param slice       - The slice to transform.
  * @param transformer - The transformation function.
  * @returns Either the original slice if no changes were made, or the newly-transformed slice.
  */
-export declare function transformSlice(slice: Slice, transformer: Function): Slice;
+export declare function transformSlice(slice: Slice, transformer: ProseMirrorSliceTransformer): Slice;
diff --git a/src/foundry/common/types.d.mts b/src/foundry/common/types.d.mts
index 4aa8453c4..5ef7aad40 100644
--- a/src/foundry/common/types.d.mts
+++ b/src/foundry/common/types.d.mts
@@ -1,6 +1,7 @@
-import type { ConstructorOf, DeepPartial } from "../../types/utils.d.mts";
 import type ApplicationV2 from "../client-esm/applications/api/application.mts";
 import type { CustomFormInput } from "../client-esm/applications/forms/fields.mts";
+import type { DataModel } from "./abstract/module.d.mts";
+import type { DataField } from "./data/fields.d.mts";
 
 declare global {
   interface DocumentConstructionContext {
@@ -23,7 +24,11 @@ declare global {
     strict?: boolean | undefined;
   }
 
-  // TODO Removed in v12
+  // TODO: deprecated in V12, will be removed in V14
+  // note: this was removed from this file in V12, but there are still (deprecated) methods
+  //    in Document that use it, so we should retain it until V14 when those
+  //    methods are removed
+  /** @deprecated since v12 */
   interface DocumentModificationContext {
     /**
      * A parent Document within which these Documents should be embedded
@@ -118,17 +123,37 @@ declare global {
    */
   type PointArray = [x: number, y: number];
 
+  /**
+   * Make all properties in T recursively readonly.
+   */
+  /* eslint-disable prettier/prettier */   // prettier is breaking this code
+  type DeepReadonly<T> = Readonly<{
+    [K in keyof T]:
+      /* eslint-disable-next-line @typescript-eslint/no-unsafe-function-type */
+       T[K] extends (undefined | null | boolean | number | string | symbol | bigint | Function) ? T[K] :
+       T[K] extends Array<infer V> ? ReadonlyArray<DeepReadonly<V>> :
+       T[K] extends Map<infer K, infer V> ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>> :
+       T[K] extends Set<infer V> ? ReadonlySet<DeepReadonly<V>> : DeepReadonly<T[K]>
+   }>
+  /* eslint-enable prettier/prettier */
+
+  /**
+   * A class constructor.
+   * Used for functions with generic class constructor parameters.
+   */
+  type Constructor = new (...args: any[]) => any;
+
   /**
    * A standard rectangle interface.
    */
-  type Rectangle =
-    | PIXI.Rectangle
-    | {
-        x: number;
-        y: number;
-        width: number;
-        height: number;
-      };
+  interface Rectangle {
+    x: number;
+    y: number;
+    width: number;
+    height: number;
+  }
+
+  type BuiltInTypes = typeof Number | typeof String | typeof Boolean;
 
   type RGBColorVector = [r: number, g: number, b: number];
   type HSVColorVector = [h: number, s: number, v: number];
@@ -159,19 +184,8 @@ declare global {
     /** Indicates if this Setting should render in the Config application */
     config?: boolean | undefined;
 
-    // TODO: This can take data models and data fields now
-    /** The JS Type that the Setting is storing */
-    type?:
-      | (T extends string
-          ? typeof String
-          : T extends number
-            ? typeof Number
-            : T extends boolean
-              ? typeof Boolean
-              : T extends Array<any>
-                ? typeof Array
-                : ConstructorOf<T>)
-      | undefined;
+    /** The type of data stored by this Setting */
+    type: BuiltInTypes | DataField | DataModel<any, any>;
 
     /** For string Types, defines the allowable values */
     choices?: (T extends number | string ? Record<T, string> : never) | undefined;
@@ -188,7 +202,7 @@ declare global {
       | undefined;
 
     /** The default value */
-    default: T;
+    default?: T | undefined;
 
     /** Whether setting requires Foundry to be reloaded on change  */
     requiresReload?: boolean | undefined;
diff --git a/src/types/helperTypes.d.mts b/src/types/helperTypes.d.mts
index 1fc0f8fb8..5148aa8df 100644
--- a/src/types/helperTypes.d.mts
+++ b/src/types/helperTypes.d.mts
@@ -1,3 +1,4 @@
+import type { DatabaseOperationMap, Operation } from "../foundry/common/abstract/document.d.mts";
 import type { ConfiguredDocuments } from "./configuredDocuments.d.mts";
 import type { DeepPartial, EmptyObject } from "./utils.d.mts";
 
@@ -207,3 +208,12 @@ export type HandleEmptyObject<
 export type ConformRecord<T extends object, V> = {
   [K in keyof T]: [T[K]] extends [V] ? T[K] : never;
 };
+
+/**
+ * This is a helper type that gets the right DatabaseOperation (including the
+ * proper options) for a particular Document type.
+ */
+export type DatabaseOperationsFor<
+  Name extends DocumentType,
+  ConcreteOperation extends Operation,
+> = DatabaseOperationMap[Name][ConcreteOperation];


Test patch:
diff --git a/tests/foundry/client/data/documents/active-effect.test-d.ts b/tests/foundry/client/data/documents/active-effect.test-d.ts
index a3d4cdbe0..02887ae4d 100644
--- a/tests/foundry/client/data/documents/active-effect.test-d.ts
+++ b/tests/foundry/client/data/documents/active-effect.test-d.ts
@@ -1,29 +1,30 @@
 import { expectTypeOf } from "vitest";
+import type { DataModel, Document } from "../../../../../src/foundry/common/abstract/module.d.mts";
 
-const eff = new ActiveEffect({});
+// @ts-expect-error - ActiveEffect requires name.
+new ActiveEffect();
 
-expectTypeOf(eff.img).toEqualTypeOf<string | null | undefined>();
-expectTypeOf(eff.updateDuration().seconds).toEqualTypeOf<number | undefined | null>();
+// @ts-expect-error - ActiveEffect requires name.
+new ActiveEffect({});
 
-// declare global {
-//   interface FlagConfig {
-//     ActiveEffect: {
-//       mySystem?: {
-//         importantFlag?: boolean;
-//       };
-//     };
-//   }
-// }
+const effect = new ActiveEffect({ name: "My effect" });
+expectTypeOf(effect).toEqualTypeOf<ActiveEffect>();
 
-// expectTypeOf(eff.getFlag("mySystem", "importantFlag")).toEqualTypeOf<boolean | undefined>();
-// expectTypeOf(eff.getFlag("core", "statusId")).toEqualTypeOf<string | undefined>();
-// expectTypeOf(eff.getFlag("core", "overlay")).toEqualTypeOf<boolean | undefined>();
+declare const model: DataModel.Any;
+declare const change: EffectChangeData;
 
-// eff.setFlag("core", "statusId", "foo");
-// eff.setFlag("core", "overlay", false);
+expectTypeOf(ActiveEffect.fromStatusEffect("")).toEqualTypeOf<Promise<ActiveEffect.ConfiguredInstance>>();
+expectTypeOf(ActiveEffect.applyField(model, change)).toEqualTypeOf<unknown>();
 
-// // @ts-expect-error the setting core.statusId is a string not a number
-// eff.setFlag("core", "statusId", 0);
+expectTypeOf(effect.isSuppressed).toEqualTypeOf<boolean>();
+expectTypeOf(effect.target).toEqualTypeOf<Document.Any | null>();
+expectTypeOf(effect.active).toEqualTypeOf<boolean>();
+expectTypeOf(effect.modifiesActor).toEqualTypeOf<boolean>();
+expectTypeOf(effect.prepareBaseData()).toEqualTypeOf<void>();
+expectTypeOf(effect.prepareDerivedData()).toEqualTypeOf<void>();
+expectTypeOf(effect.updateDuration()).toEqualTypeOf<ActiveEffectDuration>();
+expectTypeOf(effect.isTemporary).toEqualTypeOf<boolean>();
+expectTypeOf(effect.sourceName).toEqualTypeOf<string>();
 
-// // @ts-expect-error the setting core.overlay is a boolean not a number
-// eff.setFlag("core", "overlay", 0);
+declare const actor: Actor.ConfiguredInstance;
+expectTypeOf(effect.apply(actor, change)).toEqualTypeOf<unknown>();
diff --git a/tests/foundry/client/data/documents/actor-delta.test-d.ts b/tests/foundry/client/data/documents/actor-delta.test-d.ts
new file mode 100644
index 000000000..038e72b12
--- /dev/null
+++ b/tests/foundry/client/data/documents/actor-delta.test-d.ts
@@ -0,0 +1,12 @@
+import { expectTypeOf } from "vitest";
+// import type { ArmorData, WeaponData } from "./item.test-d";
+
+const actorDelta = new ActorDelta();
+expectTypeOf(actorDelta).toEqualTypeOf<ActorDelta>();
+
+expectTypeOf(actorDelta.apply("")).toEqualTypeOf<Actor.ConfiguredInstance>();
+expectTypeOf(actorDelta.prepareEmbeddedDocuments()).toEqualTypeOf<void>();
+expectTypeOf(actorDelta.updateSource()).toEqualTypeOf<object>();
+expectTypeOf(actorDelta.reset()).toEqualTypeOf<void>();
+expectTypeOf(actorDelta.updateSyntheticActor()).toEqualTypeOf<void>();
+expectTypeOf(actorDelta.restore()).toEqualTypeOf<Promise<Actor.ConfiguredInstance>>();
diff --git a/tests/foundry/client/data/documents/actor.test-d.ts b/tests/foundry/client/data/documents/actor.test-d.ts
index 97dd25b08..5868acd20 100644
--- a/tests/foundry/client/data/documents/actor.test-d.ts
+++ b/tests/foundry/client/data/documents/actor.test-d.ts
@@ -1,9 +1,29 @@
 import { expectTypeOf } from "vitest";
 // import type { ArmorData, WeaponData } from "./item.test-d";
 
+// @ts-expect-error - Actor requires name.
+new Actor();
+
+// @ts-expect-error - Actor requires name.
+new Actor({});
+
 const actor = new Actor({ name: "Beren", type: "base" });
+expectTypeOf(actor).toEqualTypeOf<Actor>();
 
+expectTypeOf(actor.overrides).toEqualTypeOf<Record<string, unknown>>();
+expectTypeOf(actor.statuses).toEqualTypeOf<Set<string>>();
+expectTypeOf(actor.thumbnail).toEqualTypeOf<typeof actor.img>();
+expectTypeOf(actor.itemTypes).toEqualTypeOf<{
+  [K in foundry.documents.BaseItem["type"]]: Array<Item.ConfiguredInstance & { type: K }>;
+}>();
+
+expectTypeOf(actor.isToken).toEqualTypeOf<boolean>();
+expectTypeOf(actor.appliedEffects).toEqualTypeOf<ActiveEffect[]>();
+expectTypeOf(actor.temporaryEffects).toEqualTypeOf<ReturnType<(typeof actor)["effects"]["filter"]>>();
 expectTypeOf(actor.token).toEqualTypeOf<TokenDocument | null>();
+expectTypeOf(actor.inCombat).toEqualTypeOf<boolean>();
+
+expectTypeOf(actor.applyActiveEffects()).toEqualTypeOf<void>();
 expectTypeOf(actor.getActiveTokens(true, true)).toEqualTypeOf<TokenDocument[]>();
 expectTypeOf(actor.getActiveTokens(true, false)).toEqualTypeOf<Token[]>();
 
@@ -15,3 +35,12 @@ expectTypeOf(actor.itemTypes.armor[0]!.type).toEqualTypeOf<"armor">();
 for (const effect of actor.allApplicableEffects()) {
   expectTypeOf(effect).toEqualTypeOf<ActiveEffect>();
 }
+
+expectTypeOf(actor.getRollData()).toEqualTypeOf<object>();
+expectTypeOf(actor.getTokenImages()).toEqualTypeOf<Promise<string[]>>();
+expectTypeOf(actor.modifyTokenAttribute("", 2, true, true)).toEqualTypeOf<Promise<Actor | undefined>>();
+
+expectTypeOf(actor.prepareEmbeddedDocuments()).toEqualTypeOf<void>();
+
+expectTypeOf(actor.rollInitiative()).toEqualTypeOf<Promise<void>>();
+expectTypeOf(actor.getDependentTokens()).toEqualTypeOf<TokenDocument[]>();
diff --git a/tests/foundry/client/data/documents/adventure.test-d.ts b/tests/foundry/client/data/documents/adventure.test-d.ts
index 91831d103..4db39b414 100644
--- a/tests/foundry/client/data/documents/adventure.test-d.ts
+++ b/tests/foundry/client/data/documents/adventure.test-d.ts
@@ -1,4 +1,6 @@
 import { expectTypeOf } from "vitest";
+import type { DataModel } from "../../../../../src/foundry/common/abstract/module.d.mts";
+import type { fields } from "../../../../../src/foundry/common/data/module.d.mts";
 
 // @ts-expect-error - Adventure requires name.
 new Adventure();
@@ -14,3 +16,7 @@ expectTypeOf(adventure.prepareImport()).toEqualTypeOf<Promise<AdventureImportDat
 expectTypeOf(adventure.importContent()).toEqualTypeOf<Promise<AdventureImportResult>>();
 
 expectTypeOf(adventure.sheet).toEqualTypeOf<FormApplication | foundry.applications.api.ApplicationV2 | null>();
+
+declare const source: fields.SchemaField.InnerAssignmentType<DataSchema>;
+
+expectTypeOf(Adventure.fromSource(source)).toEqualTypeOf<DataModel<DataSchema, DataModel.Any | null>>();
diff --git a/tests/foundry/client/data/documents/ambient-light.test-d.ts b/tests/foundry/client/data/documents/ambient-light.test-d.ts
new file mode 100644
index 000000000..f5ad0d4f5
--- /dev/null
+++ b/tests/foundry/client/data/documents/ambient-light.test-d.ts
@@ -0,0 +1,6 @@
+import { expectTypeOf } from "vitest";
+
+const light = new AmbientLightDocument();
+expectTypeOf(light).toEqualTypeOf<AmbientLightDocument>();
+
+expectTypeOf(light.isGlobal).toEqualTypeOf<boolean>();
diff --git a/tests/foundry/client/data/documents/ambient-sound.test-d.ts b/tests/foundry/client/data/documents/ambient-sound.test-d.ts
new file mode 100644
index 000000000..45564e2a2
--- /dev/null
+++ b/tests/foundry/client/data/documents/ambient-sound.test-d.ts
@@ -0,0 +1,4 @@
+import { expectTypeOf } from "vitest";
+
+const sound = new AmbientSoundDocument();
+expectTypeOf(sound).toEqualTypeOf<AmbientSoundDocument>();
diff --git a/tests/foundry/client/data/documents/card.test-d.ts b/tests/foundry/client/data/documents/card.test-d.ts
index ec138cec6..8660e6716 100644
--- a/tests/foundry/client/data/documents/card.test-d.ts
+++ b/tests/foundry/client/data/documents/card.test-d.ts
@@ -1,11 +1,16 @@
 import { expectTypeOf } from "vitest";
 
+// @ts-expect-error - Card requires name.
+new Card();
+
+// @ts-expect-error - Card requires name.
+new Card({});
+
 // TODO: Investigate why this isn't complaining about specific types
 const card = new Card({ name: "Just a single card", type: "base" });
 const cards = new Cards({ name: "Some Card Deck", type: "deck" });
 
-expectTypeOf(card.back).toEqualTypeOf<CardFaceData>();
-expectTypeOf(card.face).toEqualTypeOf<number | null>();
+expectTypeOf(card.currentFace).toEqualTypeOf<CardFaceData | null>();
 expectTypeOf(card.img).toEqualTypeOf<string>();
 expectTypeOf(card.name).toEqualTypeOf<string>();
 expectTypeOf(card.source).toEqualTypeOf<Cards | undefined | null>();
@@ -68,7 +73,7 @@ card.discard(cards, { unknownProp: 0 });
 // @ts-expect-error - "unknownProp" is not a valid option
 card.discard(cards, { updateData: { unknownProp: 0 } });
 
-// discard
+// recall
 expectTypeOf(card.recall()).toEqualTypeOf<Promise<Card>>();
 expectTypeOf(
   card.recall({
@@ -77,12 +82,6 @@ expectTypeOf(
   }),
 ).toEqualTypeOf<Promise<Card>>();
 
-// @ts-expect-error - "unknownProp" is not a valid option
-card.reset({ unknownProp: 0 });
-
-// @ts-expect-error - "unknownProp" is not a valid option
-card.reset({ updateData: { unknownProp: 0 } });
-
 // toMessage
 expectTypeOf(card.toMessage()).toEqualTypeOf<Promise<ChatMessage | undefined>>();
 expectTypeOf(
@@ -97,3 +96,9 @@ expectTypeOf(
     },
   ),
 ).toEqualTypeOf<Promise<ChatMessage | undefined>>();
+
+// @ts-expect-error - "unknownProp" is not a valid option
+card.reset({ unknownProp: 0 });
+
+// @ts-expect-error - "unknownProp" is not a valid option
+card.reset({ updateData: { unknownProp: 0 } });
diff --git a/tests/foundry/client/data/documents/cards.test-d.ts b/tests/foundry/client/data/documents/cards.test-d.ts
index ba80a8345..6399a0c8d 100644
--- a/tests/foundry/client/data/documents/cards.test-d.ts
+++ b/tests/foundry/client/data/documents/cards.test-d.ts
@@ -4,8 +4,8 @@ import type { FilePathField } from "../../../../../src/foundry/common/data/field
 // @ts-expect-error - Cards requires name.
 new Cards();
 
-// // @ts-expect-error - Cards requires name.
-//new Cards({});
+// @ts-expect-error - Cards requires name.
+new Cards({});
 
 const cards = new Cards({ name: "Just a deck of cards", type: "german" });
 expectTypeOf(cards).toEqualTypeOf<Cards>();
diff --git a/tests/foundry/client/data/documents/chat-message.test-d.ts b/tests/foundry/client/data/documents/chat-message.test-d.ts
index 515994fb4..7f7edb7c7 100644
--- a/tests/foundry/client/data/documents/chat-message.test-d.ts
+++ b/tests/foundry/client/data/documents/chat-message.test-d.ts
@@ -73,6 +73,6 @@ expectTypeOf(chat.applyRollMode("custom-roll-mode")).toEqualTypeOf<void>();
 // @ts-expect-error - "unknown-roll-mode" is not a valid roll mode
 chat.applyRollMode("unknown-roll-mode");
 
-expectTypeOf(chat.getRollData()).toEqualTypeOf<object>();
+expectTypeOf(chat.getRollData()).toEqualTypeOf<Record<string, unknown>>();
 expectTypeOf(chat.getHTML()).toEqualTypeOf<Promise<JQuery>>();
 expectTypeOf(chat.export()).toEqualTypeOf<string>();
diff --git a/tests/foundry/client/data/documents/combat.test-d.ts b/tests/foundry/client/data/documents/combat.test-d.ts
new file mode 100644
index 000000000..ecb2b8939
--- /dev/null
+++ b/tests/foundry/client/data/documents/combat.test-d.ts
@@ -0,0 +1,38 @@
+import { expectTypeOf } from "vitest";
+
+const combat = new Combat();
+
+// properties
+expectTypeOf(combat.turns).toEqualTypeOf<Combatant[]>();
+expectTypeOf(combat.current).toEqualTypeOf<CombatHistoryData>();
+expectTypeOf(combat.previous).toEqualTypeOf<CombatHistoryData>();
+
+expectTypeOf(Combat.CONFIG_SETTING).toEqualTypeOf<"combatTrackerConfig">();
+
+expectTypeOf(combat.combatant).toEqualTypeOf<Combat["turns"][number] | undefined>();
+expectTypeOf(combat.started).toEqualTypeOf<boolean>();
+expectTypeOf(combat.visible).toEqualTypeOf<true>();
+expectTypeOf(combat.isActive).toEqualTypeOf<boolean>();
+
+expectTypeOf(combat.activate()).toEqualTypeOf<Promise<Combat[]>>();
+expectTypeOf(combat.prepareDerivedData()).toEqualTypeOf<void>();
+
+expectTypeOf(combat.getCombatantByActor("")).toEqualTypeOf<Combatant | undefined>();
+
+expectTypeOf(combat.startCombat()).toEqualTypeOf<Promise<Combat>>();
+expectTypeOf(combat.nextRound()).toEqualTypeOf<Promise<Combat | undefined>>();
+expectTypeOf(combat.previousRound()).toEqualTypeOf<Promise<Combat | undefined>>();
+expectTypeOf(combat.nextTurn()).toEqualTypeOf<Promise<Combat | undefined>>();
+expectTypeOf(combat.previousTurn()).toEqualTypeOf<Promise<Combat | undefined>>();
+expectTypeOf(combat.endCombat()).toEqualTypeOf<Promise<Combat | undefined>>();
+
+expectTypeOf(combat.toggleSceneLink()).toEqualTypeOf<Promise<Combat | undefined>>();
+expectTypeOf(combat.resetAll()).toEqualTypeOf<Promise<Combat | undefined>>();
+
+expectTypeOf(combat.rollInitiative("")).toEqualTypeOf<Promise<Combat>>();
+expectTypeOf(combat.rollAll()).toEqualTypeOf<Promise<Combat>>();
+expectTypeOf(combat.rollNPC()).toEqualTypeOf<Promise<Combat>>();
+expectTypeOf(combat.setInitiative("", 1)).toEqualTypeOf<Promise<void>>();
+expectTypeOf(combat.setupTurns()).toEqualTypeOf<Combat["turns"]>();
+expectTypeOf(combat.debounceSetup()).toEqualTypeOf<ReturnType<typeof foundry.utils.debounce>>();
+expectTypeOf(combat.updateCombatantActors()).toEqualTypeOf<void>();
diff --git a/tests/foundry/client/data/documents/combatant.test-d.ts b/tests/foundry/client/data/documents/combatant.test-d.ts
index c2cb37704..16560f8e6 100644
--- a/tests/foundry/client/data/documents/combatant.test-d.ts
+++ b/tests/foundry/client/data/documents/combatant.test-d.ts
@@ -9,12 +9,23 @@ expectTypeOf(combatant.parent).toEqualTypeOf<Combat | null>();
 expectTypeOf(combatant.combat).toEqualTypeOf<Combat | null>();
 expectTypeOf(combatant.actor).toEqualTypeOf<Actor | null>();
 expectTypeOf(combatant.token).toEqualTypeOf<TokenDocument | null>();
-expectTypeOf(combatant.apps).toEqualTypeOf<Record<string, Application>>();
+expectTypeOf(combatant.players).toEqualTypeOf<User[]>();
+expectTypeOf(combatant.isDefeated).toEqualTypeOf<boolean>();
+
+declare const user: foundry.documents.BaseUser;
+expectTypeOf(
+  combatant.testUserPermission(user, foundry.CONST.DOCUMENT_OWNERSHIP_LEVELS.INHERIT),
+).toEqualTypeOf<boolean>();
+
+expectTypeOf(combatant.getInitiativeRoll()).toEqualTypeOf<Roll>();
+expectTypeOf(combatant.rollInitiative("")).toEqualTypeOf<Promise<Combatant | undefined>>();
+
+expectTypeOf(combatant.prepareDerivedData()).toEqualTypeOf<void>();
 
 // static properties
 expectTypeOf(Combatant.create({ name: "Some Combatant" })).toEqualTypeOf<
   Promise<StoredDocument<Combatant> | undefined>
 >();
-expectTypeOf(Combatant.createDocuments([])).toEqualTypeOf<Promise<StoredDocument<Combatant>[]>>();
+expectTypeOf(Combatant.createDocuments([])).toEqualTypeOf<Promise<StoredDocument<Combatant>[] | undefined>>();
 expectTypeOf(Combatant.updateDocuments([])).toEqualTypeOf<Promise<Combatant[]>>();
 expectTypeOf(Combatant.deleteDocuments([])).toEqualTypeOf<Promise<Combatant[]>>();
diff --git a/tests/foundry/client/data/documents/item.test-d.ts b/tests/foundry/client/data/documents/item.test-d.ts
index c8c71ad0f..eb019f1c1 100644
--- a/tests/foundry/client/data/documents/item.test-d.ts
+++ b/tests/foundry/client/data/documents/item.test-d.ts
@@ -25,17 +25,17 @@ declare global {
   }
 }
 
-const item = await Item.create({ name: "Mighty Axe of Killing", type: "weapon" });
-if (item) {
-  expectTypeOf(item.actor).toEqualTypeOf<Actor | null>();
-  expectTypeOf(item.img).toEqualTypeOf<string | null | undefined>();
-  expectTypeOf(item.isOwned).toEqualTypeOf<boolean>();
-  expectTypeOf(item.transferredEffects).toEqualTypeOf<ActiveEffect[]>();
-  expectTypeOf(item.type).toEqualTypeOf<"weapon" | "armor" | "base">();
-  expectTypeOf(item.getRollData()).toEqualTypeOf<AnyObject>();
-  expectTypeOf(item.system).toEqualTypeOf<WeaponData | ArmorData | AnyObject>();
-
-  if (item.system instanceof WeaponData) {
-    expectTypeOf(item.system.attack).toEqualTypeOf<number | null | undefined>();
-  }
-}
+// @ts-expect-error - Item requires name.
+new Item();
+
+// @ts-expect-error - Item requires name.
+new Item({});
+
+const item = new Item({ name: "Mighty Axe of Killing", type: "weapon" });
+
+expectTypeOf(item.actor).toEqualTypeOf<Actor | null>();
+expectTypeOf(item.img).toEqualTypeOf<string | null | undefined>();
+expectTypeOf(item.isOwned).toEqualTypeOf<boolean>();
+expectTypeOf(item.transferredEffects).toEqualTypeOf<ActiveEffect[]>();
+expectTypeOf(item.type).toEqualTypeOf<"weapon" | "armor" | "base">();
+expectTypeOf(item.getRollData()).toEqualTypeOf<object>();
diff --git a/tests/foundry/client/data/documents/macro.test-d.ts b/tests/foundry/client/data/documents/macro.test-d.ts
index e206a814f..9c0251c16 100644
--- a/tests/foundry/client/data/documents/macro.test-d.ts
+++ b/tests/foundry/client/data/documents/macro.test-d.ts
@@ -1,6 +1,11 @@
 import { expectTypeOf } from "vitest";
 import type { StoredDocument } from "../../../../../src/types/utils.d.mts";
 
+// @ts-expect-error data is required
+new Macro();
+// @ts-expect-error name is required
+new Macro({});
+
 const myMacro = new Macro({ name: "my macro", scope: "global", type: "script" });
 
 // properties and functions added by the concrete `Macro` class
@@ -8,6 +13,8 @@ expectTypeOf(myMacro.execute()).toEqualTypeOf<void | Promise<unknown>>();
 if (myMacro.type === "script") {
   expectTypeOf(myMacro.type).toEqualTypeOf<"script">();
   expectTypeOf(myMacro.isAuthor).toEqualTypeOf<boolean>();
+  expectTypeOf(myMacro.canExecute).toEqualTypeOf<boolean>();
+  expectTypeOf(myMacro.thumbnail).toEqualTypeOf<string | null>();
   expectTypeOf(await myMacro.execute({ effect: new ActiveEffect() })).toEqualTypeOf<unknown>();
   expectTypeOf(
     await myMacro.execute({ effect: new ActiveEffect(), actor: new Actor({ name: "foo", type: "base" }) }),
@@ -27,7 +34,7 @@ if (myMacro.type === "chat") {
 }
 
 // properties and functions of `ClientDocumentMixin`
-expectTypeOf(myMacro.apps).toEqualTypeOf<Record<string, Application>>();
+expectTypeOf(myMacro.apps).toEqualTypeOf<Record<string, Application | foundry.applications.api.ApplicationV2>>();
 expectTypeOf(myMacro.collection).toEqualTypeOf<Collection<Macro>>();
 expectTypeOf(myMacro.folder).toEqualTypeOf<Folder | null>();
 expectTypeOf(myMacro.isOwner).toEqualTypeOf<boolean>();
@@ -41,6 +48,6 @@ expectTypeOf(myMacro.pack).toEqualTypeOf<string | null>();
 
 // static properties of `Document`
 expectTypeOf(Macro.create({ name: "Some Macro" })).toEqualTypeOf<Promise<StoredDocument<Macro> | undefined>>();
-expectTypeOf(Macro.createDocuments([])).toEqualTypeOf<Promise<StoredDocument<Macro>[]>>();
+expectTypeOf(Macro.createDocuments([])).toEqualTypeOf<Promise<StoredDocument<Macro>[] | undefined>>();
 expectTypeOf(Macro.updateDocuments([])).toEqualTypeOf<Promise<Macro[]>>();
 expectTypeOf(Macro.deleteDocuments([])).toEqualTypeOf<Promise<Macro[]>>();
diff --git a/tests/foundry/client/data/documents/note.test-d.ts b/tests/foundry/client/data/documents/note.test-d.ts
index 6451cc666..10df83af6 100644
--- a/tests/foundry/client/data/documents/note.test-d.ts
+++ b/tests/foundry/client/data/documents/note.test-d.ts
@@ -2,5 +2,6 @@ import { expectTypeOf } from "vitest";
 
 const doc = new NoteDocument();
 
+expectTypeOf(doc.page).toEqualTypeOf<JournalEntryPage | undefined>();
 expectTypeOf(doc.label).toEqualTypeOf<string>();
 expectTypeOf(doc.entry).toEqualTypeOf<JournalEntry | undefined>();
diff --git a/tests/foundry/client/data/documents/playlist-sound.test-d.ts b/tests/foundry/client/data/documents/playlist-sound.test-d.ts
new file mode 100644
index 000000000..dbc5ce580
--- /dev/null
+++ b/tests/foundry/client/data/documents/playlist-sound.test-d.ts
@@ -0,0 +1,19 @@
+import { expectTypeOf } from "vitest";
+
+// @ts-expect-error - requires name.
+new PlaylistSound();
+
+// @ts-expect-error - requires name.
+new PlaylistSound({});
+
+const sound = new PlaylistSound({ name: "my sound" });
+
+expectTypeOf(sound.sound).toEqualTypeOf<Sound | null>();
+expectTypeOf(sound.debounceVolume).toEqualTypeOf<(volume: number) => void>();
+expectTypeOf(sound.fadeDuration).toEqualTypeOf<number>();
+expectTypeOf(sound.context).toEqualTypeOf<AudioContext | undefined>();
+expectTypeOf(sound.sync()).toEqualTypeOf<void | Promise<void> | Promise<Sound>>();
+expectTypeOf(sound.load()).toEqualTypeOf<Promise<void>>();
+expectTypeOf(sound.toAnchor()).toEqualTypeOf<HTMLAnchorElement>();
+
+expectTypeOf(PlaylistSound.VOLUME_DEBOUNCE_MS).toEqualTypeOf<number>();
diff --git a/tests/foundry/client/data/documents/setting.test-d.ts b/tests/foundry/client/data/documents/setting.test-d.ts
index ab12264de..8dd529e57 100644
--- a/tests/foundry/client/data/documents/setting.test-d.ts
+++ b/tests/foundry/client/data/documents/setting.test-d.ts
@@ -1,10 +1,18 @@
 import { expectTypeOf } from "vitest";
 import type { StoredDocument } from "../../../../../src/types/utils.d.mts";
 
+// @ts-expect-error - requires key
+new Setting();
+
+// @ts-expect-error - requires key
+new Setting({});
+
 const setting = new Setting({ key: "foo.bar", value: "bar" });
 
+expectTypeOf(setting.config).toEqualTypeOf<SettingsConfig | undefined>();
+
 expectTypeOf(setting.key).toEqualTypeOf<string>();
-expectTypeOf(setting.value).toEqualTypeOf<unknown>();
+// expectTypeOf(setting.value).toEqualTypeOf<unknown>();
 expectTypeOf(Setting.create({ key: "foo.bar", value: "bar" })).toEqualTypeOf<
   Promise<StoredDocument<Setting> | undefined>
 >();
diff --git a/tests/foundry/client/data/documents/table-result.test-d.ts b/tests/foundry/client/data/documents/table-result.test-d.ts
new file mode 100644
index 000000000..38fca8065
--- /dev/null
+++ b/tests/foundry/client/data/documents/table-result.test-d.ts
@@ -0,0 +1,12 @@
+import { expectTypeOf } from "vitest";
+
+// @ts-expect-error - requires a range.
+new TableResult();
+
+// @ts-expect-error - requires a range.
+new TableResult({});
+
+const result = new TableResult({ range: [2, 5] });
+
+expectTypeOf(result.icon).toEqualTypeOf<string>();
+expectTypeOf(result.getChatText()).toEqualTypeOf<string>();
diff --git a/tests/foundry/client/data/documents/tile.test-d.ts b/tests/foundry/client/data/documents/tile.test-d.ts
index 03af23a4f..997bcd3d1 100644
--- a/tests/foundry/client/data/documents/tile.test-d.ts
+++ b/tests/foundry/client/data/documents/tile.test-d.ts
@@ -1,5 +1,11 @@
 import { expectTypeOf } from "vitest";
 
-const doc = new TileDocument({ width: 400, height: 400 });
-expectTypeOf(doc.object).toEqualTypeOf<Tile.ConfiguredInstance | null>();
-expectTypeOf(doc.layer).toEqualTypeOf<TilesLayer>();
+// @ts-expect-error - requires width and height
+new TileDocument();
+
+// @ts-expect-error - requires width and height
+new TileDocument({});
+
+const tile = new TileDocument({ width: 400, height: 400 });
+expectTypeOf(tile).toEqualTypeOf<TileDocument>();
+expectTypeOf(tile.prepareDerivedData()).toEqualTypeOf<void>();
diff --git a/tests/foundry/client/data/documents/token.test-d.ts b/tests/foundry/client/data/documents/token.test-d.ts
index b24ab36e1..8db2a906f 100644
--- a/tests/foundry/client/data/documents/token.test-d.ts
+++ b/tests/foundry/client/data/documents/token.test-d.ts
@@ -9,9 +9,6 @@ expectTypeOf(doc.inCombat).toEqualTypeOf<boolean>();
 expectTypeOf(doc.clone()).toEqualTypeOf<TokenDocument>();
 expectTypeOf(doc.clone({}, { save: true })).toEqualTypeOf<Promise<TokenDocument>>();
 expectTypeOf(doc.actor).toEqualTypeOf<Actor.ConfiguredInstance | null>();
-expectTypeOf(doc.modifyActorDocument({ actorLink: true, "lightAnimation.speed": 5 }, {})).toEqualTypeOf<
-  Promise<[Actor.ConfiguredInstance | null]>
->();
 
 // Can't get more specific due to delta concerns
 expectTypeOf(doc.getEmbeddedCollection("Item")).toEqualTypeOf<foundry.utils.Collection<Item.ConfiguredInstance>>();
diff --git a/tests/foundry/client/data/documents/user.test-d.ts b/tests/foundry/client/data/documents/user.test-d.ts
index 33ef0b88c..39973ab12 100644
--- a/tests/foundry/client/data/documents/user.test-d.ts
+++ b/tests/foundry/client/data/documents/user.test-d.ts
@@ -1,6 +1,12 @@
 import { assertType, expectTypeOf } from "vitest";
 import type { ConfiguredDocumentClass } from "../../../../../src/types/helperTypes.d.mts";
 
+// @ts-expect-error - requires a name.
+new User();
+
+// @ts-expect-error - requires a name.
+new User({});
+
 const user = new User({ name: "Test" });
 
 expectTypeOf(user.active).toEqualTypeOf<boolean>();
diff --git a/tests/foundry/client/data/documents/wall.test-d.ts b/tests/foundry/client/data/documents/wall.test-d.ts
index 4ff45721c..16d391ebb 100644
--- a/tests/foundry/client/data/documents/wall.test-d.ts
+++ b/tests/foundry/client/data/documents/wall.test-d.ts
@@ -1,9 +1,9 @@
 const scene = new Scene({ name: "foobar" });
 
-// @ts-expect-error Creation technically works but fails validation
+// @ts-expect-error requires 'c'
 new WallDocument();
 
-// @ts-expect-error Creation technically works but fails validation
+// @ts-expect-error requires 'c'
 new WallDocument({});
 
 new WallDocument({ c: [0, 0, 0, 0] });
diff --git a/tests/foundry/client/ui/context.test-d.ts b/tests/foundry/client/ui/context.test-d.ts
index 0d5e91d6b..f77b74447 100644
--- a/tests/foundry/client/ui/context.test-d.ts
+++ b/tests/foundry/client/ui/context.test-d.ts
@@ -16,7 +16,17 @@ const contextMenu = new ContextMenu(element, ".some-class", [
     },
   },
 ]);
+expectTypeOf(contextMenu.element).toEqualTypeOf<JQuery>();
+expectTypeOf(contextMenu.selector).toEqualTypeOf<string>();
+expectTypeOf(contextMenu.eventName).toEqualTypeOf<string>();
+expectTypeOf(contextMenu.menuItems).toEqualTypeOf<ContextMenuEntry[]>();
+expectTypeOf(contextMenu.onOpen).toEqualTypeOf<ContextMenu.ContextMenuCallback>();
+expectTypeOf(contextMenu.onClose).toEqualTypeOf<ContextMenu.ContextMenuCallback>();
+expectTypeOf(contextMenu.menu).toEqualTypeOf<JQuery>();
 
+declare const app: foundry.applications.api.ApplicationV2;
+expectTypeOf(ContextMenu.create(app, new HTMLElement(), ".class", [])).toEqualTypeOf<ContextMenu>();
 expectTypeOf(contextMenu.bind()).toEqualTypeOf<void>();
-expectTypeOf(contextMenu.render(element)).toEqualTypeOf<void | Promise<void>>();
+expectTypeOf(contextMenu.close()).toEqualTypeOf<Promise<void>>();
+expectTypeOf(contextMenu.render(element)).toEqualTypeOf<void | Promise<JQuery | void>>();
 expectTypeOf(contextMenu.menuItems).toEqualTypeOf<ContextMenuEntry[]>();
diff --git a/tests/foundry/client/ui/filepicker.test-d.ts b/tests/foundry/client/ui/filepicker.test-d.ts
new file mode 100644
index 000000000..9e5deaf34
--- /dev/null
+++ b/tests/foundry/client/ui/filepicker.test-d.ts
@@ -0,0 +1,54 @@
+import { expectTypeOf } from "vitest";
+import type { MaybePromise } from "../../../../src/types/utils.d.mts";
+
+const filepicker = new FilePicker();
+expectTypeOf(filepicker).toEqualTypeOf<FilePicker>();
+
+expectTypeOf(filepicker.request).toEqualTypeOf<string | undefined>();
+expectTypeOf(filepicker.sources).toEqualTypeOf<FilePicker.Sources>();
+expectTypeOf(filepicker.activeSource).toEqualTypeOf<FilePicker.SourceType>();
+
+expectTypeOf(filepicker.callback).toEqualTypeOf<FilePicker.Callback | undefined>();
+expectTypeOf(filepicker.results).toEqualTypeOf<{}>();
+expectTypeOf(filepicker.type).toEqualTypeOf<FilePicker.Type>();
+expectTypeOf(filepicker.field).toEqualTypeOf<HTMLElement | undefined>();
+expectTypeOf(filepicker.button).toEqualTypeOf<HTMLElement | undefined>();
+expectTypeOf(filepicker.displayMode).toEqualTypeOf<FilePicker.DisplayMode>();
+expectTypeOf(filepicker.extensions).toEqualTypeOf<string[] | undefined>();
+
+expectTypeOf(FilePicker.FILE_TYPES).toEqualTypeOf<string[]>();
+expectTypeOf(FilePicker.LAST_BROWSED_DIRECTORY).toEqualTypeOf<string>();
+expectTypeOf(FilePicker.LAST_TILE_SIZE).toEqualTypeOf<number | null>();
+expectTypeOf(FilePicker.LAST_DISPLAY_MODE).toEqualTypeOf<FilePicker.DisplayMode>();
+
+expectTypeOf(FilePicker.DISPLAY_MODES).toEqualTypeOf<["list", "thumbs", "tiles", "images"]>();
+expectTypeOf(FilePicker.S3_BUCKETS).toEqualTypeOf<string[] | null>();
+expectTypeOf(FilePicker.favorites).toEqualTypeOf<Record<string, FilePicker.FavoriteFolder>>();
+expectTypeOf(FilePicker.setFavorite("", "")).toEqualTypeOf<Promise<void>>();
+expectTypeOf(FilePicker.setFavorite("", "")).toEqualTypeOf<Promise<void>>();
+expectTypeOf(FilePicker.defaultOptions).toEqualTypeOf<FilePickerOptions>();
+expectTypeOf(FilePicker.matchS3URL("")).toEqualTypeOf<RegExpMatchArray | null>();
+
+expectTypeOf(filepicker.title).toEqualTypeOf<string>();
+expectTypeOf(filepicker.source).toEqualTypeOf<FilePicker.Source>();
+expectTypeOf(filepicker.target).toEqualTypeOf<string>();
+expectTypeOf(filepicker.canUpload).toEqualTypeOf<boolean>();
+expectTypeOf(filepicker.getData()).toEqualTypeOf<MaybePromise<object>>();
+expectTypeOf(filepicker.setPosition()).toEqualTypeOf<void | (Application.Position & { height: number })>();
+expectTypeOf(filepicker.browse("")).toEqualTypeOf<Promise<FilePicker.BrowseResult>>();
+
+expectTypeOf(FilePicker.browse("data", "")).toEqualTypeOf<Promise<FilePicker.BrowseResult>>();
+expectTypeOf(FilePicker.configurePath("data", "")).toEqualTypeOf<Promise<FilePicker.ConfigurePathResult>>();
+expectTypeOf(FilePicker.createDirectory("data", "")).toEqualTypeOf<Promise<string>>();
+
+const file = new File([], "testfile");
+expectTypeOf(FilePicker.upload("data", "", file)).toEqualTypeOf<Promise<FilePicker.UploadResult | false | void | {}>>();
+
+expectTypeOf(FilePicker.uploadPersistent("", "", file)).toEqualTypeOf<
+  Promise<FilePicker.UploadResult | false | void | {}>
+>();
+
+expectTypeOf(filepicker.render()).toEqualTypeOf<FilePicker>();
+expectTypeOf(filepicker.activateListeners(jQuery("document"))).toEqualTypeOf<void>();
+
+expectTypeOf(FilePicker.fromButton(new HTMLButtonElement())).toEqualTypeOf<FilePicker>();
diff --git a/tests/foundry/common/abstract/document.mjs.test-d.ts b/tests/foundry/common/abstract/document.mjs.test-d.ts
index 8388d9b53..4b7dedc88 100644
--- a/tests/foundry/common/abstract/document.mjs.test-d.ts
+++ b/tests/foundry/common/abstract/document.mjs.test-d.ts
@@ -1,7 +1,21 @@
 import { expectTypeOf } from "vitest";
 import type { StoredDocument } from "../../../../src/types/utils.d.mts";
 import type BaseActiveEffect from "../../../../src/foundry/common/documents/active-effect.d.mts";
-import type { ConfiguredDocumentClass } from "../../../../src/types/helperTypes.d.mts";
+import type { ConfiguredDocumentClass, DatabaseOperationsFor } from "../../../../src/types/helperTypes.d.mts";
+
+import type {
+  DocumentOnCreateOptions,
+  DocumentOnDeleteOptions,
+  DocumentOnUpdateOptions,
+  DocumentPreCreateOptions,
+  DocumentPreDeleteOptions,
+  DocumentPreUpdateOptions,
+} from "../../../../src/foundry/common/abstract/document.d.mts";
+import type {
+  DatabaseCreateOperation,
+  DatabaseDeleteOperation,
+  DatabaseUpdateOperation,
+} from "../../../../src/foundry/common/abstract/_types.d.mts";
 
 declare const configuredActiveEffect: InstanceType<
   foundry.abstract.Document.ConfiguredClass<typeof foundry.documents.BaseActiveEffect>
@@ -26,26 +40,24 @@ if (item) {
   >();
 }
 
-declare const bool: boolean;
-
-expectTypeOf(foundry.documents.BaseMacro.create({ name: "" }, { temporary: bool })).toEqualTypeOf<
-  Promise<Macro | undefined>
->();
-expectTypeOf(foundry.documents.BaseMacro.create({ name: "" }, { temporary: true })).toEqualTypeOf<
-  Promise<Macro | undefined>
->();
 expectTypeOf(foundry.documents.BaseMacro.create({ name: "" })).toEqualTypeOf<
   Promise<StoredDocument<Macro> | undefined>
 >();
 expectTypeOf(foundry.documents.BaseMacro.create({ name: "" }, { temporary: false })).toEqualTypeOf<
   Promise<StoredDocument<Macro> | undefined>
 >();
+expectTypeOf(foundry.documents.BaseMacro.create({ name: "" }, { temporary: true })).toEqualTypeOf<
+  Promise<Macro | undefined>
+>();
 
-expectTypeOf(foundry.documents.BaseMacro.createDocuments([], { temporary: bool })).toEqualTypeOf<Promise<Macro[]>>();
-expectTypeOf(foundry.documents.BaseMacro.createDocuments([], { temporary: true })).toEqualTypeOf<Promise<Macro[]>>();
-expectTypeOf(foundry.documents.BaseMacro.createDocuments([])).toEqualTypeOf<Promise<StoredDocument<Macro>[]>>();
+expectTypeOf(foundry.documents.BaseMacro.createDocuments([], { temporary: true })).toEqualTypeOf<
+  Promise<Macro[] | undefined>
+>();
+expectTypeOf(foundry.documents.BaseMacro.createDocuments([])).toEqualTypeOf<
+  Promise<StoredDocument<Macro>[] | undefined>
+>();
 expectTypeOf(foundry.documents.BaseMacro.createDocuments([], { temporary: false })).toEqualTypeOf<
-  Promise<StoredDocument<Macro>[]>
+  Promise<StoredDocument<Macro>[] | undefined>
 >();
 
 expectTypeOf(foundry.documents.BaseMacro.updateDocuments([])).toEqualTypeOf<Promise<Macro[]>>();
@@ -59,24 +71,21 @@ if (user) {
 }
 
 // test creation of embedded documents
-declare const actor: Actor;
-expectTypeOf(actor.createEmbeddedDocuments("ActiveEffect", [], { temporary: true })).toEqualTypeOf<
-  Promise<ActiveEffect[]>
+declare const scene: Scene;
+expectTypeOf(scene.createEmbeddedDocuments("Note", [], { temporary: true })).toEqualTypeOf<
+  Promise<NoteDocument[] | undefined>
 >();
-expectTypeOf(actor.createEmbeddedDocuments("ActiveEffect", [], { temporary: bool })).toEqualTypeOf<
-  Promise<ActiveEffect[] | StoredDocument<ActiveEffect>[]>
+expectTypeOf(scene.createEmbeddedDocuments("Note", [], { temporary: false })).toEqualTypeOf<
+  Promise<StoredDocument<NoteDocument>[] | undefined>
 >();
-expectTypeOf(actor.createEmbeddedDocuments("ActiveEffect", [], { temporary: false })).toEqualTypeOf<
-  Promise<StoredDocument<ActiveEffect>[]>
->();
-expectTypeOf(actor.createEmbeddedDocuments("ActiveEffect", [])).toEqualTypeOf<
-  Promise<StoredDocument<ActiveEffect>[]>
+expectTypeOf(scene.createEmbeddedDocuments("Note", [])).toEqualTypeOf<
+  Promise<StoredDocument<NoteDocument>[] | undefined>
 >();
 
 // verify that document lifecycle methods work with source data is possible
 
 if (item) {
-  expectTypeOf(Item.createDocuments([item.toObject()])).toEqualTypeOf<Promise<StoredDocument<Item>[]>>();
+  expectTypeOf(Item.createDocuments([item.toObject()])).toEqualTypeOf<Promise<StoredDocument<Item>[] | undefined>>();
   expectTypeOf(Item.create(item.toObject())).toEqualTypeOf<Promise<StoredDocument<Item> | undefined>>();
   expectTypeOf(Item.updateDocuments([item.toObject()])).toEqualTypeOf<Promise<Item[]>>();
   expectTypeOf(item.update(item.toObject())).toEqualTypeOf<Promise<StoredDocument<Item> | undefined>>();
@@ -97,6 +106,43 @@ declare global {
   }
 }
 
+// test the database operations
+declare const dbo: ActiveEffect.DatabaseOperations;
+expectTypeOf(dbo.create).toEqualTypeOf<DatabaseCreateOperation<ActiveEffect> & { animate?: boolean | undefined }>();
+expectTypeOf(dbo.create).toEqualTypeOf<DatabaseOperationsFor<"ActiveEffect", "create">>();
+expectTypeOf(dbo.update).toEqualTypeOf<DatabaseUpdateOperation<ActiveEffect> & { animate?: boolean | undefined }>();
+expectTypeOf(dbo.update).toEqualTypeOf<DatabaseOperationsFor<"ActiveEffect", "update">>();
+expectTypeOf(dbo.delete).toEqualTypeOf<DatabaseDeleteOperation & { animate?: boolean | undefined }>();
+expectTypeOf(dbo.delete).toEqualTypeOf<DatabaseOperationsFor<"ActiveEffect", "delete">>();
+
+// test the options
+declare const pco: DocumentPreCreateOptions<"ActiveEffect">;
+expectTypeOf(pco).toEqualTypeOf<
+  Omit<DatabaseOperationsFor<"ActiveEffect", "create">, "data" | "noHook" | "pack" | "parent">
+>();
+declare const oco: DocumentOnCreateOptions<"ActiveEffect">;
+expectTypeOf(oco).toEqualTypeOf<
+  Omit<DatabaseOperationsFor<"ActiveEffect", "create">, "pack" | "parentUuid" | "syntheticActorUpdate">
+>();
+
+declare const puo: DocumentPreUpdateOptions<"ActiveEffect">;
+expectTypeOf(puo).toEqualTypeOf<
+  Omit<DatabaseOperationsFor<"ActiveEffect", "update">, "updates" | "restoreDelta" | "noHook" | "parent" | "pack">
+>();
+declare const ouo: DocumentOnUpdateOptions<"ActiveEffect">;
+expectTypeOf(ouo).toEqualTypeOf<
+  Omit<DatabaseOperationsFor<"ActiveEffect", "update">, "pack" | "parentUuid" | "syntheticActorUpdate">
+>();
+
+declare const pdo: DocumentPreDeleteOptions<"ActiveEffect">;
+expectTypeOf(pdo).toEqualTypeOf<
+  Omit<DatabaseOperationsFor<"ActiveEffect", "delete">, "ids" | "deleteAll" | "noHook" | "pack" | "parent">
+>();
+declare const odo: DocumentOnDeleteOptions<"ActiveEffect">;
+expectTypeOf(odo).toEqualTypeOf<
+  Omit<DatabaseOperationsFor<"ActiveEffect", "delete">, "deleteAll" | "pack" | "parentUuid" | "syntheticActorUpdate">
+>();
+
 // const combatant = new Combatant({}, {});
 // expectTypeOf(combatant.flags["my-system"]).toEqualTypeOf<{ value: boolean; value2: number }>();
 // expectTypeOf(combatant.flags["my-optional-system"]).toEqualTypeOf<{ value: boolean } | undefined>();
diff --git a/tests/foundry/common/abstract/type-data.mjs.test-d.ts b/tests/foundry/common/abstract/type-data.mjs.test-d.ts
index e4d7b84dd..368715e51 100644
--- a/tests/foundry/common/abstract/type-data.mjs.test-d.ts
+++ b/tests/foundry/common/abstract/type-data.mjs.test-d.ts
@@ -2,7 +2,6 @@ import { expectTypeOf } from "vitest";
 import type { fields } from "../../../../src/foundry/common/data/module.d.mts";
 import type BaseJournalEntryPage from "../../../../src/foundry/common/documents/journal-entry-page.d.mts";
 import type { TypeDataModel } from "../../../../src/foundry/common/abstract/type-data.d.mts";
-import type { DocumentModificationOptions } from "../../../../src/foundry/common/abstract/document.d.mts";
 import type BaseUser from "../../../../src/foundry/common/documents/user.d.mts";
 import type { DeepPartial } from "../../../../src/types/utils.d.mts";
 
@@ -76,23 +75,23 @@ class QuestModel extends foundry.abstract.TypeDataModel<
 
   protected async _preCreate(
     data: TypeDataModel.ParentAssignmentType<this>,
-    options: DocumentModificationOptions,
+    options: TypeDataModel.TypeDataModelModificationOptions,
     user: BaseUser,
   ): Promise<boolean | void> {
     expectTypeOf(data.system.steps).toEqualTypeOf<string[]>();
 
-    expectTypeOf(options).toEqualTypeOf<DocumentModificationOptions>();
+    expectTypeOf(options).toEqualTypeOf<TypeDataModel.TypeDataModelModificationOptions>();
     expectTypeOf(user).toEqualTypeOf<BaseUser>();
   }
 
   protected async _preUpdate(
     data: DeepPartial<TypeDataModel.ParentAssignmentType<this>>,
-    options: DocumentModificationOptions,
+    options: TypeDataModel.TypeDataModelModificationOptions,
     userId: string,
   ): Promise<boolean | void> {
     expectTypeOf(data.system?.steps).toEqualTypeOf<string[] | undefined>();
 
-    expectTypeOf(options).toEqualTypeOf<DocumentModificationOptions>();
+    expectTypeOf(options).toEqualTypeOf<TypeDataModel.TypeDataModelModificationOptions>();
     expectTypeOf(userId).toEqualTypeOf<string>();
   }
 }