@@ -16,19 +16,20 @@ import (
1616
1717// Config represents the YAML configuration file structure
1818type Config struct {
19- Schema string `yaml:"schema"`
20- Theme string `yaml:"theme"`
21- Name string `yaml:"name"`
22- Colors Colors `yaml:"colors"`
23- Favicon string `yaml:"favicon"`
24- Banner * Banner `yaml:"banner,omitempty"`
25- Contextual * Contextual `yaml:"contextual,omitempty"`
26- Logo * Logo `yaml:"logo,omitempty"`
27- Navbar * Navbar `yaml:"navbar,omitempty"`
28- Footer * Footer `yaml:"footer,omitempty"`
29- Integrations * Integrations `yaml:"integrations,omitempty"`
30- Redirects []Redirect `yaml:"redirects,omitempty"`
31- Navigation NavigationConfig `yaml:"navigation"`
19+ Schema string `yaml:"schema"`
20+ Theme string `yaml:"theme"`
21+ Name string `yaml:"name"`
22+ Colors Colors `yaml:"colors"`
23+ Favicon string `yaml:"favicon"`
24+ Banner * Banner `yaml:"banner,omitempty"`
25+ Contextual * Contextual `yaml:"contextual,omitempty"`
26+ Logo * Logo `yaml:"logo,omitempty"`
27+ Navbar * Navbar `yaml:"navbar,omitempty"`
28+ Footer * Footer `yaml:"footer,omitempty"`
29+ Integrations * Integrations `yaml:"integrations,omitempty"`
30+ Redirects []Redirect `yaml:"redirects,omitempty"`
31+ Navigation NavigationConfig `yaml:"navigation"`
32+ VersionsMap map [string ][]TabConfig `yaml:"-"` // Internal use only, not from YAML
3233}
3334
3435type Colors struct {
@@ -73,14 +74,16 @@ type GA4Integration struct {
7374}
7475
7576type NavigationConfig struct {
76- Tabs []TabConfig `yaml:"tabs"`
77- Global * GlobalNav `yaml:"global,omitempty"`
77+ Version string `yaml:"version,omitempty"`
78+ Tabs []TabConfig `yaml:"tabs"`
79+ Global * GlobalNav `yaml:"global,omitempty"`
7880}
7981
8082type TabConfig struct {
81- Tab string `yaml:"tab"`
82- Icon string `yaml:"icon,omitempty"`
83- Groups []GroupConfig `yaml:"groups"`
83+ Tab string `yaml:"tab"`
84+ Icon string `yaml:"icon,omitempty"`
85+ Version string `yaml:"-"` // Set internally from NavigationConfig.Version
86+ Groups []GroupConfig `yaml:"groups"`
8487}
8588
8689type GroupConfig struct {
@@ -154,9 +157,15 @@ type MintlifyNavigation struct {
154157}
155158
156159type MintlifyTab struct {
157- Tab string `json:"tab"`
158- Icon string `json:"icon,omitempty"`
159- Groups []MintlifyGroup `json:"groups"`
160+ Tab string `json:"tab"`
161+ Icon string `json:"icon,omitempty"`
162+ Versions []MintlifyVersion `json:"versions,omitempty"`
163+ Groups []MintlifyGroup `json:"groups,omitempty"`
164+ }
165+
166+ type MintlifyVersion struct {
167+ Version string `json:"version"`
168+ Groups []MintlifyGroup `json:"groups"`
160169}
161170
162171type MintlifyGroup struct {
@@ -215,7 +224,59 @@ func main() {
215224 }
216225
217226 // Process navigation tabs
227+ processedVersionedTabs := make (map [string ]bool )
228+
229+ // First, process versioned tabs
230+ for tabName , versions := range mergedConfig .VersionsMap {
231+ tab := MintlifyTab {
232+ Tab : tabName ,
233+ }
234+
235+ // Get icon from first version
236+ if len (versions ) > 0 {
237+ tab .Icon = versions [0 ].Icon
238+ }
239+
240+ // Process each version
241+ for _ , versionConfig := range versions {
242+ version := MintlifyVersion {
243+ Version : versionConfig .Version ,
244+ }
245+
246+ for _ , groupConfig := range versionConfig .Groups {
247+ group := MintlifyGroup {
248+ Group : groupConfig .Group ,
249+ }
250+
251+ // Only process explicitly defined pages
252+ if len (groupConfig .Pages ) > 0 {
253+ pages , err := processManualPages (groupConfig .Pages , groupConfig .Folder )
254+ if err != nil {
255+ fmt .Fprintf (os .Stderr , "Error processing manual pages for group %s: %v\n " , groupConfig .Group , err )
256+ continue
257+ }
258+ group .Pages = pages
259+ } else {
260+ continue
261+ }
262+
263+ version .Groups = append (version .Groups , group )
264+ }
265+
266+ tab .Versions = append (tab .Versions , version )
267+ }
268+
269+ mintlifyConfig .Navigation .Tabs = append (mintlifyConfig .Navigation .Tabs , tab )
270+ processedVersionedTabs [tabName ] = true
271+ }
272+
273+ // Then, process non-versioned tabs
218274 for _ , tabConfig := range mergedConfig .Navigation .Tabs {
275+ // Skip if already processed as versioned tab
276+ if processedVersionedTabs [tabConfig .Tab ] {
277+ continue
278+ }
279+
219280 tab := MintlifyTab {
220281 Tab : tabConfig .Tab ,
221282 Icon : tabConfig .Icon ,
@@ -266,6 +327,7 @@ func main() {
266327func mergeConfigs (configPaths []string ) (Config , error ) {
267328 var mergedConfig Config
268329 var allTabs []TabConfig
330+ versionsMap := make (map [string ][]TabConfig ) // Map of tab name -> versions
269331
270332 for i , configPath := range configPaths {
271333 configData , err := os .ReadFile (configPath )
@@ -284,12 +346,22 @@ func mergeConfigs(configPaths []string) (Config, error) {
284346 mergedConfig .Navigation .Tabs = nil // Clear tabs to rebuild
285347 }
286348
287- // Collect tabs from all files in order
288- allTabs = append (allTabs , config .Navigation .Tabs ... )
349+ // If this config has a version, group tabs by name for version support
350+ if config .Navigation .Version != "" {
351+ for _ , tab := range config .Navigation .Tabs {
352+ // Store the version on the tab config for later use
353+ tab .Version = config .Navigation .Version
354+ versionsMap [tab .Tab ] = append (versionsMap [tab .Tab ], tab )
355+ }
356+ } else {
357+ // Collect tabs from all files in order (non-versioned)
358+ allTabs = append (allTabs , config .Navigation .Tabs ... )
359+ }
289360 }
290361
291362 // Set merged tabs
292363 mergedConfig .Navigation .Tabs = allTabs
364+ mergedConfig .VersionsMap = versionsMap
293365
294366 return mergedConfig , nil
295367}
0 commit comments