Document Loader 2.0.0 - Release Notes

Release date: 2026-03-19
Branch: 2.0.x

NEW FEATURES

Hook Refactoring & Backward Compatibility (#3579852, #3578534)
https://www.drupal.org/node/3579852
https://www.drupal.org/node/3578534
- Moved hook implementations from .module into a dedicated DocumentLoaderHooks class (src/Hook/)
- Added #[LegacyHook] attribute for backward compatibility with Drupal 10 hook dispatch
- Cleaned up document_loader.module and settings form; removed legacy inline hook code
- Updated document_loader.services.yml to register the hooks class as a service

Field Widget Action Support (#3577606)
https://www.drupal.org/node/3577606
- Added document_loader_fwa submodule integrating with the Field Widget Actions module
- Enables field-level document loading directly from entity edit forms

Tool API Integration (#3573322)
https://www.drupal.org/node/3573322
- Added document_loader_tool submodule for AI tool integration (requires drupal/tool)
- DocumentLoaderToolDeriver automatically derives one AI tool per source category - no manual registration needed
- Added cloud/SaaS source types: S3, GitHub, Slack, Notion, SharePoint, OneDrive

Drush Commands (#3575375)
https://www.drupal.org/node/3575375
- document-loader:list - lists all registered loaders with filters for type, input, and output format
- document-loader:inputs <type_id> - displays the full input schema for any registered type
- document-loader:load - loads a document from the CLI by passing key=value input pairs

New Input Types
- File-based: PDF, Word, spreadsheet, image, text, markdown, presentations
- URL-based: API endpoints (REST/HTTP), website scraping
- Cloud/SaaS: Amazon S3, GitHub, Slack, Notion, SharePoint, OneDrive

Document Loader Explorer
- Added admin UI for interactively testing loaders across different input types and output formats


ARCHITECTURE

Two-Layer Plugin System (#3574454)
https://www.drupal.org/node/3574454
- DocumentLoaderType plugins (Layer 1) map source categories to Input classes via the #[DocumentLoaderType] attribute
- DocumentLoader plugins (Layer 2) implement load() and declare supported types and output formats
- DocumentLoaderTypeFactory service constructs Input/Output objects dynamically - no hardcoded class lists

Manager Service (#3574446)
https://www.drupal.org/node/3574446
- DocumentLoaderManager registered as a proper service with full dependency injection
- loadFromInput() and loadFromData() enforce the full validate -> access check -> load -> truncate pipeline
- DocumentLoaderResult value object carries content, format, loaderLabel, originalBytes, metadata, source

Interface Enhancements
- UrlInputInterface added for all URL-based inputs (#3575329) https://www.drupal.org/node/3575329
- isAvailable() support on Input classes (#3574450) https://www.drupal.org/node/3574450
- Inputs and outputs are fully extendable by contributed/custom modules


BUG FIXES

- Fixed user permission configuration and access checks (#3576008) https://www.drupal.org/node/3576008
- Fixed getSupportedOutputTypes() implementation (#3574448) https://www.drupal.org/node/3574448
- Fixed missing DocumentLoaderTypePluginManager functionality (#3574544) https://www.drupal.org/node/3574544
- Cleaned up exception message usage and removed unwanted markup from metadata (#3576615) https://www.drupal.org/node/3576615
- Removed problematic output format handling (#3575650) https://www.drupal.org/node/3575650


CODE QUALITY

- Zero PHPStan errors (level 3, bleedingEdge config)
- Full PHPCS compliance (Drupal + DrupalPractice rulesets)
- Comprehensive unit and kernel tests for Tool API and core functionality
- Fixed CI/CD pipeline (#3577188) https://www.drupal.org/node/3577188


DOCUMENTATION

- Added AGENTS.md - comprehensive guide for coding assistants and contributors
- Updated README.md to Drupal.org project template
- Added annotated usage examples in /examples