diff --git a/v2/internal/binding/binding.go b/v2/internal/binding/binding.go index 1403525e020..d8cbe439226 100644 --- a/v2/internal/binding/binding.go +++ b/v2/internal/binding/binding.go @@ -87,6 +87,24 @@ func (b *Bindings) ToJSON() (string, error) { return b.db.ToJSON() } +// addEnumsToGenerator adds unseen enums in name order for deterministic output. +func addEnumsToGenerator(w *typescriptify.TypeScriptify, packageName string, enums map[string]interface{}, seen *slicer.StringSlicer) { + sortedEnumNames := make([]string, 0, len(enums)) + for enumName := range enums { + sortedEnumNames = append(sortedEnumNames, enumName) + } + sort.Strings(sortedEnumNames) + + for _, enumName := range sortedEnumNames { + enum := enums[enumName] + fqemumname := packageName + "." + enumName + if seen.Contains(fqemumname) { + continue + } + w.AddEnum(enum) + } +} + func (b *Bindings) GenerateModels() ([]byte, error) { models := map[string]string{} var seen slicer.StringSlicer @@ -123,21 +141,7 @@ func (b *Bindings) GenerateModels() ([]byte, error) { // if we have enums for this package, add them as well var enums, enumsExist = b.enumsToGenerateTS[packageName] if enumsExist { - // Sort the enum names first to make the output deterministic - sortedEnumNames := make([]string, 0, len(enums)) - for enumName := range enums { - sortedEnumNames = append(sortedEnumNames, enumName) - } - sort.Strings(sortedEnumNames) - - for _, enumName := range sortedEnumNames { - enum := enums[enumName] - fqemumname := packageName + "." + enumName - if seen.Contains(fqemumname) { - continue - } - w.AddEnum(enum) - } + addEnumsToGenerator(w, packageName, enums, &seen) seenEnumsPackages.Add(packageName) } @@ -164,13 +168,7 @@ func (b *Bindings) GenerateModels() ([]byte, error) { w.Namespace = packageName w.WithBackupDir("") - for enumName, enum := range enumsToGenerate { - fqemumname := packageName + "." + enumName - if seen.Contains(fqemumname) { - continue - } - w.AddEnum(enum) - } + addEnumsToGenerator(w, packageName, enumsToGenerate, &seen) str, err := w.Convert(nil) if err != nil { return nil, err diff --git a/v2/internal/binding/binding_test/binding_enum_ordering_test.go b/v2/internal/binding/binding_test/binding_enum_ordering_test.go index 0939535ec62..55480e1f975 100644 --- a/v2/internal/binding/binding_test/binding_enum_ordering_test.go +++ b/v2/internal/binding/binding_test/binding_enum_ordering_test.go @@ -120,6 +120,42 @@ var EnumOrderingTest = BindingTest{ `, } +// OutstandingEnumOrderingTest tests that enums in a package without generated +// structs are also output in alphabetical order by enum name. +var OutstandingEnumOrderingTest = BindingTest{ + name: "OutstandingEnumOrderingTest", + structs: nil, + enums: []interface{}{ + // Intentionally add enums in non-alphabetical order + AllZFirstEnumValues, + AllASecondEnumValues, + AllMMiddleEnumValues, + }, + exemptions: nil, + shouldError: false, + TsGenerationOptionsTest: TsGenerationOptionsTest{ + TsPrefix: "", + TsSuffix: "", + }, + want: `export namespace binding_test { + + export enum ASecondEnum { + AValue1 = 0, + AValue2 = 1, + } + export enum MMiddleEnum { + MValue1 = 0, + MValue2 = 1, + } + export enum ZFirstEnum { + ZValue1 = 0, + ZValue2 = 1, + } + +} +`, +} + // EnumElementOrderingEnum tests sorting of enum elements by TSName type EnumElementOrderingEnum string diff --git a/v2/internal/binding/binding_test/binding_test.go b/v2/internal/binding/binding_test/binding_test.go index 41f0618ce8f..5ae92002dc6 100644 --- a/v2/internal/binding/binding_test/binding_test.go +++ b/v2/internal/binding/binding_test/binding_test.go @@ -57,6 +57,7 @@ func TestBindings_GenerateModels(t *testing.T) { DeepElementsTest, // PR #4664: Enum ordering tests EnumOrderingTest, + OutstandingEnumOrderingTest, EnumElementOrderingTest, TSNameEnumElementOrderingTest, } diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 3980b754eb6..beb74f6b0ac 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- Fixed nondeterministic generated enum ordering for enum-only packages in [#5786](https://github.com/wailsapp/wails/pull/5786) by [@Saramanda9988](https://github.com/Saramanda9988). + ## v2.13.0 - 2026-07-06 ### Added