code: func (b *sourceFilesystemsBuilder) createRootMappingFs(dirKey, themeFolder string) (*SourceFilesystem, error) {
  	s := &SourceFilesystem{
  		SourceFs: b.p.Fs.Source,
  	}
  
  	projectDir := b.p.Cfg.GetString(dirKey)
  	if projectDir == "" {
  		return nil, fmt.Errorf("config %q not set", dirKey)
  	}
  
  	var fromTo []string
  	to := b.p.AbsPathify(projectDir)
  
  	if b.existsInSource(to) {
  		s.Dirnames = []string{to}
  		fromTo = []string{projectVirtualFolder, to}
  	}
  
  	for _, theme := range b.p.AllThemes {
  		to := b.p.AbsPathify(filepath.Join(b.p.ThemesDir, theme.Name, themeFolder))
  		if b.existsInSource(to) {
  			s.Dirnames = append(s.Dirnames, to)
  			from := theme
  			fromTo = append(fromTo, from.Name, to)
  		}
  	}
  
  	if len(fromTo) == 0 {
  		s.Fs = hugofs.NoOpFs
  		return s, nil
  	}
  
  	fs, err := hugofs.NewRootMappingFs(b.p.Fs.Source, fromTo...)
  	if err != nil {
  		return nil, err
  	}
  
  	s.Fs = afero.NewReadOnlyFs(fs)
  
  	return s, nil
  }
docs: // Used for data, i18n -- we cannot use overlay filsesystems for those, but we need
  // to keep a strict order.