diff --git a/bee.fetched.test/build.gradle.kts b/bee.fetched.test/build.gradle.kts
index 762a9a5..b035832 100644
--- a/bee.fetched.test/build.gradle.kts
+++ b/bee.fetched.test/build.gradle.kts
@@ -71,8 +71,7 @@ dependencies {
implementation("com.beeproduced:data") {
capabilities { requireCapability("com.beeproduced:data-dgs") }
}
- implementation("com.beeproduced:bee.fetched")
- bee("com.beeproduced:bee.fetched")
+ beeGenerative("com.beeproduced:bee.fetched")
// external dependencies
implementation(libs.kotlin.stdlib)
implementation(libs.spring.boot.starter.web)
diff --git a/bee.fetched/README.md b/bee.fetched/README.md
new file mode 100644
index 0000000..2fe02ce
--- /dev/null
+++ b/bee.fetched/README.md
@@ -0,0 +1,376 @@
+
+
bee.fetched
+
+ Automatically generate nested data fetchers for usage with data loaders
+
+
+
+
+
+## 💡 Motivation
+
+Calling data loaders using nested data fetchers is pretty straightforward but often requires writing of nearly identical boilerplate code.
+
+Also, these types of data fetchers can be pretty easy to miss while implementing. This leads to incomplete results even if the data loader was correctly defined.
+
+This code generation library tries to solve this problem by automatically generating such nested data fetchers from DGS DTOs & data loader definitions.
+
+## 🚀 Quickstart
+
+### 🛠️ Configuration
+
+Following shows the easiest way to incorporate `bee.fetched` into a project.
+
+`build.gradle.kts`:
+
+```kotlin
+plugins {
+ id("bee.generative")
+}
+
+dependencies {
+ beeGenerative("com.beeproduced:bee.fetched")
+}
+
+// DGS codegen
+tasks.withType {
+ packageName = ""
+ subPackageNameTypes = ""
+ ...
+}
+
+// bee.fetched codegen
+// Fetched scan packege must match DGS codegen path
+// Fetched package name is where the generated nested datafetchers will be placed
+beeGenerative {
+ arg("fetchedScanPackage", ".")
+ arg("fetchedPackageName", ".fetcher")
+}
+```
+
+> 🪧 To see complete `bee.fetched` logs append `--info` to a gradle run task like `kspKotlin --rerun-tasks --info`.
+
+### ⭐ Usage
+
+Let's assume one has the following schema and wants to load the `Waldo` type via a data loader.
+
+```crystal
+extend type Query {
+ foo: Foo!
+ bar: Bar!
+ qux: Qux!
+ quux: Quux!
+ corge: Corge!
+ grault: Grault!
+ fred: Fred!
+ plugh: Plugh!
+ xyzzy: Xyzzy!
+ garply: Garply!
+}
+
+type Waldo {
+ waldo: String!
+}
+```
+
+```kotlin
+@BeeFetched(
+ mappings = [
+ FetcherMapping(Corge::class, DgsConstants.CORGE.Waldo, DgsConstants.CORGE.CorgeToWaldoId)
+ ],
+ internalTypes = [
+ FetcherInternalType(Grault::class, TestController.MyGrault::class, DgsConstants.GRAULT.Waldo),
+ FetcherInternalType(Fred::class, TestController.MyFred::class, DgsConstants.FRED.Waldo),
+ FetcherInternalType(Plugh::class, TestController.MyPlugh::class, DgsConstants.PLUGH.Waldos),
+ FetcherInternalType(Xyzzy::class, TestController.MyXyzzy::class, DgsConstants.XYZZY.Waldos),
+ ],
+ ignore = [
+ FetcherIgnore(Garply::class, DgsConstants.GARPLY.Waldo),
+ FetcherIgnore(Waldo::class)
+ ],
+ safeMode = true,
+ safeModeOverrides = []
+)
+@DgsDataLoader(name = "Waldo")
+class WaldoDataLoader : MappedBatchLoaderWithContext {
+ override fun load(
+ keys: Set,
+ environment: BatchLoaderEnvironment,
+ ): CompletionStage