javascript – Show contents in a book chapter and sections in a highly normalized repository

I want to present books that has chapters and sections, and contents in each book, chapter and section.

This is my schema:

type BookId = string
type ChapterId = string
type SectionId = string
type ContentId = string


export type SourceId =
| ChapterId
| SectionId
| BookId


type Book = {
  id: BookId,
  name: string,
}

type Chapter = {
  id: ChapterId,
  bookId: BookId,
  name: string
}
type Section = {
  id: SectionId,
  chapterId: ChapterId,
  name: string
}

type Content = {
  id: ContentId,
  sourceId: SourceId,
  name: string,
  content: string
}

This is how I query all the books, chapters and sections:

 list() {
    return this.bookRepo.all().then(books =>
      Promise.all(books.map(book =>
        Promise.all((
          this.bookRepo.contents(book.id),
          this.bookRepo.chapters(book.id)
        )).then(((contents, chapters)) =>
          Promise.all(chapters.map(chapter =>
            Promise.all((
              this.bookRepo.contents(chapter.id),
              this.bookRepo.sections(chapter.id)
            )).then(((contents, sections)) =>
              Promise.all(sections.map(section =>
                this.bookRepo.contents(section.id).then(contents => (
                  section, contents
                ))))
                .then(sections => (chapter, contents, sections)))))
            .then(chapters => (book, contents, chapters))))));
  }

I just render as json at the moment, but the query code seems hard to maintain.